Docker 的 privileged 模式

无论是 docker 启动一个 container 还是在 k8s 中 deploy 一个 Pod 都可以指定 privileged 参数,之前在 Pod 的 spec YAML file 也里曾经用过,但是一直没有仔细想过加上这个参数后有什么不一样,今天就来研究一下。 首先来看一个最直观的对比,先运行一个没有 privileged 的容器: $ docker run --rm -it ubuntu:18.04 bash root@e6f5f42c5b7e:/# ls /dev/ console core fd full mqueue null ptmx pts root@e6f5f42c5b7e:/# fdisk -l 再来看看如果加上了 privileged 会有什么不一样: $ docker run --rm -it --privileged ubuntu:18.04 bash root@8e28f79eec9e:/# ls /dev/ tty11 tty2 tty28 tty36 tty44 tty52 tty60 ... ... root@8e28f79eec9e:/# fdisk -l Disk /dev/loop0: 97.1 MiB, 101777408 bytes, 198784 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes 不止能看到设备文件,甚至还能 mount 宿主机的文件系统, ...

2020-10-18 · Me

Orphan, Zombie and Docker

孤儿进程的产生 孤儿进程: 父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。通常,孤儿进程将被进程号为1的进程(进程号为 1 的是 init 进程)所收养,并由该进程调用 wait 对孤儿进程收尸。 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> int main() { pid_t pid; pid = fork(); if (pid == 0) { printf("I'm child process, pid:%d ppid:%d\n", getpid(), getppid()); sleep(5); printf("I'm child process, pid:%d ppid:%d\n", getpid(), getppid()); } else { printf("I'm father process, pid:%d ppid:%d\n", getpid(), getppid()); sleep(1); printf("father process is exited.\n"); } return 0; } 运行结果如下所示: I'm father process, pid:25354 ppid:13981 I'm child process, pid:25355 ppid:25354 father process is exited. I'm child process, pid:25355 ppid:1 一般来说,孤儿进程并没有什么危害,因为当孤儿进程结束的时候,init 进程会调用 wait 来处理。 但是当到了 Docker 环境下是不是还是这样呢? 本文第三节再详细说明。 ...

2019-06-16 · Me

容器化博客的编译环境

前言 在上一篇博客 从 Wordpress 到 Jekyll 中,提到了把博客从原来的 Workpress 迁移到了 Jekyll, 开始用 Markdown 语法写博客正文,用 jekyll build 生成博客内容并部署到 Web 服务器。 最近这两天在考虑把 “jekyll build” 这个过程容器化,达到传说中 一次部署到处运行 的终极目标。 :-) 目标 废话不多说,开始折腾。 首先要制定一下具体的目标: jekyll build 是将 Markdown 语法写成的纯文本文件生成 html 文件,这也是我希望将它容器化的部分,因为我并不希望再次搭建 jekyll 的环境,只要有一个稳定能用的编译环境就可以了。 生成了 html 文件以后,拷贝到 nginx 的目录下,这样就可以通过浏览器访问博客内容了,一般来说也可以将 nginx 运行在容器里面。 但是我目前在学习 nginx 源码,希望时不时的能把我修改过的 nginx 部署到博客上,因此,不容器化 nginx 。 步骤 首先去 docker hub 上找了一个可用的镜像 jekyll/jekyll,这个镜像已经部署好了一个基本的 jekyll 环境。 docker pull jekyll/jekyll:latest 然后启动这个镜像并进入到容器中。 这一步如果非常清楚需要安装哪些软件的话可以用 Dockerfile 代替完成。我在这里直接进入到容器中是因为并不清楚需要安装哪些依赖软件,需要一步一步 debug。 docker run --rm --volume=/LOCAL_DIR:/srv/jekyll -it jekyll/jekyll /bin/bash ...

2018-05-16 · Me

博客十年的变迁: 从 Wordpress 到 Jekyll

前言 印象中我的第一个博客是在大约2007年左右创建的,那个时候是个人博客非常流行的几年,各个网站都推出了自己的博客服务,如今已经是2018年,转眼间10年过去了,个人博客不如以前那么盛行了,现在流行的是微博自媒体和微信公众号。但是作为一个程序员,总觉得还是自己的博客比较 “geek”,所以一直还在折腾。 一开始的博客是建立在《电脑爱好者》网站推出的“博墅”服务上的,跟所有提供博客服务的网站一样,用户只要在网上点几下鼠标博客就建立好了。 然后就折腾更加高级的:自己买域名,买主机空间,自己建数据库,自己安装博客程序(也就是当时最流行的博客程序 WordPress)。 Wordpress 是我目前用的最长的博客系统了,从2009年左右一直到现在2018年,当初买的域名,买的主机空间,一直续费到现在,算一算有近10年了。 现在,准备把 wordpress 博客停用了,换成更 “geek” 的方式,用 Markdown 语法写内容,用 Jekyll 程序生成博客。生成的博客可以托管在 github pages 上,也可以放在云主机上。 博客源代码 博客的源码已经放在了我的 github 上,通过 github pages 服务这个博客已经可以通过浏览器访问了。 但是还是想在自己的云主机上也创建一个(太喜欢折腾了…),因此同样的一个博客内容在 xxx.github.io 上和云主机上各有一份,我的博客域名 blog.nlogn.cn 随意指向其中一个(看我心情咯)。 Ubuntu 部署 Jekyll 1. 安装 ruby sudo apt install ruby-full ruby-bundler 2. 安装 jekyll sudo gem install jekyll bundler minima 3. git clone github.io 上博客源码。 4. jekyll build 博客 jekyll build --destination /usr/local/nginx/html/myblog 自动将生成的博客部署到指定目录下。至此,一个静态博客就部署完成了。 云主机上我用的是自己编译的 nginx 服务器,通过设置 nginx 的配置文件,指定一个针对域名 “blog.nlogn.cn” 的虚拟主机,并把博客网站根目录指定为 “html/myblog” 就 OK 了。 ...

2018-03-04 · Me