Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和DNS配置?秘诀就是它利用虚拟文件来挂载到容器的3个相关的配置文件。

进入容器内使用mount命令可以看到挂载信息,这种机制可以让宿主机DNS信息发生更新后,所有Docker容器的 dns 配置通过 /etc/resolv.conf 文件立刻得到更新。

如果用户想自行配置容器某些属性,在启动程序之中添加如下的参数即可:

1.-h HOSTNAME or --hostname=HOSTNAME 设定容器的主机名,它会被写到容器的/etc/hostname 和 /etc/hosts。
但它在容器外部看不到,既不会在docker ps中显示,也不会在其它容器的 /etc/hosts看到
2.
--dns=IP_ADDRESS 添加DNS服务器到容器的 /etc/resolv.conf中,让容器利用这个服务器来解析所有不在 /etc/hosts 中的主机名

注意:如果没有--dns选项时,Docker会默认用宿主机上的 /etc/resolv.conf 来配置容器。

容器访问控制

容器的访问控制,主要通过Linux上的 iptables 防火墙来进行管理和实现。 

容器访问外部网络[容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址,这是使用iptables 的源地址伪装操作实现的。]

容器要想访问外部网络,需要本地系统的转发支持,在linux系统中,检查转发是否打开

[root@server ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

如果为0,说明没有开启转发,则需要手动打开

[root@server ~]# sysctl -w net.ipv4.ip_forward=1

如果在启动Docker服务的时候指定 --ip-forward=true,Docker就会自动设定系统的 ip_forward 参数为1。

[root@server ~]# docker run --rm --name myCentos -it centos /bin/bash   #启动一个容器
[root@2bdfb90cb3e0 /]# ping www.baidu.com  #测试是否能够访问外部网络

容器之间访问

容器之间互相访问,需要两方面的支持。

  • 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 docker0 网桥上
  • 本地系统的 iptables 是否允许通过

默认情况下,容器之间是可以相互通信的

访问所有的端口

当启动Docker 服务时,默认会添加一条转发策略到iptables 的FORWARD链上。策略为通过(ACCEPT)还是禁止(DROP)取决于配置 --icc=true 还是 --icc=false。如果手动指定 --iptables=false 则不会添加iptables 规则。

可见,默认情况下,不同容器之间是允许网络互通的。如果是为了安全考虑,可以在/etc/default/docker 文件中配置 DOCKER_OPTS=--icc=false 来禁止它。

 

 

posted on 2020-03-28 11:13  topass123  阅读(416)  评论(0编辑  收藏  举报