Docker网络模式与数据共享
桥接模式
桥接模式是docker 的默认网络设置,当Docker服务启动时,会在主机上创建一个名为docker0的虚拟网桥,并选择一个和宿主机不同的IP地址和子网分配给docker0网桥。
- bridge:桥接模式
- host:主机模式
- none:无网络模式
# 查看网络模式
[root@master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
faa039ad2afb bridge bridge local
248060a373f7 host host local
d89a824ed577 none null local
主机模式
host 模式:该模式下容器是不会拥有自己的ip地址,而是使用宿主机的ip地址和端口。
# 主机模式启动容器(不指定网络模式,默认使用桥接模式)
docker run -itd --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
# http://192.168.31.201
Welcome to nginx!
none模式
none模式:关闭模式,无法连接外网,一般用于测试,容器没有ip地址。
docker run -itd --net=none centos:7 /bin/bash
Docker容器间基于Link实现单向通信
容器A需要主动与容器B通信,而容器B不需要主动与容器A通信。
使用link可以有效解决当被依赖容器ip地址发生变化时,需要更改依赖容器的情况,实现了解耦。
link的原理是修改目标容器中的host文件,从而实现了对被依赖容器的解析。
# 启动mysql容器
docker run --name mydb -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
# 启动tomcat容器并链接mysql
docker run -itd --name tomcat1 --link mydb tomcat:tag
# mysql无法ping通tomcat
apt-get update && apt install -y iputils-ping #安装ping命令
ping tomcat1 #发现无法ping通
# tomcat可以通过名字的方式ping通mysql容器(使用容器名字进行通讯,有效的解决了IP地址变化的问题)
ping mydb
Docker容器间基于bridge网桥实现双向通信
# 查看网络模式
[root@master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
faa039ad2afb bridge bridge local
248060a373f7 host host local
d89a824ed577 none null local
# 创建一个新的网桥
[root@master ~]# docker network create -d bridge my_bridge
# 启动tomcat容器
[root@master ~]# docker run -itd -name tomcat centos:7
# 启动redis容器
[root@master ~]# docker run -itd --name redis centos:7
# 将tomcat容器加入自定义网桥my_bridge
[root@master ~]# docker network connect my_bridge tomcat
# 将redis容器加入自定义网桥my_bridge
[root@master ~]# docker network connect my_bridge redis
# 分别进入两个容器中使用容器的名字去ping对方
发现两个容器之间可以通过容器名字进行互通
Docker容器的特权模式介绍
# 启动一个拥有特权模式的容器
docker run -itd --privileged=true --name mycentos1 centos:7 /bin/bash
# 进入容器
docker exec -it ef /bin/bash
# 删除网关
route del default gw 172.17.0.1
Docker数据共享Volume
dockerfile设置容器内部挂载点
# 新建dockerfile
[root@master test]# cat dockerfile
FROM centos:7
VOLUME ["/docker/centos7/data"]
# 构建镜像
[root@master centos7]# docker build -t centos:v1 .
# 启动容器
[root@master centos7]# docker run -itd --name centos7 centos:v1 /bin/bash
0c892b6c1735642dfbc04d8028db77d80e0e3d72c5232f2d6aa7a4244bf34bd3
# 查看容器的详细信息(容器)
# Source:容器挂载点关联到宿主机的真正目录
# Destination:容器中的挂载点。
[root@master centos7]# docker inspect 0c892b6c1 | grep -C 2 "Destination"
"Name": "f7cc685efb4ca4f1d80f4f1a86625a96ada580e30d71d684e3328cff54213bf1",
"Source": "/var/lib/docker/volumes/f7cc685efb4ca4f1d80f4f1a86625a96ada580e30d71d684e3328cff54213bf1/_data",
"Destination": "/docker/centos7/data",
"Driver": "local",
"Mode": "",
# 进入容器创建文件
[root@master centos7]# docker exec -it centos7 /bin/bash
[root@master centos7]# docker exec -it centos7 /bin/bash
[root@0c892b6c1735 /]# cd /docker/centos7/data/
[root@0c892b6c1735 data]# touch 123.txt
# 在宿主机查看
[root@master _data]# ls /var/lib/docker/volumes/f7cc685efb4ca4f1d80f4f1a86625a96ada580e30d71d684e3328cff54213bf1/_data
123.txt
创建宿主机挂载点
# 在宿主机创建即将要挂载到容器中的目录与文件
[root@master html]# pwd
/docker/nginx/html
[root@master html]# cat index.html
this is docker!!!
# 创建nginx1
[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;"
a3af69b0084b5a1a868eb06461a16adcd82101c17ae817be8574f31d65fd55fe
# http://192.168.31.201:8080
this is docker!!!
容器之间共享宿主机挂载点
# 容器间共享同一个容器中的挂载点(nginx为nginx2共享了它的挂载点)
[root@master html]# docker run -itd -p 8081:80 --volumes-from nginx --name nginx2 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
4958f2e410c5605cb4bab776e79cb98ec5c2e2d0c213f44cf3b3f16f0a96f2bd
# http://192.168.31.201:8081
this is docker!!!
# 查看nginx2容器的挂载信息:发现与容器nginx完全一致。
[root@master html]# docker inspect nginx2 | grep -C 2 "Destination"
"Type": "bind",
"Source": "/docker/nginx/html",
"Destination": "/usr/local/nginx/html",
"Mode": "",
"RW": true,