Docker安装后,默认会创建下面三种网络类型:

➜  ~ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
c9e0ba5e6caa        bridge              bridge              local
c1c6888f498a        host                host                local
50a084d0ef9f        none                null                local
  • bridge:桥接网络
    默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了

  • none:无指定网络
    使用 --network=none ,docker 容器就不会分配局域网的IP

  • host: 主机网络
    使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。
    例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。

创建自定义网络:(设置固定IP)

启动Docker容器的时候,使用默认的网络是不支持指派固定IP的,所以需要创建自定义网络

创建自定义网络,并且指定网段:172.18.0.0/16,并取名为mynetwork

➜  ~ docker network create --subnet=172.18.0.0/16 mynetwork

docker中已经有4个网络了

➜  ~ docker network ls                                                                                                           
NETWORK ID     NAME        DRIVER    SCOPE
c9e0ba5e6caa   bridge      bridge    local
c1c6888f498a   host        host      local
c6e14fdaf31a   mynetwork   bridge    local
50a084d0ef9f   none        null      local

创建容器时给容器指定IP

以mysql为例

➜  ~ docker run -it --name mysql_test -e MYSQL_ROOT_PASSWORD=123456 --net mynetwork --ip 172.18.0.66 -p 3312:3306 -d 2c9028880e58
  • --net 指定网络名
  • --ip 指定ip

可以看到容器ip正是在创建时指定的ip

➜  ~ mycli -h 172.18.0.66 -uroot -p123456 -P3306                 
MySQL 
mycli 1.24.1
Home: http://mycli.net
Bug tracker: https://github.com/dbcli/mycli/issues
Thanks to the contributor - Seamile
MySQL root@172.18.0.66:(none)>
➜  ~ mycli -h 192.168.0.179 -uroot -p123456 -P3312
MySQL 
mycli 1.24.1
Home: http://mycli.net
Bug tracker: https://github.com/dbcli/mycli/issues
Thanks to the contributor - Abirami P
MySQL root@192.168.0.179:(none)> exit
Goodbye!

两种方式都可以连接容器内的mysql

  • mycli 是第三方的myql客户端工具
  • 当使用容器内ip时对应的端口也应该是容器内端口,不是映射后的宿主机端口

修改已存在的容器ip

  • 断开容器原本的网络
➜  ~ docker network disconnect mynetwork mysql_test
  • 给容器指定新的网络

    简单起见,这里使用刚才的网络,不创建新的

➜  ~ docker network connect mynetwork mysql_test --ip 172.18.0.66

--ip 可选,分配指定ip

  • 重启容器
➜  ~ docker restart mysql_test   

可以重新连接了!