1、背景
在docker创建之后,容器的ip在每次重启容器后会发生变化,导致各个服务之间需要重新配置对应的ip。
2、目标
小编通过本文,希望能帮读者掌握对docker容器的网络管理,包括:
- 自定义网络,包括:网关、网段;
- 以单个容器为单位设置静态ip;
- 在不同的docker-compose服务组中实现互相访问;
3、自定义网络
大家可以通过如下的命令实现网络的创建。
3.1 查看现有网络配置
这里可以查看当前docker环境下的所有网络配置:
chenzhiwei:advanced$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9f3714d88b5c advanced_extnetwork bridge local
acc2e21d9486 bridge bridge local
2dbe91940141 host host local
b0ed8cdae1b6 none null local
上述advanced_extnetwork
就是在编排Yii容器组的时候docker-compose创建的网络;
3.2 创建新的网络
docker network create \
--subnet=172.18.0.0/16 \
--gateway=172.18.0.1 \
smart
注意:网段必须不能被其他网络占用。
3.3 删除网络
docker network rm smart
4、启动容器时指定网络
并不是所有的容器都是通过docker-compose编排的,更多的是通过docker run
的方式启动,但是我们想在这种启动方式下把容器的ip设置为指定网段下的静态ip,此时该怎么操作呢?
可以使用如下命令:
docker run -itd --name advaned_centos --network=advanced_extnetwork --ip 172.22.0.5 centos
示例如下:
在我们已经有的Yii开发容器组中单独再起一个容器,此容器的ip段需要和advanced容器组相同,如下:
chenzhiwei:advanced$ docker run -itd --name advaned_centos --network=advanced_extnetwork --ip 172.22.0.5 centos
931a767f5d1a5eca7f46e180f8be085516e68a7a11c1afb5dbc5949dd1bad713
chenzhiwei:advanced$ docker-ps
CONTAINER ID NAMES IMAGE
931a767f5d1a advaned_centos centos
03d980e76164 advanced_frontend_1 advanced_frontend
85b2502a9a48 advanced_backend_1 advanced_backend
7acacee718a5 advanced_mysql_1 mysql:5.7
chenzhiwei:advanced$ docker inspect advanced_centos | grep IPAddress
Error: No such object: advanced_centos
chenzhiwei:advanced$ docker inspect advaned_centos | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.22.0.5",
此时由于advaned_centos容器和advanced_mysql等容器是同个网段,因此可实现通信,否则是无法通信的。
5、docker-compose指定已有网络
以前我们介绍过docker-compose.yml中自定义网络,并按照这个网络创建,但是会遇到这个情况,就是在已有的容器组之外需要另外一批容器组实现服务互通,因此后创建的容器组就需要和之前创建的容器组在同一个网络里,此时docker-compose.yml应该怎么写呢?
只需要指定已有网络即可,如下:
version: '2'
services:
nginx:
image: nginx:latest
container_name: nginx
networks:
net1:
ipv4_address: 172.22.0.6
networks:
net1:
external:
name: advanced_extnetwork
此时会使用已有的advanced_extnetwork网络,实现网段统一。
关注我的微信公众号,更多文章推送不遗漏: