Docker端口映射与容器互联

Docker端口映射与容器互联

1、端口映射实现容器访问

1.1 从外部访问容器应用

启动容器时如果不指定对应的参数,容器是无法从外部网络来访问容器内的应用及服务的。在容器中运行一些网络应用,要让外部访问这些应用,可以通过-P或-p参数来指定端口映射。用-P时,会随机映射一个端口。

[root@study ~ 10:31:37]# docker run -dP training/webapp
[root@study ~ 10:32:13]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
79bdebb04da9        training/webapp     "python app.py"     27 seconds ago      Up 26 seconds       0.0.0.0:32784->5000/tcp   serene_yalow
可以看到本地的32784端口被映射到了容器的5000端口
通过宿主机的32784端口即可访问容器内web应用提供的界面。

-p(小写)可以指定端口,在一个指定端口上只可以绑定一个容器。支持的格式有:

IP:HostPort:ContainerPort |IP::ContainerPort |HostPort:ContainerPort

1.2 映射所有接口地址

使用"HostPort:ContainerPort"这种格式,将本地的5000端口映射到容器的5000端口。
[root@study ~ 10:32:16]# docker run -d -p 5000:5000 training/webapp
[root@study ~ 10:59:06]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
b54e5ee69d5e        training/webapp     "python app.py"     4 seconds ago       Up 2 seconds        0.0.0.0:5000->5000/tcp   pedantic_hawking

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

使用"IP:HostPort:ContainerPort"这种格式,映射使用一个特定地址。例如localhost地址127.0.0.1
[root@study ~ 11:01:14]# docker run -d -p 127.0.0.1:5000:5000 training/webapp
e1200e4bb26179e7a6d77a0b53f9c2d066b37e78994024722e707a482a1bf5bf
[root@study ~ 11:01:17]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                      NAMES
e1200e4bb261        training/webapp     "python app.py"     4 seconds ago       Up 2 seconds        127.0.0.1:5000->5000/tcp   blissful_hugle

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

使用"IP::ContainerPort"这种格式,绑定localhost的任意端口到容器的5000端口。
[root@study ~ 11:01:20]# docker run -d -p 127.0.0.1::5000 training/webapp
dbca5fe5b4e7684060541b56e9d7522b7ca3227ba36d77c500eaed8bbdb8026c
[root@study ~ 11:02:38]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                       NAMES
dbca5fe5b4e7        training/webapp     "python app.py"     4 seconds ago       Up 2 seconds        127.0.0.1:32768->5000/tcp   recursing_murdock

还可以使用udp标记来指定udp端口
[root@study ~ 11:02:41]# docker run -d -p 127.0.0.1::5000/udp training/webapp
5f09400160068e6fe852230b5f007d650c7274f40aafc2b960a5a1ebde9128f7
[root@study ~ 11:03:01]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                 NAMES
5f0940016006        training/webapp     "python app.py"     2 seconds ago       Up 1 second         5000/tcp, 127.0.0.1:32768->5000/udp   dreamy_hellman

1.5 查看映射端口配置

使用docker port

[root@study ~ 11:05:45]# docker port `docker ps -lq`
5000/udp -> 127.0.0.1:32768

2、互联机制实现便捷互访

容器的互联时一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。

2.1 自定义容器名

连接系统依据容器的名称来执行,虽然当容器创建的时候系统会默认分配一个名字,但是我们自定义容器名,可以方面我们记住这个容器的应用。

使用--name 自定义容器名
[root@study ~ 11:12:29]# docker run -d -P --name web training/webapp
[root@study ~ 11:12:51]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1a3c7a33c554        training/webapp     "python app.py"     8 seconds ago       Up 7 seconds        0.0.0.0:32785->5000/tcp   web
[root@study ~ 11:13:09]# docker inspect -f "{{.Name}}" 1a3c7a33c554
/web

2.2 容器互联

使用–link参数可以让容器之间安全的进行交互 --link name:alias alias为别名

创建一个新的数据库容器
[root@study ~ 11:29:47]# docker run -d --name db training/postgres
启动一个新的web容器,并连接到db容器
[root@study ~ 11:37:26]# docker run -d -P --name web --link db:db training/webapp
[root@study ~ 11:46:37]# docker inspect -f "{{.HostConfig.Links}}" web
[/db:/web/db]

Docker相当于在两个互联的容器之间创建了一个虚拟通道,而且不用映射它们的端口到宿主机上。从而避免了暴露数据库服务端口到外部网络上。

2.3 Dcoker 通过两种方式为容器公开连接信息:

  • 更新环境变量;
  • 更新/etc/hosts文件
通过env查看web容器环境变量,其中DB_开头的环境变量是供web容器连接db容器使用,前缀采用大写的连接别名。
[root@study ~ 11:56:04]# docker exec web env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=dc43842d75b3
DB_PORT=tcp://172.17.0.4:5432
DB_PORT_5432_TCP=tcp://172.17.0.4:5432
DB_PORT_5432_TCP_ADDR=172.17.0.4
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web/db
DB_ENV_PG_VERSION=9.3
HOME=/root

除了环境变量,Docker还添加host信息到父容器的/etc/hosts的文件。

[root@study ~ 12:04:01]# docker exec web 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.4	db 28f8260deec3		#db容器
172.17.0.3	dc43842d75b3		#web容器id

在web容器ping测试

[root@study ~ 12:04:53]# docker exec web 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.659 ms
64 bytes from db (172.17.0.4): icmp_seq=2 ttl=64 time=0.266 m
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值