docker端口映射与容器的互访

端口映射与容器关联

docker除了通过网络访问外,还提供了两个功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问。

创新互联公司公司2013年成立,是专业互联网技术服务公司,拥有项目成都做网站、成都网站建设、成都外贸网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元清河做网站,已为上家服务,为清河各地企业和个人服务,联系电话:18980820575

端口映射容器访问

1、从外部访问容器应用,从启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。可以通过-P或-p参数来指定端口映射。
-P:会随机映射一个49000~49900的端口到内部容器开放的网络端口

[root@docker01 ~]# docker run -d -P training/webapp python app.py
75b2c32292d290aa3004b5b6cbb49775cc6f360796736473978cc32a682fdad9
[root@docker01 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
75b2c32292d2        training/webapp     "python app.py"     3 seconds ago       Up 2 seconds        0.0.0.0:32770->5000/tcp   musing_carson

查看应用的信息

[root@docker01 ~]# docker logs -f musing_carson
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

2、映射所有接口地址,使用HostPort:ContainerPort吧本地的5000端口映射到容器的5000端口

[root@docker01 ~]# docker run -d -p 5000:5000 training/webapp python app.py
6368e0f567714ad90d2b20ff71afb2231e404b35639055a665cc3715a85f010a

或使用连续的-p绑定多个端口

[root@docker01 ~]# docker run -d -p 5000:5000 -p3000:80 training/webapp python app.py
80bfe8e1f7fd53099e3f350c5efd1160a7247d065233965cc2bc2130e2fdcbb2

3、映射到指定地址的指定端口,使用IP:HostPort:ContainerPort格式指定映射使用一个特定地址。

[root@docker01 ~]# docker run -d -p 10.10.17.199:5000:5000 training/webapp python app.py
ac228c0f2334a59856d9993e6a3eb652b50eb08ec41cedff87b331aa8d5d5f86
[root@docker01 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                         NAMES
ac228c0f2334        training/webapp     "python app.py"     5 seconds ago       Up 5 seconds        10.10.17.199:5000->5000/tcp   eager_noether

4、映射到指定地址的任意端口,使用IP::ContainerPort绑定localhost的任意端口到容器的5000端口,本地主机会自动分配一个端口

[root@docker01 ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
e72dec38ae77c113418156c4ad50b601fe31d0a38b4b8f995aabdcfcc510fdcc

使用UDP标记来指定udp端口

[root@docker01 ~]# docker run -d -p 127.0.0.1:5001:5001/udp training/webapp python app.py
581ff1531c6b604c1b66ece82c87529a02c8da0b7b19e98bd336122c151b524f

5、查看映射端口配置,使用docker port来查看映射的端口配置

[root@docker01 ~]# docker port laughing_faraday 5000
127.0.0.1:32768

互联机制便捷互访

容器的互联是一种让多个容器中的应用进行快捷交互的方式,它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
1、自定义容器命名,连接系统依据容器的名称来执行。首先需要一个好记的容器命名,虽然不指定系统会默认分配一个,但是指定的好处在于:名称好记,基于应用来取名如web。需要连接其他容器时,也可以使用容器名而不用改变。

[root@docker01 ~]# docker run -d -P --name web training/webapp python app.py
6ae6d11614f99762a519d55beb8b38f3fbff667af34be90b33d6a11477b8d99a
[root@docker01 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
6ae6d11614f9        training/webapp     "python app.py"     7 seconds ago       Up 6 seconds        0.0.0.0:32771->5000/tcp   web

2、容器互联,使用--link参数可以让容器之间安全的进行交互
创建一个新的数据库容器

[root@docker01 ~]# docker run -d --name db training/postgres
Unable to find image 'training/postgres:latest' locally
latest: Pulling from training/postgres
Image docker.io/training/postgres:latest uses outdated schema1 manifest format. Please upgrade to atibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Pull complete 
6e71c809542e: Pull complete 
2978d9af87ba: Pull complete 
e1bca35b062f: Pull complete 
500b6decf741: Pull complete 
74b14ef2151f: Pull complete 
7afd5ed3826e: Pull complete 
3c69bb244f5e: Pull complete 
d86f9ec5aedf: Pull complete 
010fabf20157: Pull complete 
Digest: sha256:a945dc6dcfbc8d009c3d972931608344b76c2870ce796da00a827bd50791907e
Status: Downloaded newer image for training/postgres:latest
67b752f9c5d6f19f2811674be780673b5475c845be6f43d9b15df139ff01c0fd

删除之前的web容器,然后创建一个新的web容器,把他连接到db容器

[root@docker01 ~]# docker rm -f web
web
[root@docker01 ~]# docker run -d -P --name web --link db:db training/webapp python app.py
de3f340d554dd01789859d6dc0fc3a0bb406e3111ca60e27f78da208def08dca

--link参数的格式为--link name:alias,其中name是要链接的容器名称,alias是别名。
使用docker ps查看容器的链接

[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
de3f340d554d        training/webapp     "python app.py"          4 minutes ago       Up 4 minutes        0.0.0.0:32772->5000/tcp   web
67b752f9c5d6        training/postgres   "su postgres -c '/us…"   13 minutes ago      Up 13 minutes       5432/tcp                  db

相当于在两个容器之间创建了一个虚拟通道,而且不用映射他们的端口到宿主机上,在启动db容器的时候没有使用-p或-P标记,避免了暴露数据库服务端到外部网络上。
docker通过两种方式为容器公开连接信息
#更新环境变量
#更新/etc/hosts文件
使用env命令来查看web容器的环境变量:

[root@docker01 ~]# docker run --rm --name web2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=2ff63f7eb1d2
DB_PORT=tcp://172.17.0.3:5432
DB_PORT_5432_TCP=tcp://172.17.0.3:5432
DB_PORT_5432_TCP_ADDR=172.17.0.3
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root

除了环境变量docker还添加了host信息到父容器的/etc/hosts中

[root@docker01 ~]# docker run -t -i --rm --link db:db training/webapp /bin/bash
root@8ed896541b8d:/opt/webapp# 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.3  db 67b752f9c5d6
172.17.0.4  8ed896541b8d
root@8ed896541b8d:/opt/webapp# ping db
PING db (172.17.0.3) 56(84) bytes of data.
64 bytes from db (172.17.0.3): icmp_seq=1 ttl=64 time=0.239 ms
64 bytes from db (172.17.0.3): icmp_seq=2 ttl=64 time=0.154 ms
64 bytes from db (172.17.0.3): icmp_seq=3 ttl=64 time=0.110 ms
64 bytes from db (172.17.0.3): icmp_seq=4 ttl=64 time=0.111 ms
^C
--- db ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.110/0.153/0.239/0.053 ms

用户可以链接多个子容器到父容器,比如可以链接多个web到同一个db容器上。


文章标题:docker端口映射与容器的互访
本文路径:http://myzitong.com/article/pppoph.html