在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]
毫无疑问,命名空间和资源控制是docker实现隔离的基石,因而相关的命名空间全体都有,一个也不能少:
UTS_NS [=y]
IPC_NS [=y]
USER_NS [=y]
PID_NS [=y]
NET_NS [=y]
在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]
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-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中执行命令/程序。