Docker 网络及数据卷设置 [三]

默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射.生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突

Docker 网络及数据卷设置 [三]

Docker

时间:2016年11月8日

博客:www.abcdocker.com

微信公众号:abcdocker

笔者QQ:381493251

Abcdocker交流群:454666672

如果遇到什么问题可以进群询问,我们是一个乐于帮助的集体!

一、Docker网络设置

默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射

提示:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突

案例1:使用docker启动nginx随机映射配置

[root@linux-node1 ~]# docker run -d -P nginx
63cbe30165c8fb2ce7789a8173db6f2060705028ce6c326d1f0cd467bdee583c
[root@linux-node1 ~]# 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
[root@linux-node1 ~]#

提示:物理机的32769被映射到80端口
-P代表随机映射

访问

1.png-48.8kB

我们可以查看我们的端口

[root@linux-node1 ~]# 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表

[root@linux-node1 ~]# 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

进入容器

[root@linux-node1 ~]# 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
[root@linux-node1 ~]# ./docker_in.sh 63cbe30165c8
提示:脚本可以查看我们基础介绍

提示:因为我们没有给容器命名,所以需要使用ID进行进入

docker运行的第一进程的pid为1

root@63cbe30165c8:/# 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

root@63cbe30165c8:/# 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: 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 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端口

[root@linux-node1 ~]# docker run -d -p 192.168.56.11:81:80 --name mynginx nginx
65439bce352e712597f5a74dcf6c9978458fd02e6ed0f243fe87cad8c690d855
[root@linux-node1 ~]# 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 指定名称

访问

2.png-42.4kB

通过端口映射,我们就可以非常方便的去访问到容器内部的服务

案例3:docker 启动映射多端口

[root@linux-node1 ~]# docker run -d -p 443:443 -p 82:80 --name nginxv2 nginx
865aed79c5ec875c5d7a033267c9d124324201f92d66382a152d1743533a586b
[root@linux-node1 ~]# 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目录下

root@linux-node1 ~]# docker run -d --name nginx-volume-time -v /data nginx

进入容器,目录下已经有我们data目录

[root@linux-node1 ~]# ./docker_in.sh nginx-volume-time
root@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:/# ls
bin  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 nginx
b2bef96c8330583b555b576134e3f32db02050eb2bd3bb09defcfe89d4b72862

提示:-v /data/docker-volume-nginx 存储文件的目录
   data   容器中的目录

查看

[root@linux-node1 _data]# echo "123" >>/data/docker-volume-nginx/1.txt
root@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/bash
root@63ed2c5eef1c:/# head .bash_history 
ifcon
现在如果我们退出这个容器就会关闭

3.png-60.2kB

容器数据之间同步案例:

[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                                      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

[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]# ls
123456567

数据卷容器

数据卷容器就是可以让一个容器访问另一个容器的卷,不管这个容器是否运行都可以访问到。

数据卷容器简单解释就是:它可以让这个数据在多个容器中共享

[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 一样可以访问,数据卷容器还有一个好处是不管这个容器是否运行都会起作用,只要有容器在使用数据卷容器就无法删除

请继续关注我们!

weixin.gif-425.6kB

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
abcdocker运维博客
Docker
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论
网站搭建
加入我们
  • 站长QQ:381493251一键联系
  • abcdocker 微信公众号
    abcdocker QQ群