docker的内核依赖与简单构建

一、内核配置

1.1 iptables网络相关

  在dockerd启动时会使用iptables配置一些网络规则,如地址伪装、端口映射等等,同时默认情况下还会创建虚拟网桥和VETH设备,这些依赖的内核配置如下:

NF_NAT_REDIRECT [=y] 
NETFILTER_XT_TARGET_NETMAP [=y] 
NETFILTER_XT_TARGET_REDIRECT [=y] 
NETFILTER_XT_MATCH_CONNTRACK [=y] 
NETFILTER_XT_MATCH_ADDRTYPE [=y]  /* iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER */
/*
 * CONFIG_XFRM_USER和CONFIG_XFRM_ALGO模块,否则可能会出现
 * “could not create netlink handle on initial namespace: protocol not supported”错误
*/
CONFIG_XFRM_USER=y	
CONFIG_XFRM_ALGO=y	
IP_NF_TARGET_MASQUERADE [=y]
BRIDGE [=y]  				/* brctl 创建网桥 */
VETH [=y] 

1.2  命名空间

  毫无疑问,命名空间和资源控制是docker实现隔离的基石,因而相关的命名空间全体都有,一个也不能少:

UTS_NS [=y]
IPC_NS [=y]
USER_NS [=y]
PID_NS [=y] 
NET_NS [=y]

1.3  cgroup控制组

  在1.2中已经提到,资源控制是docker的基础,在dockerd启动过程就需要cpuset,cpu,cpuacct,blkio,memory,devices,freezer,pids保证各个控制组已经挂载完成。

NF_NAT_REDIRECT [=y] 
NETFILTER_XT_TARGET_NETMAP [=y] 
NETFILTER_XT_TARGET_REDIRECT [=y] 
NETFILTER_XT_MATCH_CONNTRACK [=y] 
NETFILTER_XT_MATCH_ADDRTYPE [=y]  /* iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER */
/*
 * CONFIG_XFRM_USER和CONFIG_XFRM_ALGO模块,否则可能会出现
 * “could not create netlink handle on initial namespace: protocol not supported”错误
*/
CONFIG_XFRM_USER=y	
CONFIG_XFRM_ALGO=y	
IP_NF_TARGET_MASQUERADE [=y]
BRIDGE [=y]  				/* brctl 创建网桥 */
VETH [=y] 

1.4 文件系统

  Docker不支持Host端采用ramfs文件系统,Host端使用ext作为根文件系统一般都可以让docker很好的工作。如果根文件系统使用ext3或者ext4,则需要确保:

CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
内核配置。

否则在docker build创建镜像时可能会出现:

DEBU[0949] Failed to unmount aa5e00e89bb6747e8daa327919fd781373cb1da8b321f99619cb849426ee3e39-init overlay: no such file or directory 
这样的错误。




二、Docker组件

  从docker-1.11开始docker daemon被拆分为dockerd, containerd和runc等多个模块以适应OCI(Open Container Initiative)标准。OCI的目标是为了避免容器的生态分裂为“小生态王国”,确保一个引擎上构建的容器可以运行在其他引擎之上。这是实现容器可移植性至关重要的部分。

  目前docker中有docker, docker-containerd, docker-containerd-shim,和docker-runc四个组件,可以通过 ps aux | grep docker来查看这些组件进程。Docker引擎管理镜像,然后移交给containerd运行,containerd再使用runC运行容器。

三、基础镜像制作

  容器构建在镜像基础之上,所以在创建/启动容器前需要准备好镜像。

  最基础的镜像可以通过 docker的scratch镜像模版 Dockerfile+ 内存文件系统(通过busybox编译制作而成)  制作一个属于我们自己的基础镜像。

  内存文件系统这里就不介绍了,假设通过busybox制作的内存文件系统打包成压缩文件 busybox.tar.bz2,通过下面的步骤就可以创建出基础镜像了:

  1 创建Dockerfile文件,文件内容如下:

FROM scratch  
ADD busybox.tar.bz2 ./  
CMD ["sh"] 
  2 通过docker build命令创建基础镜像:
# docker build --tag base -f /home/warmbobo/Dockerfile .
  这样我们以busybox.tar.bz2为基础创建了一个tag为base的镜像,可以通过 docker images 看到我们新创建的镜像。

四、容器的创建与启动

  有了镜像之后,我们就可以创建我们的容器了。

  1 利用前面创建base镜像构建一个简单的容器container

docker create --name container -it /bin/sh
  2 启动容器container
docker start container
  这样我们就创建/启动了一个简单的容器container,我们可以通过docker ps 观察容器的运行;另外还可以通过 docker exec container $commands 在容器container中执行命令/程序。


你可能感兴趣的:(容器)