在《打造个人写作系统》中,使用到数据库的地方,手动指定了
172.17.0.2
,也就是mysql docker的门牌号,一旦mysql搬家(如docker重启后重新分配IP),就找不到它了。
一、前情回顾
- 创建
mysql
容器;
docker run -d \
--name=mysql \
--restart=unless-stopped \
-v /volume1/docker/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root密码 \
mysql:5.7.9
- 创建
phpmyadmin
容器,并登陆之后创建lsky
的用户和数据库;
docker run -d \
--name=phpmyadmin \
--link mysql:db \
-p 6080:80 \
phpmyadmin
- 创建兰空图床容器;
docker run -d \
--name=lskypro \
--restart unless-stopped \
--link mysql:db \
-p 37153:80 \
-v /volume1/docker/lsky:/var/www/html \
wbsu2003/lskypro
- 配置兰空图床数据库
二、原因分析
- 查看docker网络
zwenkai@KevinNAS:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
14f4171fb7bb bridge bridge local
8ff49d45c5c0 host host local
a1010b3560b1 none null local
- 查看
bridge
的详细信息
zwenkai@KevinNAS:~$ docker network inspect 14f4171fb7bb
[
{
"Name": "bridge",
"Id": "14f4171fb7bb89afe706758dbb8386f041ed1c213ac4a521588417547ea77d67",
"Created": "2022-11-19T22:03:48.523964203+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"129fc95b8239d4b5dde64d96a5410dd64c36bf3901c59c11186d1bbd1fc2be4d": {
"Name": "lskypro",
"EndpointID": "fc4501985df64fadacc88d97e1974b866e9307252e8ecca2fc506629ed1fc57b",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"2afbb614a8bd1766b9bd9328550c095887d9a236f7e547311f83df5cc5d16585": {
"Name": "mysql",
"EndpointID": "a6040eebc645b36e1f351feec7d07c75c81c1c4e65a76c1328e7d9c551b9e840",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"51374a5c15a0f29e9724b0331f2ae6b2f876e10fecdd9f46eb9a811e9b964a28": {
"Name": "phpmyadmin",
"EndpointID": "b33c96ee19342dfa64d2db0955586f40ebb6aac455580e1a883e3cd9c5ac7a64",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
可以发现,刚刚创建的三个容器都连接在bridge
模式的网络。
通过 brctl show
可以查看bridge网络相关信息,也可以看到当前有三个虚拟的网络接口连接在了docker0的网络上。
zwenkai@KevinNAS:~$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02420c368af3 no veth2c89113
vethbfd3f05
vethfd83587
- 网络模型
- 结论
创建 container
时默认使用的是 docker0
的网络,docker0
会给 container
分配 172.17.0.x
的 IP
,由于 docker0
无法指定IP
,加入其他 container
,重启docker
等操作,会重新分配IP
,就会导致指定的数据库地址无效了。
那创建一个自定义的 bridge
网络,并分配给容器是不是就OK了。
三、解决方案
3.1. 创建web_network
zwenkai@KevinNAS:~$ docker network create -d bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 web_network
3.2 更改container网络
- 解除容器绑定的网络
zwenkai@KevinNAS:~$ sudo docker network disconnect bridge mysql
- 为容器重新指定网络
zwenkai@KevinNAS:~$ sudo docker network connect --ip=172.18.0.2 web_network mysql
- 重新启动容器
zwenkai@KevinNAS:~$ sudo docker restart mysql
- 依葫芦画葫芦,再把其他几个容器网络改掉;
3.3 新建容器指定网络
后续新创建的容器也可以在创建时候就指定网络和IP,如下:
docker run -d \
--name=phpmyadmin \
-p 5657:80 \
-e PMA_ARBITRARY=1 \
--network=web_network \
--ip=172.18.0.3 \
phpmyadmin
四、总结
主要是填上之前挖的坑,整体还是比较简单的。
原创文章,作者:Kevin,如若转载,请注明出处:https://zwenkai.com/assign-ip-to-docker-container/