Docker inside of container
Từ bản update 9 (6.0.9-2806) Parallel Cloud Server đã chính thức hỗ trợ docker trong container.
Phân bài này sẽ hướng dẫn cài đặt cũng như trình bày các giới hạn hiện tại của docker trong container với Parallels Cloud Server.
Chuẩn bị:
Server Node chạy với kernel 2.6.32-042stab105.4 hoặc mới hơn.
[root@pcs ~]# uname -r
2.6.32-042stab106.4
Kernel modules veth và bridge phải được load.
[root@pcs ~]# lsmod | awk '$1=="veth" || $1=="bridge"'
veth 4866 0
bridge 85143 0
Container phải chạy là CentOS 7 hoặc Fedora 21.
Cài đặt
Sử dụng bằng template.
Tạo container CentOS 7 hoặc Fedora 21.
[root@pcs ~]# vzctl create <CTID> --ostemplate centos-7-x86_64
Cấu hình bridged network cho container
[root@pcs ~]# vzctl set <CTID> --netif_add eth0 --save
[root@pcs ~]# vzctl set <CTID> --ifname eth0 --ipadd <IP>/<Netmask> --gw <GatewayIP> --save
Cấu hình bridged feature và full netfilter cho container.
[root@pcs ~]# vzctl set <CTID> --features bridge:on --save
[root@pcs ~]# vzctl set <CTID> --netfilter full --save
[root@pcs ~]# vzctl set <CTID> --devnodes net/tun:rw –save
Cài đặt Docker application template Node
[root@pcs ~]# yum install docker-centos-7-x86_64-ez
Cài đặt Docker template trong Container.
[root@pcs ~]# vzctl start <CTID>
[root@pcs ~]# vzpkg install <CTID> docker
Cài đặt thủ công
Tạo Container CentOS 7 hoặc Fedora 21.
[root@pcs ~]# vzctl create <CTID> --ostemplate centos-7-x86_64
Cấu hình Bridged network cho Container.
[root@pcs ~]# vzctl set <CTID> --netif_add eth0 --save
[root@pcs ~]# vzctl set <CTID> --ifname eth0 --ipadd <IP>/<Netmask> --gw <GatewayIP> --save
Cấu hình Bridged feature và full netfilter cho Container
[root@pcs ~]# vzctl set <CTID> --features bridge:on --save
[root@pcs ~]# vzctl set <CTID> --netfilter full --save
[root@pcs ~]# vzctl set <CTID> --devnodes net/tun:rw --save
Cấu hình cgroups trong system
[root@pcs ~]# vzctl mount <CTID>
[root@pcs ~]# echo "JoinControllers=cpu,cpuacct,cpuset freezer,devices" >> /vz/root/<CTID>/etc/systemd/system.conf
Chạy veth module trên Node.
[root@pcs ~]# modprobe veth
Khởi động Container.
[root@pcs ~]# vzctl start <CTID>
Cài đặt Docker trong Container.
Cài đặt Docker:
[root@docker ~]# yum -y install docker-io
Khởi động docker daemon
[root@docker ~]# service docker start
Giới Hạn.
Các giới hạn khi chạy Docker trong Container.
Chỉ hỗ trợ vfs Docker graph.
Không thể migrate các Container có Docker bên trong.
Bridged network không thể sử dụng trong Docker Container khi chạy trong PCS Container.
Vấn đề khi cài đặt Docker trong Container.
- Service Docker không thể start với lỗi inappropriate ioctl for device.
[root@docker ~]# service docker start
Redirecting to /bin/systemctl start docker.service
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.
[root@docker ~]# systemctl status docker.service
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
Active: failed (Result: exit-code) since Fri 2015-04-03 17:24:05 NOVT; 9s ago
Docs: http://docs.docker.com
Process: 544 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
Main PID: 544 (code=exited, status=1/FAILURE)
Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="+job serveapi(unix:///var/run/docker.sock)"
Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="+job init_networkdriver()"
Apr 03 17:24:05 docker.host docker[544]: inappropriate ioctl for device
Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="-job init_networkdriver() = ERR (1)"
Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="fatal" msg="inappropriate ioctl for device"
Lỗi trên là do chưa enable tính năng bridged cho Container.
[root@pcs ~]# vzctl set <CTID> --features "bridge:on" --save
Lưu ý: Container nên được restart sau khi áp dụng command trên.
Service Docker không thể start do lỗi Unable to enable network bridge NAT.
[root@docker ~]# systemctl status docker.service
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
Active: failed (Result: exit-code) since Fri 2015-04-03 17:27:17 NOVT; 3s ago
Docs: http://docs.docker.com
Process: 445 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
Main PID: 445 (code=exited, status=1/FAILURE)
Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="+job serveapi(unix:///var/run/docker.sock)"
Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="+job init_networkdriver()"
Apr 03 17:24:05 docker.host docker[544]: inappropriate ioctl for device
Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="-job init_networkdriver() = ERR (1)"
Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="fatal" msg="inappropriate ioctl for device"
Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="info" msg="+job serveapi(unix:///var/run/docker.sock)"
Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="info" msg="Listening for HTTP on unix (/var/run/docker.sock)"
Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="info" msg="+job init_networkdriver()"
Apr 03 17:27:17 docker.host docker[445]: Unable to enable network bridge NAT: iptables failed: iptables --wait -I POSTROUTING -t nat -s 172.17.42.1/16 ! -o doc...to insmod?)
Apr 03 17:27:17 docker.host docker[445]: Perhaps iptables or your kernel needs to be upgraded.
Apr 03 17:27:17 docker.host docker[445]: (exit status 3)
Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="info" msg="-job init_networkdriver() = ERR (1)"
Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="fatal" msg=" (exit status 3)"
Hint: Some lines were ellipsized, use -l to show in full.
Lỗi trên do chưa enable full netfilter .
[root@pcs ~]# vzctl set <CTID> --netfilter full --save
Lưu ý: Container nên restart lại sau khi áp dụng command trên.
- Không thể chạy Doceker Container với lỗi mountpoint for devices not found.
[root@docker ~]# docker run -i -t docker.io/centos "/bin/bash"
FATA[0027] Error response from daemon: Cannot start container 384ecb8bd892ff2e0bb45b785ffbbf9243e2d62fa9380dcf1baa9374daf138c2: mountpoint for devices not found
Lỗi trên do cgroup chưa được cấu hình.
[root@docker ~]# grep ^JoinControllers /etc/systemd/system.conf
[root@docker ~]#
Ví dụ cấu hình chính xác như sau
[root@docker ~]# grep ^JoinControllers /etc/systemd/system.conf
JoinControllers=cpu,cpuacct,cpuset freezer,devices
Để cấu hình cgroup, chạy command sau trong Container:
[root@docker ~]# echo "JoinControllers=cpu,cpuacct,cpuset freezer,devices" >> /etc/systemd/system.conf
[root@docker ~]# service docker restart
- Không thể chạy Docker Container với lỗi operation not supported.
[root@docker ~]# docker run -i -t docker.io/centos "/bin/bash"
FATA[0022] Error response from daemon: Cannot start container fa074c365b09d47050ff39d2ce9fc4af94b551a5fc33fbc1da6e8cdd52af003a: operation not supported
Lỗi trên do module veth chưa được load trên Node.
[root@pcs ~]# lsmod | grep veth
[root@pcs ~]#
Tiến hành load module veth trên Node.
[root@pcs ~]# modprobe veth
Không thể chạy Docker Container với lỗi mountpoint for devices not found.
Lỗi trên do Node PCS không hỗ trợ kernel hiện tại, kernel chỉ được hổ trợ ở version 2.6.32-042stab106.4 hoặc mới hơn.
http://kb.odin.com/en/125115