端口映射与容器关联
docker除了通过网络访问外,还提供了两个功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问。
端口映射容器访问
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容器上。
来源:51CTO
作者:13851990094
链接:https://blog.51cto.com/11923906/2478170