Docker 的网络功能
功能介绍
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
外部访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
-P:当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
-p:-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。
#映射所有接口地址 docker run -d -p 80:80 nginx #映射到指定地址的指定接口 docker run -d -p 127.0.0.1:80:80 nginx #映射到指定地址的任意接口 docker run -d -p 127.0.0.1:80 nginx #查看映射端口的配置 docker port 容器名称或者ID # -p 标记多次使用绑定多个端口 docker run -d -p 443:443 -p 80:80
注意:容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker还可以有一个可变的网络配置)
容器互联
容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式,该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。
虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:
- 自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叫web
- 当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器
自定义容器名,使用 --name 标记可以为容器自定义命名。
注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用 docker rm 来删除之前创建的同名容器。
在执行 docker run 的时候如果添加 --rm 标记,则容器在终止后会立刻删除。注意, --rm 和 -d 参数不能同时使用。
docker run -d --name=web -p 80:80 nginx
容器互联,使用 --link 参数可以让容器之间安全的进行交互。
#创建一个数据库容器 docker run -d --name=mysql -e MYSQL_ROOT_PASSWORD=123456 mysql #创建一个新的 web 容器,并将它连接到 db 容器 #--link 参数的格式为 --link name:alias ,其中 name 是要链接的容器的名称, alias 是这个连接的 别名。 使用 docker ps 来查 docker run -d --name=nginx -p 82:80 --link mysql:nginx-mysql nginx #检查nginx容器,查看hosts文件,记录下了mysql容器的信息 172.17.0.5 nginx-mysql 4d9879f4cba3 mysql
高级网络配置
当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。
所以Docker 所有的网络可以定制配置,可以通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
案例:
更改 docker 网桥的网段地址
vim /etc/docker/daemon.json { "bip":"192.168.100.1/24", # 更改网桥的IP地址 "registry-mirrors": [ "https://zgmke8qe.mirror.aliyuncs.com"], "insecure-registries": [ "192.168.8.77:5000"] } #重新启动docker,使配置生效 systemctl restart docker
容器访问控制
容器的访问控制,主要通过 Linux 上的 iptables 防火墙来进行管理和实现
容器访问外部网络
启动 Docker 服务的时候设定 ip-forward=true,(/etr/docker/daemon.json) Docker 就会自动设定系统的 ip_forward 参数,默认参数为 true.
容器以 nat 的方式访问互联网。
[root@localhost ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
容器之间访问
默认情况下,不同容器之间是允许网络互通的,可以在配置文件 /etc/docker/daemon.json 中禁止它。icc=false
{ "bip":"192.168.100.1/24", "registry-mirrors": [ "https://zgmke8qe.mirror.aliyuncs.com"], "insecure-registries": [ "192.168.8.77:5000"], "icc":false # 禁止容器间互相访问 }
在通过 icc=false 关闭网络访问后,还可以通过 --link=CONTAINER_NAME:ALIAS 选项来访问容器的开放端口。此设置会在 iptables 中添加规则.
管理网桥
#安装 yum install bridge-utils -y #查看 docker 网桥 [root@localhost docker]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.02420156745f no veth47144f4