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

BÌNH CHỌN:

Hãy bình chọn 5 sao nếu bạn tìm thấy nội dung hữu ích.

Xếp hạng: 0 / 5. Phiếu bầu: 0

Cảm ơn bạn đã bình chọn.

    YÊU CẦU TƯ VẤN DỊCH VỤ