目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Docker网络模式与数据共享

桥接模式

桥接模式

 桥接模式是 docker 的默认网络设置,当 Docker 服务启动时,会在主机上创建一个名为 docker0 的虚拟网桥,并选择一个和宿主机不同的 IP 地址和子网分配给 docker0 网桥。

  • bridge:桥接模式
  • host:主机模式
  • none:无网络模式
1# 查看网络模式
2[root@master ~]# docker network ls
3NETWORK ID          NAME                DRIVER              SCOPE
4faa039ad2afb        bridge              bridge              local
5248060a373f7        host                host                local
6d89a824ed577        none                null                local

主机模式

主机模式

 host 模式:该模式下容器是不会拥有自己的 ip 地址,而是使用宿主机的 ip 地址和端口。

1# 主机模式启动容器(不指定网络模式,默认使用桥接模式)
2docker run -itd --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
3
4# http://192.168.31.201
5   Welcome to nginx!

none 模式

 none 模式:关闭模式,无法连接外网,一般用于测试,容器没有 ip 地址。

1docker run -itd --net=none centos:7 /bin/bash

Docker 容器间基于 Link 实现单向通信

 容器 A 需要主动与容器 B 通信,而容器 B 不需要主动与容器 A 通信。
 使用 link 可以有效解决当被依赖容器 ip 地址发生变化时,需要更改依赖容器的情况,实现了解耦。
 link 的原理是修改目标容器中的 host 文件,从而实现了对被依赖容器的解析。

 1# 启动mysql容器
 2docker run --name mydb -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
 3
 4# 启动tomcat容器并链接mysql
 5docker run -itd --name tomcat1 --link mydb tomcat:tag
 6
 7# mysql无法ping通tomcat
 8apt-get update && apt install -y iputils-ping	#安装ping命令
 9ping tomcat1  #发现无法ping通
10
11# tomcat可以通过名字的方式ping通mysql容器(使用容器名字进行通讯,有效的解决了IP地址变化的问题)
12ping mydb

Docker 容器间基于 bridge 网桥实现双向通信

 1# 查看网络模式
 2[root@master ~]# docker network ls
 3NETWORK ID          NAME                DRIVER              SCOPE
 4faa039ad2afb        bridge              bridge              local
 5248060a373f7        host                host                local
 6d89a824ed577        none                null                local
 7
 8# 创建一个新的网桥
 9[root@master ~]# docker network create -d bridge my_bridge
10
11# 启动tomcat容器
12[root@master ~]# docker run -itd -name tomcat centos:7
13
14# 启动redis容器
15[root@master ~]# docker run -itd --name redis centos:7
16
17# 将tomcat容器加入自定义网桥my_bridge
18[root@master ~]# docker network connect my_bridge tomcat
19
20# 将redis容器加入自定义网桥my_bridge
21[root@master ~]# docker network connect my_bridge redis
22
23# 分别进入两个容器中使用容器的名字去ping对方
24	发现两个容器之间可以通过容器名字进行互通

Docker 容器的特权模式介绍

1# 启动一个拥有特权模式的容器
2docker run -itd --privileged=true --name mycentos1 centos:7 /bin/bash
3
4# 进入容器
5docker exec -it ef /bin/bash
6
7# 删除网关
8route del default gw 172.17.0.1

Docker 数据共享 Volume

dockerfile 设置容器内部挂载点

 1# 新建dockerfile
 2[root@master test]# cat dockerfile 
 3FROM centos:7
 4VOLUME ["/docker/centos7/data"]
 5
 6# 构建镜像
 7[root@master centos7]# docker build -t centos:v1 .
 8
 9# 启动容器
10[root@master centos7]# docker run -itd --name centos7 centos:v1 /bin/bash
110c892b6c1735642dfbc04d8028db77d80e0e3d72c5232f2d6aa7a4244bf34bd3
12
13# 查看容器的详细信息(容器)
14# Source:容器挂载点关联到宿主机的真正目录
15# Destination:容器中的挂载点。
16[root@master centos7]# docker inspect 0c892b6c1 | grep -C 2 "Destination"
17                "Name": "f7cc685efb4ca4f1d80f4f1a86625a96ada580e30d71d684e3328cff54213bf1",
18                "Source": "/var/lib/docker/volumes/f7cc685efb4ca4f1d80f4f1a86625a96ada580e30d71d684e3328cff54213bf1/_data",
19                "Destination": "/docker/centos7/data",
20                "Driver": "local",
21                "Mode": "",
22
23# 进入容器创建文件
24[root@master centos7]# docker exec -it centos7 /bin/bash
25[root@master centos7]# docker exec -it centos7 /bin/bash
26[root@0c892b6c1735 /]# cd /docker/centos7/data/
27[root@0c892b6c1735 data]# touch 123.txt
28
29# 在宿主机查看
30[root@master _data]# ls /var/lib/docker/volumes/f7cc685efb4ca4f1d80f4f1a86625a96ada580e30d71d684e3328cff54213bf1/_data
31123.txt

创建宿主机挂载点

 1# 在宿主机创建即将要挂载到容器中的目录与文件
 2[root@master html]# pwd
 3/docker/nginx/html
 4[root@master html]# cat index.html 
 5this is docker!!!
 6
 7# 创建nginx1
 8[root@master html]# docker run -itd -p 8080:80 -v /docker/nginx/html:/usr/local/nginx/html --name nginx mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
 9a3af69b0084b5a1a868eb06461a16adcd82101c17ae817be8574f31d65fd55fe
10
11# http://192.168.31.201:8080
12 this is docker!!!

容器之间共享宿主机挂载点

 1# 容器间共享同一个容器中的挂载点(nginx为nginx2共享了它的挂载点)
 2[root@master html]# docker run -itd -p 8081:80 --volumes-from nginx  --name nginx2 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
 34958f2e410c5605cb4bab776e79cb98ec5c2e2d0c213f44cf3b3f16f0a96f2bd
 4
 5# http://192.168.31.201:8081
 6 this is docker!!!
 7
 8# 查看nginx2容器的挂载信息:发现与容器nginx完全一致。
 9[root@master html]# docker inspect nginx2 | grep -C 2 "Destination"
10                "Type": "bind",
11                "Source": "/docker/nginx/html",
12                "Destination": "/usr/local/nginx/html",
13                "Mode": "",
14                "RW": true,

作者:Soulboy