Docker实战(四)网络管理
一、Docker网络基本配置
1)默认配置
Docker服务启动时会自动创建一个 docker0
的虚拟网桥,后续新创建的容器都会有个虚拟接口连接到这个网桥:
Docker网桥会设置为NAT模式,自动分配一个网段,本机环境中docker0
的地址是172.17.0.1
,每个容器都会自动分配的到一个IP地址。
可以通过docker inspect redis
查看名为redis
容器的网络配置信息。
我们可以为 Docker 服务指定不同的网桥以及网段,这些配置都可以写在 /etc/default/docker
文件中,作为服务启动的参数。
2)配置文件 /etc/default/docker
该文件为LMDE2 操作系统中 Docker 服务启动时使用的配置文件,不同的操作系统位置会有不同。这个文件本身是个 Shell
脚本。
首先查看文件内容:
包含的项目都在上图中显示出来,我们如果要对网络进行配置,需要将必要的配置参数填入DOCKER_OPTS
启动参数行。
3)修改配置文件
实验步骤如下:
- 删除docker0虚拟网络
- 创建一个新的虚拟网络mint0
- 配置mint0的网段为192.168.100.1/24
- 配置Docker使用新的虚拟网络mint0
首先,删除docker0,删除前需要删除所有容器并停止Docker服务:
# 安装brctl管理工具 sudo apt-get install bridge-utils # 查看当前虚拟网络列表 sudo brctl show # 停止docker服务 sudo service docker stop # 停止docker0 sudo ip link set dev docker0 down # 删除docker0 sudo brctl delbr docker0
然后,我们开始创建一个新的虚拟网络并配置相关参数:
最后,我们根据需求去修改/etc/default/docker
文件,Docker 网络常见的配置参数:
-b --bridge
:指定连接的网桥--bip=CIDR
:指定IP地址网段--icc=true|false
:是否允许容器间网络互通--ip-forward=true|false
:是否允许IP转发,可以对容器的外网访问进行限制
在/etc/default/docker
中需要添加下面几个参数:
-b=mint0
指定使用mint00--icc=false
关闭容器间互联--ip-forward=true
打开IP转发
修改后的文件内容:
记得重新启动docker服务使设置生效
二、Docker 网络访问控制
容器默认是通过docker0的NAT模式访问外部网络,如果我们希望限制容器访问,有很多种办法:
限制容器访问外网,可以关闭IP转发,设置方法是启动Docker时--ip-forward=false
。
sudo vim /etc/default/docker
修改配置文件:
在重启Docker服务之前,需要先清除iptables规则和/proc/
下的转发配置,创建新的容器,查看配置效果:
注意: 如果有容器正在运行时重启Docker服务,所有运行的容器都会被强制停止。Docker服务重启后也不会重启被停止的容器。
限制容器间的访问
限制容器间的访问,可以设置--icc
参数,或设置iptables
参数。默认容器间可以互相访问,通过设置--icc=false
可以禁止,如果需要打开容器间访问,只需要设置--icc=true
。
此处就不作演示,需要用到限制访问功能时在此处修改参数即可。
三、Docker 容器端口映射
运行docker run
的时候可以使用-P
参数进行端口映射,这个参数不需要指定任何宿主机的端口,会自动从49000~49900
端口中选择一个映射到容器中开放的端口。
而容器中开放的端口号如何获得呢?可以写在创建镜像的Dockerfile中,关于Dockerfile下篇重点实验。
如果想指定映射端口,可以使用-p
参数,请注意一个宿主机的端口只能绑定到一个容器,如果该端口已经有进程在用则不可以绑定。并且-p
参数可以绑定多个端口:
docker run -ti -p 80:80 -p 5000:5000 --name test ubuntu
如果想映射到指定的本地地址,可以增加IP参数,比如映射到127.0.0.1
地址,只需要将参数写成 -p 127.0.0.1:6379:6379
。
四、Docker 容器互联
实验场景
设定一个场景,我们的应用包含2个容器:
- 容器1:Web前端服务 端口80
- 容器2:Redis数据库服务 端口6379
我们创建容器后,如何让这2个容器连接共同构成我们所需的Web应用服务呢?
此时我们并不想将每个容器的端口都通过映射的方式暴露出来,那么Docker又提供了怎样的方案呢?
这里需要介绍Docker强大的--link
参数,完美支持容器间互联。
实验分析
需要创建2个容器,分别根据作用命名,在创建过程中使用--link
参数让容器间建立安全的互联通道。
docker run
命令的--link
参数可以在不映射端口的前提下为两个容器间建立安全连接。--link
参数可以连接一个或多个容器到将要创建的容器。
三个容器命名为:web, redis,连接方式是web连接redis。
开始测试
docker run -d --name redis redis docker run -ti --name web --link redis:redis ubuntu /bin/bash
进入到web容器中可以查看到--link
参数为了连接容器做了哪些改变:
可以看到环境变量和/etc/hosts
文件的变化,在web容器中可以ping app
进行测试。
通过--link
参数可以把几个容器绑定在一起,并且不需要向外部公开内部应用容器和数据库容器的端口号,只需要将对外提供服务的web服务端口80开放即可。
PS:本Docker实战教程系列中使用的操作系统是基于Debian的LMDE2,教程中的命令均已运行测试,如有雷同,我抄你的!!!
除非注明,戊辰人博客文章均为原创,转载请以链接形式标明本文地址