Docker实战(四)网络管理

日期:2016年04月29日 作者: 分类:运维 浏览:6520

一、Docker网络基本配置

1)默认配置

Docker服务启动时会自动创建一个 docker0 的虚拟网桥,后续新创建的容器都会有个虚拟接口连接到这个网桥:

Docker网络管理

Docker网桥会设置为NAT模式,自动分配一个网段,本机环境中docker0的地址是172.17.0.1,每个容器都会自动分配的到一个IP地址。

可以通过docker inspect redis查看名为redis容器的网络配置信息。

我们可以为 Docker 服务指定不同的网桥以及网段,这些配置都可以写在 /etc/default/docker 文件中,作为服务启动的参数。

2)配置文件 /etc/default/docker

该文件为LMDE2 操作系统中 Docker 服务启动时使用的配置文件,不同的操作系统位置会有不同。这个文件本身是个 Shell 脚本。

首先查看文件内容:

Docker网络管理

包含的项目都在上图中显示出来,我们如果要对网络进行配置,需要将必要的配置参数填入DOCKER_OPTS启动参数行。

3)修改配置文件

实验步骤如下:

  1. 删除docker0虚拟网络
  2. 创建一个新的虚拟网络mint0
  3. 配置mint0的网段为192.168.100.1/24
  4. 配置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

然后,我们开始创建一个新的虚拟网络并配置相关参数:

Docker网络管理

最后,我们根据需求去修改/etc/default/docker文件,Docker 网络常见的配置参数:
  1. -b --bridge :指定连接的网桥
  2. --bip=CIDR :指定IP地址网段
  3. --icc=true|false :是否允许容器间网络互通
  4. --ip-forward=true|false :是否允许IP转发,可以对容器的外网访问进行限制
/etc/default/docker中需要添加下面几个参数:
  1. -b=mint0 指定使用mint00
  2. --icc=false 关闭容器间互联
  3. --ip-forward=true 打开IP转发

修改后的文件内容:

Docker网络管理

记得重新启动docker服务使设置生效

Docker网络管理

二、Docker 网络访问控制

容器默认是通过docker0的NAT模式访问外部网络,如果我们希望限制容器访问,有很多种办法:

限制容器访问外网,可以关闭IP转发,设置方法是启动Docker时--ip-forward=false

sudo vim /etc/default/docker 修改配置文件:

Docker网络管理

在重启Docker服务之前,需要先清除iptables规则和/proc/下的转发配置,创建新的容器,查看配置效果:

Docker网络管理

注意: 如果有容器正在运行时重启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网络管理

四、Docker 容器互联

实验场景

设定一个场景,我们的应用包含2个容器:

  1. 容器1:Web前端服务 端口80
  2. 容器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参数为了连接容器做了哪些改变:

Docker网络管理

可以看到环境变量和/etc/hosts文件的变化,在web容器中可以ping app进行测试。

通过--link参数可以把几个容器绑定在一起,并且不需要向外部公开内部应用容器和数据库容器的端口号,只需要将对外提供服务的web服务端口80开放即可。

 

PS:本Docker实战教程系列中使用的操作系统是基于Debian的LMDE2,教程中的命令均已运行测试,如有雷同,我抄你的!!!

 

标签:

除非注明,戊辰人博客文章均为原创,转载请以链接形式标明本文地址

本文地址:https://wanglu.info/2016/04/1170.html