目录

Life in Flow

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

X

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,

作者:Soulboy