欢迎您, 来到 宁时修博客.^_^

Docker系列9--网络管理(上)

2018/11/19 林木立 Docker 610
Docker容器技术

    Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。


一、外部访问容器

    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过  -P  或 -p  参数来指定端口映射。

    当使用  -P  标记时,Docker 会随机映射一个  49000~49900  的端口到内部容器开放的网络端口。

$ docker run -d -P training/webapp python app.py
45a58a3a03a5305b33ab3dd15670bd3af6788cdd2f473b0a8e1fbf4ab215d8b5
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
45a58a3a03a5        training/webapp     "python app.py"          25 seconds ago      Up 11 seconds       0.0.0.0:32770->5000/tcp   upbeat_almeida

    本地主机的 32770 被映射到了容器的5000 端口。此时访问本机的 32770 端口即可访问容器内 web 应用提供的界面。

        519.png



    通过  docker logs  命令来查看容器应用的访问日志信息:

[root@docker ~]# docker logs -f 45a58a3a03a5
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.184.1 - - [18/Nov/2018 16:28:17] "GET / HTTP/1.1" 200 -
192.168.184.1 - - [18/Nov/2018 16:28:17] "GET /favicon.ico HTTP/1.1" 404 -


    -p  则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有  ip:hostPort:containerPort  |  ip::containerPort | hostPort:containerPort  。



    映射所有接口地址

    使用  hostPort:containerPort  格式将本地的 5000 端口映射到容器的 5000 端口,可以执行:

docker run -d -p 5000:5000 training/webapp python app.py

    此时默认会绑定本地接口上的所有地址。



    映射到指定地址的指定端口

    使用  ip:hostPort:containerPort  格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1。

docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py


    映射到指定地址的任意端口

    使用  ip::containerPort  绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。

docker run -d -p 127.0.0.1::5000 training/webapp python app.py

    

    还可使用  udp  标记来指定  udp  端口:

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py


    查看映射端口配置

    使用  docker port  来查看当前映射的端口配置,也可以查看到绑定的地址。

$ docker port 45a58a3a03a5 5000
0.0.0.0:32770
$ docker port 45a58a3a03a5
5000/tcp -> 0.0.0.0:32770


    容器有自己的内部网络和 ip 地址(使用  docker inspect  可以获取所有的变量,Docker 还可以有一个可变的网络配置。)

    -p  标记可以多次使用来绑定多个端口。例:

docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py




二、容器互联

    随着 Docker 网络的完善,建议将容器加入自定义的 Docker 网络来连接多个容器,而不是使用  --link  参数来使容器互联。


    1)新建Docker网络

$ docker network create -d bridge docker-net
401127e6368616cd57b9d8e86b810a6bf729cbcc43bf7772a8fcfa6b279261c4

    -d  参数:指定 Docker 网络类型,有  bridge 和overlay  。 overlay  网络类型用于 Swarm mode。


    2)运行容器连接到Docker网络

    运行一个容器连到 docker-net网络:

$ docker run -it --rm --name centos1 --network docker-net centos bash
[root@2fab84ed64fa /]#


    新开终端,再运行一个容器连到docker-net网络:

$ docker run -it --rm --name centos2 --network docker-net centos bash
[root@b61168a204a1 /]#


    打开新终端查看容器信息:

$ docker container ls 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
b61168a204a1        centos              "bash"                   59 seconds ago      Up 58 seconds                                 centos2
2fab84ed64fa        centos              "bash"                   3 minutes ago       Up 3 minutes                                  centos1


    

    在容器内通过  ping  来证明 centos1  容器和  centos2  容器建立了互联关系。

    centos1容器内ping centos2容器:

[root@2fab84ed64fa /]# ping centos2
PING centos2 (172.18.0.3) 56(84) bytes of data.
64 bytes from centos2.docker-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.155 ms
64 bytes from centos2.docker-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.087 ms
64 bytes from centos2.docker-net (172.18.0.3): icmp_seq=3 ttl=64 time=0.091 ms
64 bytes from centos2.docker-net (172.18.0.3): icmp_seq=4 ttl=64 time=0.098 ms


    centos2容器内ping centos1容器:

[root@b61168a204a1 /]# ping centos1
PING centos1 (172.18.0.2) 56(84) bytes of data.
64 bytes from centos1.docker-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.166 ms
64 bytes from centos1.docker-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.150 ms
64 bytes from centos1.docker-net (172.18.0.2): icmp_seq=3 ttl=64 time=0.189 ms

    centos1和centos2容器相互能ping通,证明两容器以互联成功。



三、配置DNS

    自定义配置容器的主机名和 DNS ,需要Docker 利用虚拟文件来挂载容器的 3 个相关配置文件。

    在centos1和centos2容器使用mount命令查看挂载信息:

[root@2fab84ed64fa /]# mount
........
/dev/sda3 on /etc/resolv.conf type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda3 on /etc/hostname type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda3 on /etc/hosts type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
.......

    就是这三个文件 /etc/resolv.conf 、/etc/hostname、/etc/hosts。这种机制可让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过  /etc/resolv.conf  文件立刻得到更新。


    配置全部容器的 DNS ,也可以在宿主机的  /etc/docker/daemon.json  文件中增加以下内容来设置:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

    需要重启Docker服务。这样每次启动容器的DNS会设为114.114.114.114和8.8.8.8。

    测试下:

$ systemctl restart docker
$ docker run -it --rm ubuntu:18.04 cat etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8



    想要手动指定容器的配置,在使用  docker run  命令启动容器时加入如下参数:

    -h HOSTNAME  或者  --hostname=HOSTNAME  设定容器的主机名,它会被写到容器内的  /etc/hostname  和  /etc/hosts  。但它在容器外部看不到,既不会在docker container ls  中显示,也不会在其他的容器的  /etc/hosts  看到。

    --dns=IP_ADDRESS  添加 DNS 服务器到容器的  /etc/resolv.conf  中,让容器用这个服务器来解析所有不在  /etc/hosts  中的主机名。

    --dns-search=DOMAIN  设定容器的搜索域,当设定搜索域为  .example.com时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索host.example.com  。

    如果在容器启动时没有指定最后两个参数,Docker 会默认用主机上的/etc/resolv.conf  来配置容器。


点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群