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,