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