Docker Network命令
列出所有网络 -- docker network ls
# docker network ls
NETWORK ID NAME DRIVER SCOPE
3a7ff82cf61b bridge bridge local
81ec257be06b host host local
7d8e5912ccf5 none null local
# 网络模式简介
bridge:为每一个容器分配、设置 IP 等,并将容器连接到一个docker0虚拟网桥,默认为该模式。
host:容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
none:容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等。
container:新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
创建一个新的网络连接 -- docker network create
DRIVER指网络驱动,参考链接
# -d 选项指定DRIVER,如不指定默认bridge,最后是自定义网络名称。
docker network create -d bridge my-bridge
docker network create my-bridge # 默认bridge
# 通过docker network ls查看创建的新网络,同时通过ip a可以看到多了一张新网卡,即是刚创建的,类似于docker0
# 新建容器可直接使用--network选项加入该网络,同网络内容器可通过容器名称互相通信
docker run -tid --name test3 --network my-bridge busybox /bin/sh -c "while true;do sleep 3600;done"
# 注意:宿主机的 /etc/docker/daemon.json里别忘了设置DNS
删除一个或多个网络 -- docker network rm
# 语法
docker network rm NETWORK [NETWORK...]
# 示例,网络ID通过docker network ls查看
docker network rm 3a24 ca8d
# 如果通过某个自定义网络模式创建了容器,则该网络模式无法删除。
将已运行容器连接到网络 -- docker network connect
# 语法
docker network connect [OPTIONS] NETWORK CONTAINER
# 选项
--alias:为容器添加网络范围的别名
--ip:指定IP地址
--ip6:指定IPv6地址
--link:添加链接到另一个容器
--link-local-ip:添加容器的链接本地地址
# 示例,将test1、test2容器都添加至创建的my-bridge网络中
docker network connect my-bridge test1
docker network connect my-bridge test2
# 可以使用brctl show命令查看,同时两个容器可以互相通过容器名称建立连接了
断开容器的网络 -- docker network disconnect
# 容器必须运行才能将其与网络断开连接
# 语法
docker network disconnect [OPTIONS] NETWORK CONTAINER
-f:强制容器断开网络的连接
# 示例,把名字为test1的容器从默认bridge网络断开
docker network disconnect bridge test1
显示一个或多个网络的详细信息 -- docker network inspect
# 语法,网络名称通过docker network ls查看,使用名称或ID均可
docker network inspect NETWORK [NETWORK...]
删除所有未使用的网络 -- docker network prune
# 未使用的网络是不被任何容器引用的网络,有交互提示
docker network prune
-f:不要提示确认
端口映射
docker run的时候加入-p参数,格式为:宿主机端口:容器端口;例:-p 5000:5000
# 示例,启动一个nginx容器并将其80映射到本地80端口
docker run -d --name web -p 80:80 nginx
# docker ps命令里的PORTS列可以看到其映射关系
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a3fa1531794 nginx "/docker-entrypoint.…" 14 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
容器之间默认是如何通信和连接外网的?
安装docker后使用ip a命令可以看到本机多了一个docker0的网卡,每创建一个容器都会生成一张新的网卡。
通过brctl命令可以查看网桥关系,需要安装该命令。
yum -y install bridge-utils
brctl show
以下是创建了两个容器,可以看到这两张网卡都是连接到docker0的,通过docker0的转发实现通信,docker0在通过NAT到宿主机网卡从而连接外网。
但是通过这种默认的方式无法通过dns连接,因为容器的IP在创建时是不可知的,容器之间通过IP连接就没有保障。应该通过容器名称连建立连接。
以test1、test2两个容器为例:
# 通过link的方式将test1的网络链接到test2
docker run -tid --name test1 busybox /bin/sh -c "while true;do sleep 3600;done"
docker run -tid --name test2 --link test1 busybox /bin/sh -c "while true;do sleep 3600;done"
# 这样在test2中可以直接通过test1的名称建立连接,而无需通过IP
# docker exec -ti test2 /bin/sh
/ # ping test1
PING test1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.132 ms
...
# 但是反之test1中不能连通test2,docker也不推荐使用这种方式