• Docker技术入门与实战 第二版-学习笔记-8-网络功能network-2-相应配置


    1) 快速配置指南(详细使用下面会讲)

    其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效

    下面2个命令选项既可以在启动服务时指定,也可以 Docker 容器启动(docker run )时候指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行docker run时可以覆盖设置的默认值。

     

    最后这些选项只有在 docker run执行时使用,因为它是针对容器的特性内容:

    2) 配置 DNS

    怎么自定义配置容器的主机名和 DNS 配置呢? 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件:

    • /etc/resolv.conf : 记录了容器的配置信息
    • /etc/hostname : 记录了容器的主机名
    • /etc/hosts : 默认只记录了容器自身的一些地址和名称
    这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 /etc/resolv.conf文件立刻得到更新。

    如果用户想要手动指定容器的配置,可以利用下面的选项:

    • -h HOSTNAME 或 --hostname = HOSTNAME :设定容器的主机名,它会被写到容器内的/etc/hostname 和 /etc/hosts中。但它在容器外部看不到,既不会在docker ps中显示,也不会在其他的容器的 /etc/hosts看到
    • --links = CONTAINER_NAME:ALIAS 选项会在创建容器的时候,添加一个其他容器的主机名到/etc/hosts文件中,让新的容器的进程可以使用主机名ALIAS就可以连接它
    •  --dns = IP_ADDRESS : 添加DNS服务到容器的/etc/resolv.conf中,让容器用这个服务器来解析所有不在/etc/hosts上的主机名
    •  --dns-search = DOMAIN : 设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时,DNS不仅搜索host,还会搜索host.example.com。注意,如果没有上述最后的两个选项,Docker会默认主机上的/etc/resolv.conf来配置容器

     

    在容器中使用 mount 命令可以看到挂载信息,在之前连接的是host网络的ubuntu6容器上运行:

    userdeMBP:~ user$ docker exec -it ubuntu6 /bin/bash
    root@linuxkit-025000000001:/# mount
    ...
    /dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
    /dev/sda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
    /dev/sda1 on /etc/hosts type ext4 (rw,relatime,data=ordered)
    ...

    1.查看其/etc/resolv.conf内容:

    root@linuxkit-025000000001:/# cat /etc/resolv.conf 
    # This file is included on the metadata iso
    nameserver 192.168.65.1  // 相当于运行docker run时使用--dns=192.168.65.1
    domain lan  //表示局域网,相当于运行docker run时使用--dns-search=lan

    ⚠️如果是直接手动对/etc/resolv.conf进行更改,那么再次重启时,里面更改的内容就会恢复原状,希望不回复的方法就是在run时使用-dns--dns-search参数来设置

    此时任意打开一个连接的是自定义的bridge——myNetwork2的ubuntu7容器,查看它的/etc/resolv.conf配置文件,可以看见,和上面的内容是相同的

    这是因为创建容器时,默认会与宿主机的/etc/resolv.conf内容保持一致

    2.查看其/etc/hosts内容:

    root@linuxkit-025000000001:/# cat /etc/hosts       
    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters 

    当我们使用--link=container:alias参数连接了其他容器的话,该文件中就会出现连接容器的ip地址,如下面是容器ubuntu7没有连接其他容器前文件的内容:

    root@8eef1c93a7d4:/# vi /etc/hosts
    
    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.20.11.2     8eef1c93a7d4

    ⚠️设置了alias的好处是:重启容器IP变化时,别名alias正常使用

    然后后面打开另一个容器ubuntu8,让其通过--link连接了容器db,然后就能够在/etc/hosts中看见db的信息:

    userdeMBP:~ user$ docker run -it --name ubuntu8 --link db:db ubuntu:14.04 /bin/bash
    root@1f6456e5fbfd:/# cat /etc/hosts
    127.0.0.1    localhost
    ::1    localhost ip6-localhost ip6-loopback
    fe00::0    ip6-localnet
    ff00::0    ip6-mcastprefix
    ff02::1    ip6-allnodes
    ff02::2    ip6-allrouters
    172.17.0.4    db 2fca948912dc
    172.17.0.5    1f6456e5fbfd

    就能够使用容器db的名字ping通它了:

    root@1f6456e5fbfd:/# ping -c 3 db
    PING db (172.17.0.4) 56(84) bytes of data.
    64 bytes from db (172.17.0.4): icmp_seq=1 ttl=64 time=0.081 ms
    64 bytes from db (172.17.0.4): icmp_seq=2 ttl=64 time=0.092 ms
    64 bytes from db (172.17.0.4): icmp_seq=3 ttl=64 time=0.109 ms
    
    --- db ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2111ms
    rtt min/avg/max/mdev = 0.081/0.094/0.109/0.011 ms

    3.查看其/etc/hostname内容:

    root@linuxkit-025000000001:/# cat /etc/hostname
    linuxkit-025000000001

    可以在run容器时自己设定自己的主机名,使用--hostname参数:

    userdeMacBook-Pro:~ user$ docker run -it --hostname=myUbuntu9 --name ubuntu9 ubuntu:14.04 /bin/bash
    root@myUbuntu9:/# cat /etc/hostname
    myUbuntu9

    上面的例子就将主机名设置为了myUbuntu9

    4.使用--net参数(其实就是之前使用的--network参数)设置使用的网络是bridge、nonedeng,或者是指明与某个容器使用相同的网络,这里着重讲其如何使用container模式(其他网络模式请看上一章):
    重新生成一个ubuntu10容器,使用--net=container:ubuntu8连接之前link db容器的ubuntu8容器:

    从上图可见,基本上就相当于打开了别名为ubuntu10的ubuntu8容器,两者的IP地址是完全一样的,连主机名都是一样的。当然,ubuntu10容器也是开启了的:

    userdeMBP:~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    3b854b76e02e        ubuntu:14.04        "/bin/bash"              2 minutes ago       Up 2 minutes                                 ubuntu10
    f07c50c1c6ee        ubuntu:14.04        "/bin/bash"              27 minutes ago      Up 27 minutes                                ubuntu8
  • 相关阅读:
    [iOS 主要框架的总结]
    [无线传感器 网络中的节点定位技术]
    [JAVA 多种方式读取文件]
    [IOS swift对比oc]
    [IOS 静态库]
    [U3D 导出Xcode工程包,用Xcode给U3D脚本传递参数]
    [U3D 添加大地、天空,用第一视角看看自己做的世界]
    [U3D 画起重机,绑脚本和控制它运动的基本操作]
    Flutter 国际化适配
    Error:Unable to resolve dependency for ':app@releaseUnitTest/compileClasspath': Coul完美解决
  • 原文地址:https://www.cnblogs.com/wanghui-garcia/p/10145429.html
Copyright © 2020-2023  润新知