Docker:網路及資料卷設定 [四]
一、Docker網路設定
預設情況下,docker
會建立一個橋接網絡卡[docker 0]
,docker有2種對映方式,一種是隨機對映,一種是指定對映
提示:生產場景一般不使用隨機對映
,但是隨機對映的好處就是由docker分配
,埠不會衝突
案例1:使用docker啟動nginx隨機對映
配置
[[email protected] ~]# docker run -d -P nginx 63cbe30165c8fb2ce7789a8173db6f2060705028ce6c326d1f0cd467bdee583c [[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 63cbe30165c8 nginx "nginx -g 'daemon off" 8 seconds ago Up 7 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp drunk_bhabha [[email protected] ~]# 提示:物理機的32769被對映到80埠 -P代表隨機對映
訪問
我們可以檢視我們的埠
[[email protected] ~]# netstat -lntup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 19995/mysqld tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 21574/epmd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1094/sshd tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 21557/beam tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1372/master tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 21557/beam tcp6 0 0 :::4369 :::* LISTEN 21574/epmd tcp6 0 0 :::22 :::* LISTEN 1094/sshd tcp6 0 0 ::1:25 :::* LISTEN 1372/master tcp6 0 0 :::32768 :::* LISTEN 55956/docker-proxy tcp6 0 0 :::32769 :::* LISTEN 55963/docker-proxy tcp6 0 0 :::5672 :::* LISTEN 21557/beam udp 0 0 0.0.0.0:123 0.0.0.0:* 19389/chronyd udp 0 0 127.0.0.1:323 0.0.0.0:* 19389/chronyd udp6 0 0 ::1:323 :::* 19389/chronyd
我們可以看一下iptables檢視Nat表
[[email protected] ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 2 packets, 473 bytes) pkts bytes target prot opt in out source destination 13 664 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT 2 packets, 473 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 1 packets, 76 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT 11 packets, 584 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:443 0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:80 Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 9 456 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32768 to:172.17.0.2:443 1 52 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32769 to:172.17.0.2:80
進入容器
[[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 63cbe30165c8 nginx "nginx -g 'daemon off" 6 minutes ago Up 6 minutes 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp drunk_bhabha [[email protected] ~]# ./docker_in.sh 63cbe30165c8 提示:指令碼可以檢視我們基礎介紹
提示:因為我們沒有給容器命名,所以需要使用ID進行進入
docker執行的第一程序的pid為1
[email protected]:/# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 31752 2872 ? Ss 22:53 0:00 nginx: master process nginx -g daemon off; nginx 6 0.0 0.1 32144 1908 ? S 22:53 0:00 nginx: worker process root 7 0.0 0.1 20252 1916 ? S 23:01 0:00 -bash root 11 0.0 0.0 17492 1156 ? R+ 23:01 0:00 ps aux
docker預設會使用dhcp分配IP地址,但是我們如果想訪問到需要設定iptables
[email protected]:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 22: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:2/64 scope link valid_lft forever preferred_lft forever
我們可以使用docker logs [ID/Name]
來檢視日誌
[[email protected] ~]# docker logs 63cbe30165c8 192.168.56.1 - - [19/Oct/2016:22:56:00 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0" "-" 192.168.56.1 - - [19/Oct/2016:22:56:00 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0" "-" 2016/10/19 22:56:00 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.56.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.56.11:32769" 192.168.56.1 - - [19/Oct/2016:22:56:00 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0" "-" 2016/10/19 22:56:00 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.56.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.56.11:32769"
案例2:使用docker啟動一個nginx,指定81
埠
[[email protected] ~]# docker run -d -p 192.168.56.11:81:80 --name mynginx nginx 65439bce352e712597f5a74dcf6c9978458fd02e6ed0f243fe87cad8c690d855 [[email protected] ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 65439bce352e nginx "nginx -g 'daemon off" 10 seconds ago Up 9 seconds 443/tcp, 192.168.56.11:81->80/tcp mynginx 提示: -d代表後臺執行 -p 指定埠 --name 指定名稱
訪問
通過埠對映,我們就可以非常方便的去訪問到容器內部的服務
案例3:docker 啟動對映多埠
[[email protected] ~]# docker run -d -p 443:443 -p 82:80 --name nginxv2 nginx 865aed79c5ec875c5d7a033267c9d124324201f92d66382a152d1743533a586b [[email protected] ~]# docker port nginxv2 443/tcp -> 0.0.0.0:443 80/tcp -> 0.0.0.0:82
二、Docker資料管理
Docker資料分為兩種:
資料卷: -v /data -v src:dst 資料卷容器: --volumes-from
可以將資料卷理解為掛載,可以將資料mount到docker映象中,讓我在docker映象裡寫資料時,實際寫入的是物理主機裡面。如果容器多了,不方便管
資料卷設定
案例:我們建立一個容器,起名叫nginx-volume-test
掛載到容器中的/data
目錄下
[email protected] ~]# docker run -d --name nginx-volume-time -v /data nginx
進入容器,目錄下已經有我們data目錄
[[email protected] ~]# ./docker_in.sh nginx-volume-time [email protected]:/# ls / bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
我們可以檢視當前掛載目錄
[email protected]:/# mount /dev/mapper/docker-253:0-134820964-eacae32f571b8595b10bac6c082732e75497540886e8c3ac72baa62d493a973e on / type xfs (rw,relatime,nouuid,attr2,inode64,logbsize=64k,sunit=128,swidth=128,noquota) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev type tmpfs (rw,nosuid,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666) mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime) sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime) tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (ro,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/cpuacct,cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct,cpu) cgroup on /sys/fs/cgroup/hugetlb type cgroup (ro,nosuid,nodev,noexec,relatime,hugetlb) cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio) cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/net_cls type cgroup (ro,nosuid,nodev,noexec,relatime,net_cls) cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset) /dev/mapper/centos-root on /data type xfs (rw,relatime,attr2,inode64,noquota) /dev/mapper/centos-root on /run/secrets type xfs (rw,relatime,attr2,inode64,noquota) /dev/mapper/centos-root on /etc/resolv.conf type xfs (rw,relatime,attr2,inode64,noquota) /dev/mapper/centos-root on /etc/hostname type xfs (rw,relatime,attr2,inode64,noquota) /dev/mapper/centos-root on /etc/hosts type xfs (rw,relatime,attr2,inode64,noquota) shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k) proc on /proc/asound type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/fs type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime) tmpfs on /proc/kcore type tmpfs (rw,nosuid,mode=755) tmpfs on /proc/timer_stats type tmpfs (rw,nosuid,mode=755)
提示:雖然我們不知道mount到哪裡,但是在卻有date目錄 /dev/mapper/centos-root on /data type xfs (rw,relatime,attr2,inode64,noquota)
[email protected]:/# ls bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr va
我們可以通過docker inspect
來檢視mount
的情況
[[email protected] ~]# docker inspect -f {{.Mounts}} nginx-volume-time [{a6310b873c068834dd267a94c9a8173b8a6b21f2251066218ba3deb819705d36 /var/lib/docker/volumes/a6310b873c068834dd267a94c9a8173b8a6b21f2251066218ba3deb819705d36/_data /data local true }]
mount掛載就是我們下面路徑下的內容
[[email protected] _data]# pwd /var/lib/docker/volumes/a6310b873c068834dd267a94c9a8173b8a6b21f2251066218ba3deb819705d36/_data
我們可以在這個檔案下建立一個檔案,然後在進容器中進行檢視
[[email protected] _data]# touch luoahong.txt [[email protected] _data]# ---------------------容器分割線------------------------------- [email protected]:/# ls /data/ luoahong.txt
我們還可以使用-v
指定一個卷用來作為儲存
我們可以建立一個目錄,用來指定。
[[email protected] _data]# mkdir -p /data/docker-volume-nginx [[email protected] _data]# docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data nginx b2bef96c8330583b555b576134e3f32db02050eb2bd3bb09defcfe89d4b72862 提示:-v /data/docker-volume-nginx 儲存檔案的目錄 data 容器中的目錄
檢視
[[email protected] _data]# echo "123" >>/data/docker-volume-nginx/1.txt [email protected]:/# cat /data/1.txt 123
提示:這種方法生產上會比較實用一些,但是這種方式dockerfile
裡不支援.因為這種方法不可移植
我們可以新增幾個引數
[[email protected] _data]# docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data:ro nginx # 新增ro代表只讀,可以使用只讀的方式來掛載
容器還可以掛載檔案
例如:我們掛載一個.bash_history
,掛載完並刪除
[[email protected] ~]# docker run --rm -it -v /root/.bash_history:/.bash_history nginx /bin/bash [email protected]:/# head .bash_history ifcon 現在如果我們退出這個容器就會關閉
容器資料之間同步
案例:
[[email protected] ~]# docker run -d --name nfs -v /root/nfs-data:/data nginx 30c74a55685050027316347b6de20058af3665fb87b1fd7bca14e7316e8e900e [[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30c74a556850 nginx "nginx -g 'daemon off" 4 seconds ago Up 4 seconds 80/tcp, 443/tcp nfs b2bef96c8330 nginx "nginx -g 'daemon off" 2 hours ago Up 2 hours 80/tcp, 443/tcp nginx-volume-test2 e3356d281a09 nginx "nginx -g 'daemon off" 3 days ago Up 3 days 80/tcp, 443/tcp nginx-volume-time [[email protected] ~]# docker run --rm -it --volumes-from nfs centos /bin/bash [[email protected] /]# cd /data/ [[email protected] data]# ls [[email protected] data]# touch 123456567 切換進去檢視 [[email protected] ~]# cd nfs-data/ [[email protected] nfs-data]# ls 123456567
資料卷容器
資料卷容器就是可以讓一個容器訪問另一個容器的卷,不管這個容器是否執行都可以訪問到。
資料卷容器簡單解釋就是:它可以讓這個資料在多個容器中共享
[[email protected] ~]# docker run -it --rm --name volume-test3 --volumes-from nginx-volume-test2 centos /bin/bash --volumes-from 另一個容器的名稱
此時我們可以看到根目錄下有data目錄,因為預設是沒有的
[[email protected] /]# ls /data/1.txt /data/1.txt
現在我們可以訪問到nginx-volume-test2
下面掛載的目錄,這就實現類似nfs的功能
提示:我們現在如果停掉test2
一樣可以訪問,資料卷容器還有一個好處是不管這個容器是否執行都會起作用,只要有容器在使用資料卷容器就無法刪除