多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 桥接网络 Bridge Network docker的桥接网络使用虚拟网桥,bridge网络用于同一主机上的docker容器相互通信,连接到同一个网桥的docker容器可以相互通信,当我们启动docke时,会自动创建一个默认bridge网络,除非我们进行另外的配置,新创建的容器都会自动连接到这个网络,我们也可以自定义自己的bridge网络,docker文档建议使用自定义bridge网络,默认的bridge网络具有一定的缺陷 <br> ### 相关操作命令 * #### 创建一个自定义网络 `docker network create [net-name]` * #### 实例化容器到自定义网络:`docker run --network [net-name] [CONTAINER]` * #### 运行容器加入到自定义网络`docker network connect [net-name] [CONTAINER]` * #### 离开用户自定义网络`docker network disconnect [net-name] [CONTAINER]` * #### 查看当前网络模式 `docker network ls` * #### 移除自定义网络:`docker network rm [net-name]` >[warning]*ps:移除自定义网络前先移除该网络上的所有容器* ### 实例演示:容器之间通过自定义bridge通讯 1. 创建自定义网络test-bridge ``` docker network create test-bridge ``` 2. 初始化容器mysql_bridge,加入到自定义网络test-bridge ``` docker run -d --name mysql_bridge --network test-bridge -e MYSQL_ROOT_PASSWORD=root mysql:5.7 ``` >[success]*ps:我们这里的mysql服务没有发布端口,依然可以在bridge网络内暴露使用* 3. 初始化容器redis_bridge,加入到自定义网络test-bridge中,并发布端口6397 ``` docker run -d --name redis_bridge --network test-bridge -p 16397:6397 redis:5.0 ``` 4. 检查mysql_bridge与redis_bridge网络 ``` root@ubuntu:/home/guanfuchang# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 607aa323a3a2 mysql:5.7 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 3306/tcp, 33060/tcp mysql_bridge b9b2ca3e0cff redis:5.0 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 6379/tcp, 0.0.0.0:16397->6397/tcp redis_bridge ``` 从redis容器中测试连接mysql ``` root@ubuntu:/home/guanfuchang# docker exec -it redis_bridge /bin/bash root@b9b2ca3e0cff:/data# root@b9b2ca3e0cff:/data# ping mysql_bridge PING mysql_bridge (172.19.0.3) 56(84) bytes of data. 64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=1 ttl=64 time=0.125 ms 64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=2 ttl=64 time=0.137 ms 64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=3 ttl=64 time=0.131 ms ^C --- mysql_bridge ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2043ms rtt min/avg/max/mdev = 0.125/0.131/0.137/0.005 ms root@b9b2ca3e0cff:/data# root@b9b2ca3e0cff:/data# telnet mysql_bridge 3306 Trying 172.19.0.3... Connected to mysql_bridge. Escape character is '^]'. ``` 由上面的结果可知,在redis容器中,已成功与mysql容器进行通信。 ## 宿主网络 Host Network 如果在创建容器的时候使用`--network=host`选项,那么容器会使用宿主机的网络,容器与宿主机的网络并没有隔离。 使用这种网络类型的好处就是网络性能很好,基本上跟宿主机的网络一样,它很大的弊端就是不安全。如果你的程序是用root用户运行的,有可能会通过Docker容器来控制宿主机的网络。 ``` docker run -it --network=host redis:5.0 ``` ``` root@ubuntu:/home/guanfuchang# netstat -nap | grep "6379"| grep -w LISTEN tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 31894/redis-server tcp6 0 0 :::6379 :::* LISTEN 31894/redis-server ``` ## Overlay Network overlay 网络驱动程序在多个 Docker 守护进程主机之间创建一个分布式网络(跨docker主机通信),所有连接该自定义网络的容器自动相互暴露所有端口。 ### 相关操作命令 * #### 将 Docker 守护进程初始化为 swarm manager `docker swarm init` * #### 创建overlay网络 `docker network create --driver=overlay --attachable [net-name]` * #### 加入overlay网络 `docker run --network [net-name] [CONTAINER]` * #### 加入集群 `docker swarm join [OPTIONS] HOST:PORT` * #### 离开集群 `docker swarm leave` >更多命令,请参考docker官方文档 [https://docs.docker.com/engine/reference/commandline/swarm/](https://docs.docker.com/engine/reference/commandline/swarm/) ### 实例演示:容器之间通过自定义Overlay 跨主机通讯 为了演示跨主机,我这里克隆一个虚拟机,现两个虚拟机的信息如下 | 虚拟机 | IP | 安装 | | --- | --- | --- | | ubuntu | 192.168.147.128 | redis | | ubuntu_copy1 | 192.168.147.130 | mysql | 1. 在128上初始化集群 ``` docker swarm init ``` ![](https://box.kancloud.cn/c31515e98e5432fcb07322197be5d298_1234x156.png) 2. 在128上查看当前节点 ``` docker node ls ``` ![](https://box.kancloud.cn/ecaea24e3a4de87aa5d647cef26de83e_1137x66.png) 3. 在128上创建overlay network ``` docker network create --driver=overlay --attachable test-overlay ``` ![](https://box.kancloud.cn/b6b6490d786bc32febce150e7734104e_916x204.png) 4. 在128上实例redis容器,并加入overlay 网络 ``` docker run -tid --name redis_overlay --network test-overlay redis:5.0 ``` ![](https://box.kancloud.cn/db4e9fe9e5d664ec8428ebfb5590adaa_1252x121.png) 5. 在130中,加入集群 ``` docker swarm join --token SWMTKN-1-32pd1ytuwho780hrehx8687y4s54g0fvhf4sh8tx8ea1qp9a6g-9foali4ph3tm0xn5vmu0emomd 192.168.147.128:2377 ``` >[warning] 如果不记得token了,可以在128上执行命令 > docker swarm join-token worker 即可显示加入集群的命令 6. 在130上实例mysql容器,并加入overlay网络 ``` docker run -tid --name mysql_overlay --network test-overlay -e MYSQL_ROOT_PASSWORD=root mysql:5.6 ``` ![](https://box.kancloud.cn/3ca0331c04af2679254939e8f197a8c9_1277x261.png) 7. 从128中redis容器中测试连接130中的mysql容器 ``` docker exec -it redis_overlay /bin/bash ``` ``` telnet mysql_overlay 3306 ``` ![](https://box.kancloud.cn/07794c5391d388ea9c7583ce0db94443_507x95.png) 到这里,已经说明通过加入overlay网络,在两个主机的两个容器之间可以实现通信了。 >如果容器内telnet命令不存在,在容器内先更新apt,然后安装telnet即可 ```apt update``` ```apt install telnet``` --- :-: ![](https://box.kancloud.cn/331f659e8e6cddb0d9f182e00e32803f_258x258.jpg) <span style="color: #993366;"><em>***<span style="text-decoration: underline;"><span style="text-decoration: underline;">微信扫一扫,关注&ldquo;python测试开发圈&rdquo;,了解更多测试教程!!</span></span>***</em></span>