• docker配置dns与容器的访问控制(6)


    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 来禁止它。

     

  • 相关阅读:
    [javaSE] 网络编程(浏览器客户端-自定义服务端)
    [javaSE] 网络编程(URLConnection)
    [javaSE] 网络编程(URL)
    [javaSE] IO流(FIle对象递归文件列表)
    tcping 与 telnet命令粗略使用
    让mysql监听ipv4
    shell脚本[] [[]] -n -z 的含义解析
    ansible的主机的默认配置部分
    MySQL备份与还原
    gunicorn 简介
  • 原文地址:https://www.cnblogs.com/topass123/p/12586352.html
走看看 - 开发者的网上家园