https://www.jianshu.com/p/22a7032bb7bd

实现原理

想要实现容器之间相互通信/访问外部网络,就需要配置容器的网络。

(Docker使用Linux桥接(在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器)

docker创建topic docker创建网络的命令_redis

默认网络Bridge

docker创建topic docker创建网络的命令_docker_02

Docker 自定义网络

这样子我们就可以指定那些容器之间可以相互通信了

(建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Overlay或Macvlan网络。你还可以创建一个网络插件或远程网络进行完整的自定义和控制。

你可以根据需要创建任意数量的网络,并且可以在任何给定时间将容器连接到这些网络中的零个或多个网络。此外,您可以连接并断开网络中的运行容器,而无需重新启动容器。当容器连接到多个网络时,其外部连接通过第一个非内部网络以词法顺序提供。)

docker创建topic docker创建网络的命令_docker_03

1、创建自定义网络
docker network create -d bridge --subnet 172.25.0.0/16 network_name

2、redis docker 添加到网络
docker run  -it -v /myredis/etc/redis/redis.conf:/usr/etc/redis/redis.conf --network=network_name -p xxx:6379 --restart always --name myredis -d redis redis-server /usr/etc/redis/redis.conf

3、mongo docker 添加到网络
docker run -it -v $PWD/db:/data/db --network=network_name -p xxx:21017 --name mymongo -d mongo

4、自己项目docker 添加到网络
docker run -it --network=network_name --name project_name -p xxx:3001 -d project_name:lastest

新创建网络

docker创建topic docker创建网络的命令_linux_04

问题:为啥nginx指定网络就直接会退出的???

docker创建topic docker创建网络的命令_docker_05

正确:docker run -it -d --name edc-nginx20 --net network_test nginx

错误:docker run -it -d --name edc-nginx20 nginx --net network_test

镜像要放在最后面