一、Docker基础网络介绍
1、外部访问容器
想要使容器外访问容器中的网络应用,可以添加-P或-p参数来完成端口映射
-P标记时,随机映射一个端口到容器开放的网络端口
-p标记时,则指定映射端口,且一个指定端口只能绑定一个容器,支持的格式:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
其中,使用hostPort:containerPort
格式,则时绑定本地该端口所有接口上的所有地址。
使用ip:hostPort:containerPort
格式,将映射到指定地址的指定端口。
使用ip:hostPort:containerPort
格式,将映射到指定地址的任意端口。
默认绑定为tcp端口,若要指定udp端口,可以使用/udp 标记,例如127.0.0.1:80:80/udp
查看端口映射情况可以使用 docker container ls -l ,如下所示表示本地主机49153映射到容器80端口
查看当前映射端口配置使用docker port,若要看指定端口,则docker port 容器名 端口号
2、容器互联
第一步 新建docker 网络,-d指定网络类型
docker network create -d bridge my-net
第二部 运行容器并连接到刚才新建的网络中【注意:运行不同容器连接到网络时,要使用不同终端】
docker run -it --rm --name deng2 --network my-net busybox sh
新建了两个容器后查看,并且可以在不同容器中使用ping来测试连接:
3、配置DNS
Docker
利用虚拟文件来挂载容器的 3个相关配置文件,在容器中使用mount可以看挂在信息。
/etc/resolv.conf是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,也可以在/etc/docker/daemon.json中进行所有容器的配置。
在docker run命令启动容器时也可以使用-h HOSTNAME
或者--hostname=HOSTNAME
设定容器的主机名,对应的会被写到容器内的/etc/hostname 和 /etc/hosts。--dns=IP_ADDRESS
添加 DNS 服务器到容器的/etc/resolv.conf
中。--dns-search=DOMAIN
设定容器的搜索域。
二、Dokcer的网络模式
通过docker network ls
查看网络,默认会创建三种默认。其中my-net是自己创建的。
各网络模式的含义【具体介绍参考https://juejin.cn/post/6868086876751085581】:
三、高级网络配置
一些快速命令,其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
-b BRIDGE
或--bridge=BRIDGE
指定容器挂载的网桥--bip=CIDR
定制docker0
的掩码-H SOCKET...
或--host=SOCKET... Docker
服务端接收命令的通道--icc=true|false
是否支持容器之间进行通信--ip-forward=true|false
请看下文容器之间的通信--iptables=true|false
是否允许 Docker 添加iptables
规则--mtu=BYTES
容器网络中的MTU
下面2个命令选项既可以在启动服务时指定,也可以在启动容器时指定。在 Docker服务启动的时候指定则会成为默认值,后面执行 docker run
时可以覆盖设置的默认值。
--dns=IP_ADDRESS...
使用指定的DNS服务器--dns-search=DOMAIN...
指定DNS搜索域
最后这些选项只有在 docker run
执行时使用,因为它是针对容器的特性内容。
-h HOSTNAME
或--hostname=HOSTNAME
配置容器主机名--link=CONTAINER_NAME:ALIAS
添加到另一个容器的连接--net=bridge|none|container:NAME_or_ID|host
配置容器的桥接模式-p SPEC
或 --publish=SPEC` 映射容器端口到宿主主机-P or --publish-all=true|false
映射容器所有端口到宿主主机
1、容器访问控制
通过iptables防火墙进行管理与实现。
1.1 容器访问外部网络
需要本地转发支持实现外部网络的访问,通过以下命令检查转发是否打开,如果为0则需要手动打开
#检查命令
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
#手动打开命令
sysctl -w net.ipv4.ip_forward=1
如果在启动 Docker 服务的时候设定 --ip-forward=true
, Docker 就会自动设定系统的 ip_forward
参数为 1。
1.2 容器之间访问
实现容器之间互相访问,要满足以下两点支持。
- 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到
docker0
网桥上。 - 本地系统的防火墙软件
-- iptables
是否允许通过。 - 默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在
/etc/docker/daemon.json
文件中配置{"icc": false}
来禁止它。
1.3 访问端口
关闭网络访问后,在启动容器时可以使用 --link=CONTAINER_NAME:ALIAS
选项来访问容器的开放端口。之后在iptable中为两个容器添加一条 ACCEPT
规则,允许相互访问开放的端口。
2 端口映射
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
使用以下命令查看主机NAT规则,其中所有源地址在172.17.0.0/16网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。
$ sudo iptables -t nat -nL
...
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
...
容器访问外部网络时,原地址会被NAT成本地系统的IP地址
容器若要运行外部访问,可以在 docker run
时候通过 -p
或 -P
参数来启用。
如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 /etc/docker/daemon.json
中添加如下内容。
{
"ip": "固定ip"
}
3 自定义网桥
在启动 Docker 服务的时候,使用 -b BRIDGE
或--bridge=BRIDGE
来指定使用的网桥。
如果服务已经运行,那需要先停止服务,并删除旧的网桥。
$ sudo systemctl stop docker
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
然后创建一个网桥 bridge0
。
$ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up
查看确认网桥创建并启动。
在 Docker 配置文件 /etc/docker/daemon.json
中添加如下内容,即可将 Docker 默认桥接到创建的网桥上。
{
"bridge": "bridge0",
}
启动 Docker 服务。
新建一个容器,可以看到它已经桥接到了 bridge0
上。
可以继续用 brctl show
命令查看桥接的信息。另外,在容器中可以使用 ip addr
和 ip route
命令来查看 IP 地址配置和路由信息。