西数超哥博客
运维经验教程分享

Docker网络基础配置基础以及如何进行主机-容器端口映射和进行容器互联实现容器间通信

21运维原创文章,转载请注明出处。

服务器上装了这么多容器,有一些容器提供的服务器,是需要主机与之进行通信,或容器之间需要进行一些网络通信,那么这就需要涉及到一套docker网络配置。docker目前提供的方式:
映射主机端口到容器端口,实现外部访问容器。
容器互连机制。
本文就简单记录下相关知识点。

一,映射主机端口到容器端口
映射主机端口到容器端口实现从外部访问容器里边的应用。启动容器的时候,如果不添加指定参数,那是无法通过外部主机访问容器内部的应用的。如果需要外部访问容器里边的应用,可以通过加参数-p或-P 来实现。
-P(大P):docker会随机映射一个49000-49900的端口到容器内部端口
-p(小p):映射指定接口到容器内接口。格式ip:hostPort:containerPort
1,随机映射端口-P实现,如下举例:

[root@docker5 home]# docker run  -d  -P --name web  training/webapp python  app.py
[root@docker5 home]# docker  ps  -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
36e061138d35        training/webapp     "python app.py"     23 seconds ago      Up 22 seconds       0.0.0.0:32779->5000/tcp   web
[root@docker5 home]# curl   http://192.168.2.75:32779
Hello world!
[root@docker5 home]# docker  port web
5000/tcp -> 0.0.0.0:32779
[root@docker5 home]# docker logs web
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.2.27 - - [23/Jun/2016 08:04:39] "GET / HTTP/1.1" 200 -
192.168.2.27 - - [23/Jun/2016 08:04:39] "GET /favicon.ico HTTP/1.1" 404 -

可以查看本地服务器端口32779已经映射到了web容器中的5000端口。访问也没问题(docker会自己生成iptables规则并添加进去,省去了手工操作的麻烦)。
2,指定端口映射
-p 格式ip:hostPort:containerPort  ,可以多次使用,进行多个端口映射操作。举例如下:

[root@docker5 home]# docker run  -d  -p 32777:5000 -p 192.168.2.75:32778:5000  --name web2  training/webapp python  app.py
[root@docker5 home]# docker ps  -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                   NAMES
a49fbb1d788a        training/webapp     "python app.py"     6 seconds ago       Up 4 seconds        192.168.2.75:32778->5000/tcp, 0.0.0.0:32777->5000/tcp   web2
[root@docker5 home]# docker port  web2
5000/tcp -> 192.168.2.75:32778
5000/tcp -> 0.0.0.0:32777

说明:
(1)

第一个-p 32777:5000 ,是映射本机所有网卡IP地址的32777到容器web2中的5000
第二个-p 192.168.2.75:32778:5000 是映射指定网卡IP192.168.2.75的32778端口到web容器中的5000端口。
映射只有通过curl访问都是正常。
(2)上边我们都用到了一个docker port 容器名  进行端口查看,查看本机与容器的端口映射情况。也可以通过docker inspect 容器名
(3)还有一种方式-p 192.168.2.75:32778:5000/udp 来映射udp协议端口,这里只是举例。
(4)-p 192.168.2.75::5000 省略主机的port,则是映射主机任意一个端口到容器指定端口

二,容器互连 实现容器间通信
      映射主机端口到容器端口只是解决了主机与容器间的通信,现在在记录下容器间如何进行通信。
容器间通信基本靠容器互联,在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。 连接系统依据容器的名称来执行。
注意:自定义容器名字要简单容易记,且标明容器用途或性质。
这里以上边我们创建的web容器做测试举例。
创建一个容器:

[root@docker5 home]# docker run -d --name db  docker.io/postgres

下边我们再创建一个web容器,通过–link去链接db容器:

docker run  -d -P --name web --link db:db training/webapp python app.py

web容器去链接db容器。其中–link用法: –link name:alias 后边接的是要连接的容器名和连接别名。其中连接建立的时候我们没有加-p和-P ,没有暴漏端口到主机以及外网,仅仅是指定的两个容器内部通信,这样也是非常安全的
这样建立连接以后,两个容器就可以相互通信了。容器通过两种方式,env和/etc/hosts 设置了公开连接信息:
通过web进去查看env:

root@3d0b6e75974a:/opt/webapp# env
DB_ENV_PGDATA=/var/lib/postgresql/data
HOSTNAME=3d0b6e75974a
DB_NAME=/web/db
DB_PORT_5432_TCP_ADDR=172.17.0.4
DB_PORT=tcp://172.17.0.4:5432
DB_ENV_LANG=en_US.utf8
DB_ENV_GOSU_VERSION=1.7
DB_PORT_5432_TCP=tcp://172.17.0.4:5432
LS_COLORS=
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DB_ENV_PG_MAJOR=9.5
PWD=/opt/webapp
DB_PORT_5432_TCP_PORT=5432
SHLVL=1
HOME=/root
DB_PORT_5432_TCP_PROTO=tcp
LESSOPEN=| /usr/bin/lesspipe %s
DB_ENV_PG_VERSION=9.5.3-1.pgdg80+1
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/env

可见里边都是db容器里边的一些信息,下边再查看一下web容器里边的hosts:

root@3d0b6e75974a:/opt/webapp# cat  /etc/hosts
172.17.0.5	3d0b6e75974a
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 59f3ebd9b0d8

可见里边的本身一些IP和主机信息,包含了通信容器的IP地址。
ping db以及ping 172.17.0.4都是可以通信的。

root@3d0b6e75974a:/opt/webapp# ping 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.330 ms
64 bytes from db (172.17.0.4): icmp_seq=2 ttl=64 time=0.070 ms
^C
--- db ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.070/0.200/0.330/0.130 ms
root@3d0b6e75974a:/opt/webapp# ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.129 ms

这里只是举例了一个web容器连接db容器。实际中可以多个容器连接该容器,也可以多个容器之间互连。

转载请注明:西数超哥博客www.ysidc.top» Docker网络基础配置基础以及如何进行主机-容器端口映射和进行容器互联实现容器间通信

https://www.ysidc.top 西数超哥博客,数据库,西数超哥,虚拟主机,域名注册,域名,云服务器,云主机,云建站,ysidc.top

赞(0)
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除。本站原创内容未经允许不得转载:西数超哥博客 » Docker网络基础配置基础以及如何进行主机-容器端口映射和进行容器互联实现容器间通信

登录

找回密码

注册