Docker 网络及数据卷设置 [三]html
Docker
时间:2016年11月8日
node
默认状况下,docker
会建立一个桥接网卡[docker 0]
,docker有2种映射方式,一种是随机映射,一种是指定映射mysql
提示:生产场景通常不使用随机映射
,可是随机映射的好处就是由docker分配
,端口不会冲突linux
随机映射
配置[root@linux-node1 ~]# docker run -d -P nginx63cbe30165c8fb2ce7789a8173db6f2060705028ce6c326d1f0cd467bdee583c[root@linux-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES63cbe30165c8 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[root@linux-node1 ~]#提示:物理机的32769被映射到80端口-P表明随机映射
访问
咱们能够查看咱们的端口nginx
[root@linux-node1 ~]# netstat -lntupActive 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表sql
[root@linux-node1 ~]# iptables -t nat -vnLChain 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 LOCALChain 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 LOCALChain 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:80Chain 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:4431 52 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32769 to:172.17.0.2:80
进入容器docker
[root@linux-node1 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES63cbe30165c8 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[root@linux-node1 ~]# ./docker_in.sh 63cbe30165c8提示:脚本能够查看咱们基础介绍
提示:由于咱们没有给容器命名,因此须要使用ID进行进入centos
docker运行的第一进程的pid为1
bash
root@63cbe30165c8:/# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 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 proce***oot 7 0.0 0.1 20252 1916 ? S 23:01 0:00 -bashroot 11 0.0 0.0 17492 1156 ? R+ 23:01 0:00 ps aux
docker默认会使用dhcp分配IP地址,可是咱们若是想访问到须要设置iptables
网络
root@63cbe30165c8:/# ip a1: 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 forever22: eth0@if23: <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]
来查看日志
[root@linux-node1 ~]# docker logs 63cbe30165c8192.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"
81
端口[root@linux-node1 ~]# docker run -d -p 192.168.56.11:81:80 --name mynginx nginx65439bce352e712597f5a74dcf6c9978458fd02e6ed0f243fe87cad8c690d855[root@linux-node1 ~]# docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES65439bce352e nginx "nginx -g 'daemon off" 10 seconds ago Up 9 seconds 443/tcp, 192.168.56.11:81->80/tcp mynginx提示: -d表明后台运行 -p 指定端口 --name 指定名称
访问
经过端口映射,咱们就能够很是方便的去访问到容器内部的服务
[root@linux-node1 ~]# docker run -d -p 443:443 -p 82:80 --name nginxv2 nginx865aed79c5ec875c5d7a033267c9d124324201f92d66382a152d1743533a586b[root@linux-node1 ~]# docker port nginxv2443/tcp -> 0.0.0.0:44380/tcp -> 0.0.0.0:82
Docker数据分为两种:
数据卷: -v /data -v src:dst数据卷容器: --volumes-from
能够将数据卷理解为挂载,能够将数据mount到docker镜像中,让我在docker镜像里写数据时,实际写入的是物理主机里面。若是容器多了,不方便管理
案例:咱们建立一个容器,起名叫nginx-volume-test
挂载到容器中的/data
目录下
root@linux-node1 ~]# docker run -d --name nginx-volume-time -v /data nginx
进入容器,目录下已经有咱们data目录
[root@linux-node1 ~]# ./docker_in.sh nginx-volume-timeroot@e3356d281a09:/# ls /bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
咱们能够查看当前挂载目录
root@e3356d281a09:/# 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)
root@e3356d281a09:/# lsbin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
咱们能够经过docker inspect
来查看mount
的状况
[root@linux-node1 ~]# docker inspect -f ``.`Mounts` nginx-volume-time[{a6310b873c068834dd267a94c9a8173b8a6b21f2251066218ba3deb819705d36 /var/lib/docker/volumes/a6310b873c068834dd267a94c9a8173b8a6b21f2251066218ba3deb819705d36/_data /data local true }]
mount挂载就是咱们下面路径下的内容
[root@linux-node1 _data]# pwd/var/lib/docker/volumes/a6310b873c068834dd267a94c9a8173b8a6b21f2251066218ba3deb819705d36/_data
咱们能够在这个文件下建立一个文件,而后在进容器中进行查看
[root@linux-node1 _data]# touch abcdocker.txt[root@linux-node1 _data]#---------------------容器分割线-------------------------------root@e3356d281a09:/# ls /data/abcdocker.txt
咱们还可使用-v
指定一个卷用来做为存储
咱们能够建立一个目录,用来指定。
[root@linux-node1 _data]# mkdir -p /data/docker-volume-nginx[root@linux-node1 _data]# docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data nginxb2bef96c8330583b555b576134e3f32db02050eb2bd3bb09defcfe89d4b72862提示:-v /data/docker-volume-nginx 存储文件的目录 data 容器中的目录
查看
[root@linux-node1 _data]# echo "123" >>/data/docker-volume-nginx/1.txtroot@b2bef96c8330:/# cat /data/1.txt 123
提示:这种方法生产上会比较实用一些,可是这种方式dockerfile
里不支持.由于这种方法不可移植
咱们能够添加几个参数
[root@linux-node1 _data]# docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data:ro nginx# 添加ro表明只读,可使用只读的方式来挂载
容器还能够挂载文件
.bash_history
,挂载完并删除[root@linux-node1 ~]# docker run --rm -it -v /root/.bash_history:/.bash_history nginx /bin/bashroot@63ed2c5eef1c:/# head .bash_history ifcon如今若是咱们退出这个容器就会关闭
同步
案例:[root@linux-node1 ~]# docker run -d --name nfs -v /root/nfs-data:/data nginx 30c74a55685050027316347b6de20058af3665fb87b1fd7bca14e7316e8e900e[root@linux-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES30c74a556850 nginx "nginx -g 'daemon off" 4 seconds ago Up 4 seconds 80/tcp, 443/tcp nfsb2bef96c8330 nginx "nginx -g 'daemon off" 2 hours ago Up 2 hours 80/tcp, 443/tcp nginx-volume-test2e3356d281a09 nginx "nginx -g 'daemon off" 3 days ago Up 3 days 80/tcp, 443/tcp nginx-volume-time[root@linux-node1 ~]# docker run --rm -it --volumes-from nfs centos /bin/bash[root@1a29a9cdffdf /]# cd /data/[root@1a29a9cdffdf data]# ls[root@1a29a9cdffdf data]# touch 123456567切换进去查看[root@linux-node1 ~]# cd nfs-data/[root@linux-node1 nfs-data]# ls123456567
数据卷容器就是可让一个容器访问另外一个容器的卷,无论这个容器是否运行均可以访问到。
数据卷容器简单解释就是:它可让这个数据在多个容器中共享
[root@linux-node1 ~]# docker run -it --rm --name volume-test3 --volumes-from nginx-volume-test2 centos /bin/bash--volumes-from 另外一个容器的名称
此时咱们能够看到根目录下有data目录,由于默认是没有的
[root@f06ca39d6090 /]# ls /data/1.txt /data/1.txt
如今咱们能够访问到nginx-volume-test2
下面挂载的目录,这就实现相似nfs的功能
提示:咱们如今若是停掉test2
同样能够访问,数据卷容器还有一个好处是无论这个容器是否运行都会起做用,只要有容器在使用数据卷容器就没法删除
请继续关注我!