为docker容器分配ip

在《打造个人写作系统》中,使用到数据库的地方,手动指定了172.17.0.2,也就是mysql docker的门牌号,一旦mysql搬家,就找不到它了。

《打造个人写作系统》中,使用到数据库的地方,手动指定了172.17.0.2,也就是mysql docker的门牌号,一旦mysql搬家(如docker重启后重新分配IP),就找不到它了。

一、前情回顾

  1. 创建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
  1. 创建phpmyadmin容器,并登陆之后创建lsky的用户和数据库;
docker run -d \
 --name=phpmyadmin \
 --link mysql:db \
 -p 6080:80 \
 phpmyadmin
  1. 创建兰空图床容器;
docker run -d \
 --name=lskypro \
 --restart unless-stopped \
 --link mysql:db \
 -p 37153:80 \
 -v /volume1/docker/lsky:/var/www/html \
 wbsu2003/lskypro
  1. 配置兰空图床数据库
为docker容器分配ip

二、原因分析

  1. 查看docker网络
zwenkai@KevinNAS:~$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
14f4171fb7bb   bridge    bridge    local
8ff49d45c5c0   host      host      local
a1010b3560b1   none      null      local
  1. 查看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
  1. 网络模型
为docker容器分配ip
  1. 结论

创建 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网络

  1. 解除容器绑定的网络
zwenkai@KevinNAS:~$ sudo docker network disconnect bridge mysql
  1. 为容器重新指定网络
zwenkai@KevinNAS:~$ sudo docker network connect --ip=172.18.0.2 web_network mysql
  1. 重新启动容器
zwenkai@KevinNAS:~$ sudo docker restart mysql
  1. 依葫芦画葫芦,再把其他几个容器网络改掉;

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/

(2)
KevinKevin
上一篇 2022年7月3日
下一篇 2023年7月15日

相关推荐

  • LskyPro企业版更新

    今天在图床网站的后台看,有新版本了,那就升级下吧。我去,竟然失败了~ 一、升级失败 在LskyPro后台的系统升级点击立即安装,提示「请安装 zip 拓展(ZipArchive)」…

    docker 2024年1月22日
    78300
  • 使用docker中ffmpeg压缩视频

    最近找了个视频教程,下载过程中我发现这些视频的体积相当大,短短十分钟的一个小节就将近1G,整体还是非常占磁盘的。那是不是可以对视频进行压缩下呢? 压缩视频很容易想到ffmpeg就可…

    docker 2024年1月14日
    76500
  • 迁移反向代理到docker中nginx

    在《打造个人写作系统》中,部署的服务都是http的,然后使用群晖提供的反向代理配置的https,其实群晖内部使用的也是nginx,是不是可以通过docker部署nginx,并配置h…

    docker 2023年7月15日
    82100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注