Docker 分析(1)

Docker是我看过的第一个Go写的项目。

1. Docker 守护进程初始化流程

1.1 初始化桥接网卡

/sbin/ip route/sbin/ip link add docker0 type bridge

/sbin/ip addr add 172.16.42.1/24 dev docker0

/sbin/ip link set docker0 up

1.2 配置初始iptables

/sbin/iptables -t nat -A POSTROUTING -s 172.16.42.1/24 ! -d 172.16.42.1/24 -j MASQUERADE/sbin/iptables -t nat -D PREROUTING -m addrtype –dst-type LOCAL -j DOCKER/sbin/iptables -t nat -D OUTPUT -m addrtype –dst-type LOCAL ! –dst 127.0.0.0/8 -j DOCKER/sbin/iptables -t nat -D OUTPUT -m addrtype –dst-type LOCAL -j DOCKER/sbin/iptables -t nat -D PREROUTING -j DOCKER/sbin/iptables -t nat -D OUTPUT -j DOCKER

/sbin/iptables -t nat -F DOCKER

/sbin/iptables -t nat -X DOCKER

/sbin/iptables -t nat -N DOCKER

/sbin/iptables -t nat -A PREROUTING -m addrtype –dst-type LOCAL -j DOCKER

/sbin/iptables -t nat -A OUTPUT -m addrtype –dst-type LOCAL ! –dst 127.0.0.0/8 -j DOCKER

该步骤创建自定义的netfilter chain,并将所有到本地的流量都导入到名为DOCKER的chain进行处理。

2. 创建容器实例流程

2.1 客户端:

2.1.1 执行命令

docker run -i -t -p 8888 base  /bin/bash

2.1.2 调用守护进程rest api

2.2 守护进程:

2.2.1. 准备Rootfs

ro = [/var/lib/docker/graph/b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc/layer /var/lib/docker/graph/27cf784147099545/layer], rw = /var/lib/docker/containers/d20c06250006494e17d858428d6db3242850e75e4adf9c924abcf7f643f83a8b/rw, target = /var/lib/docker/containers/d20c06250006494e17d858428d6db3242850e75e4adf9c924abcf7f643f83a8b/rootfs

Docker容器的文件系统基于Aufs实现CopyOnWrite,rootfs目录里存镜像,rw存容器本地修改过的内容。

2.2.2 配置容器网络

1)分配容器IP地址2)配置容器桥接网卡

3)配置端口映射

/sbin/iptables -t nat -A DOCKER -p tcp –dport 49153 -j DNAT –to-destination 172.16.42.5:8888

2.3. 启动容器

2.3.1 基于LXC配置模板,动态生成LXC配置文件

2.3.2 根据docker客户端传入参数,生成lxc-start命令行参数

2.3.3 调用lxc-start启动容器,并将进程的标准输出、标准错误输出重定向到虚拟终端或者文件

/usr/bin/lxc-start, CmdArgs = lxc-start -n d20c06250006494e17d858428d6db3242850e75e4adf9c924abcf7f643f83a8b -f /var/lib/docker/containers/d20c06250006494e17d858428d6db3242850e75e4adf9c924abcf7f643f83a8b/config.lxc — /sbin/init -g 172.16.42.1 -e TERM=xterm -e HOME=/ -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin — /bin/bash

2.3.4 容器启动后,配置容器的默认路由(在容器内执行配置路由命令)

/sbin/ip route add default via 172.16.42.1

注:

1)同一台机器上的不同容器的虚拟网卡桥接到同一个虚拟的桥接网卡,即docker0接口。

2)由于Docker0接口没有桥接实际外网网口,并且docker没有修改系统默认的ip_forward内核参数(默认为0,不转发),所以默认情况下Docker容器只能访问本机和本机上的其他容器

3)本机以外的机器只能通过DNAT映射的端口号访问容器提供的服务

3. 停止容器实例

3.1客户端

3.1.1 执行命令

docker kill 7ca7b68f0a6b

3.1.2. 调用守护进程rest api

3.2 守护进程:

1)停止容器lxc-kill -n 7ca7b68f0a6bfda2e6b21385735b05966dae4b8035e28a0d3a57bd629db6a58f 92)删除DNAT映射/sbin/iptables -t nat -D DOCKER -p tcp –dport 49153 -j DNAT –to-destination 172.16.42.5:8888

这次到此为止,下篇文章讲Docker的镜像管理和API接口。

发表评论

电子邮件地址不会被公开。 必填项已用*标注