温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Docker端口映射与容器互联怎么实现

发布时间:2022-05-20 14:57:22 来源:亿速云 阅读:158 作者:iii 栏目:大数据

本篇内容主要讲解“Docker端口映射与容器互联怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker端口映射与容器互联怎么实现”吧!

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

1.从外部访问容器应用

在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的。

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-p或-p参数来指定端口映射。当使用-p(大写p)标记时,docker会随机映射一个端口到内部容器开放的网络端口(端口范围在linux系统使用的端口之外,一般都过万):

[root@docker ~]# docker run -d --name nginx_1 -p nginx:latest 
f769af3e98478b27b87e008f3ad785e2055da4047442c4a8dcb8f621f810dbea
[root@docker ~]# docker ps
container id    image        command         created       status       ports          names
f769af3e9847    nginx:latest    "nginx -g 'daemon ..."  3 seconds ago    up 2 seconds    0.0.0.0:32768->80/tcp  nginx_1
[root@docker ~]#

通过docker ps可以看到nginx_1容器的80端口被映射到本机的32768端口上。访问宿主主机的32768端口就可以访问容器内的应用程序提供的web界面:

Docker端口映射与容器互联怎么实现

同样,可以通过docker logs命令查看应用信息:

[root@docker ~]# docker logs nginx_1
10.0.0.253 - - [29/nov/2017:06:25:38 +0000] "get / http/1.1" 200 612 "-" "mozilla/5.0 (windows nt 6.1; win64; x64; rv:57.0) gecko/20100101 firefox/57.0" "-"
10.0.0.253 - - [29/nov/2017:06:25:39 +0000] "get /favicon.ico http/1.1" 404 169 "-" "mozilla/5.0 (windows nt 6.1; win64; x64; rv:57.0) gecko/20100101 firefox/57.0" "-"
2017/11/29 06:25:39 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: no such file or directory), client: 10.0.0.253, server: localhost, request: "get /favicon.ico http/1.1", host: "10.0.0.31:32768"
10.0.0.253 - - [29/nov/2017:06:25:39 +0000] "get /favicon.ico http/1.1" 404 169 "-" "mozilla/5.0 (windows nt 6.1; win64; x64; rv:57.0) gecko/20100101 firefox/57.0" "-"
2017/11/29 06:25:39 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: no such file or directory), client: 10.0.0.253, server: localhost, request: "get /favicon.ico http/1.1", host: "10.0.0.31:32768"
10.0.0.253 - - [29/nov/2017:06:26:55 +0000] "get / http/1.1" 200 612 "-" "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/61.0.3163.100 safari/537.36" "-"
10.0.0.253 - - [29/nov/2017:06:26:56 +0000] "get /favicon.ico http/1.1" 404 571 "http://10.0.0.31:32768/" "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/61.0.3163.100 safari/537.36" "-"
2017/11/29 06:26:56 [error] 5#5: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: no such file or directory), client: 10.0.0.253, server: localhost, request: "get /favicon.ico http/1.1", host: "10.0.0.31:32768", referrer: "http://10.0.0.31:32768/"
[root@docker ~]#

-p(小写p)可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。支持的格式有:ip:hostport:containerport | ip::containerport | hostport:containerport 。

2.映射所有接口地址

使用hostport:containerport格式将本地的5000端口映射到容器的5000端口:

[root@docker ~]# docker run -itd -p 5000:5000 --name nginx_2 nginx:latest 
5bdca2bde33d7db72861399ca49e82f0d209d13289d20b181843da5b10e6f2d3
[root@docker ~]# docker ps
container id    image        command         created       status       ports              names
5bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  8 seconds ago    up 7 seconds    80/tcp, 0.0.0.0:5000->5000/tcp  nginx_2
f769af3e9847    nginx:latest    "nginx -g 'daemon ..."  15 minutes ago   up 15 minutes    0.0.0.0:32768->80/tcp      nginx_1
[root@docker ~]#

此时默认会绑定本地所有接口上的所有地址。多次使用-p参数可以绑定多个端口:

[root@docker ~]# docker run -itd -p 3000:2700 -p 2389:8863 --name nginx_3 nginx:latest 
65fbfbe9761eb5146501311016d681f210b1891ca5f5af62dc978ad6f2a22750
[root@docker ~]# docker ps
container id    image        command         created       status       ports                          names
65fbfbe9761e    nginx:latest    "nginx -g 'daemon ..."  3 seconds ago    up 2 seconds    80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp  nginx_3
5bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  2 minutes ago    up 2 minutes    80/tcp, 0.0.0.0:5000->5000/tcp              nginx_2
f769af3e9847    nginx:latest    "nginx -g 'daemon ..."  18 minutes ago   up 18 minutes    0.0.0.0:32768->80/tcp                  nginx_1
[root@docker ~]#

3.映射到指定地址的指定端口

可以使用ip:hostport:containerport格式指定映射使用一个特定地址:

[root@docker ~]# docker run -itd -p 10.0.0.31:89:8081 --name nginx_4 nginx:latest 
16a476837222d413926053e1c8175c993b0495732073fbc6251dfd4696db8242
[root@docker ~]# docker ps
container id    image        command         created       status       ports                          names
16a476837222    nginx:latest    "nginx -g 'daemon ..."  4 seconds ago    up 3 seconds    80/tcp, 10.0.0.31:89->8081/tcp              nginx_4
65fbfbe9761e    nginx:latest    "nginx -g 'daemon ..."  2 minutes ago    up 2 minutes    80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp  nginx_3
5bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  5 minutes ago    up 5 minutes    80/tcp, 0.0.0.0:5000->5000/tcp              nginx_2
f769af3e9847    nginx:latest    "nginx -g 'daemon ..."  20 minutes ago   up 20 minutes    0.0.0.0:32768->80/tcp                  nginx_1
[root@docker ~]#

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

使用ip::containerport格式绑定本机的任意端口到容器的指定端口:

[root@docker ~]# docker run -itd -p 10.0.0.31::8082 --name nginx_5 nginx:latest 
3436fd5fbdca6529c70c664f42edfd10d51edb0fb541b096b47c9b168887b2ca
[root@docker ~]# docker ps
container id    image        command         created       status       ports                          names
3436fd5fbdca    nginx:latest    "nginx -g 'daemon ..."  2 seconds ago    up 2 seconds    80/tcp, 10.0.0.31:32769->8082/tcp            nginx_5
16a476837222    nginx:latest    "nginx -g 'daemon ..."  2 minutes ago    up 2 minutes    80/tcp, 10.0.0.31:89->8081/tcp              nginx_4
65fbfbe9761e    nginx:latest    "nginx -g 'daemon ..."  4 minutes ago    up 4 minutes    80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp  nginx_3
5bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  7 minutes ago    up 7 minutes    80/tcp, 0.0.0.0:5000->5000/tcp              nginx_2
f769af3e9847    nginx:latest    "nginx -g 'daemon ..."  22 minutes ago   up 22 minutes    0.0.0.0:32768->80/tcp                  nginx_1
[root@docker ~]#

容器启动后,本机会随机自动分配一个未被占用的端口。

 5.查看映射端口配置

使用docker port命令来查看当前映射的端口配置,也可以查看绑定的地址

[root@docker ~]# docker port nginx_1
80/tcp -> 0.0.0.0:32768
[root@docker ~]# docker port nginx_2
5000/tcp -> 0.0.0.0:5000
[root@docker ~]# docker port nginx_3
2700/tcp -> 0.0.0.0:3000
8863/tcp -> 0.0.0.0:2389
[root@docker ~]# docker port nginx_4
8081/tcp -> 10.0.0.31:89
[root@docker ~]# docker port nginx_5
8082/tcp -> 10.0.0.31:32769
[root@docker ~]#

注意:

容器有自己的内部网络和ip地址,使用docker inspect +容器id可以获取容器的具体信息。

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

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

1.自定义容器命名

连接系统依据容器的名称来执行。因此,首先要给容器定义一个简单好记的名字。在容器创建的时候,系统会随机创建一个容器名,但是并没有特殊的意义也不便于记忆,所有自定义容器名有一下亮点好处:

1.自定义的命名比较好记,比如一个web应用容器,就可以起名web,既方便记忆也方便理解容器的作用;
2.当要连接其他容器时,即使重启,也可以使用自定义的容器名,,比如web容器连接到db容器。

使用--name参数可以为容器自定义命名:

[root@docker ~]# docker run -itd --name centos_1 centos:latest 
4d58a9f6f324185caf53dbe5eaee85f35e853842ffb037cf272c2a92cee89716
[root@docker ~]# docker ps
container id    image        command         created       status       ports                          names
4d58a9f6f324    centos:latest    "/bin/bash"       6 seconds ago    up 5 seconds                                 centos_1
3436fd5fbdca    nginx:latest    "nginx -g 'daemon ..."  11 minutes ago   up 11 minutes    80/tcp, 10.0.0.31:32769->8082/tcp            nginx_5
16a476837222    nginx:latest    "nginx -g 'daemon ..."  13 minutes ago   up 13 minutes    80/tcp, 10.0.0.31:89->8081/tcp              nginx_4
65fbfbe9761e    nginx:latest    "nginx -g 'daemon ..."  15 minutes ago   up 15 minutes    80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp  nginx_3
5bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  18 minutes ago   up 18 minutes    80/tcp, 0.0.0.0:5000->5000/tcp              nginx_2
f769af3e9847    nginx:latest    "nginx -g 'daemon ..."  34 minutes ago   up 34 minutes    0.0.0.0:32768->80/tcp                  nginx_1
[root@docker ~]#

通过docker ps或者docker ps -a可以查看到容器的自定义名字,利用docker inspect也可以获取到容器自定义名字:

[root@docker ~]# docker inspect -f "{{.name}}" 4d58a9f6f324
/centos_1
[root@docker ~]#

注意:

容器的名称是唯一的。如果已经命名了一个web的容器,当再次使用web这个命名的时候会报错,如果一定要使用,需要先用docker rm删除之前创建的web容器。

在执行docker run的时候如果添加--rm参数,则容器终止后会立刻删除。--rm参数和-d参数不能同时使用。

2、容器互联

使用--link参数可以让容器之间安全地进行交互。

创建一个数据库容器:

[root@docker ~]# docker run -itd --name db --env mysql_root_password=example mariadb
b239b124946c99b7da63e00c22df802e9612fbe8bc636389205baf6c2f6963bd
[root@docker ~]# docker ps
container id    image        command         created       status       ports        names
b239b124946c    mariadb       "docker-entrypoint..."  3 seconds ago    up 2 seconds    3306/tcp      db
[root@docker ~]#

创建一个web容器并将它连接到db容器:

[root@docker ~]# docker run -itd -p --name web --link db:db nginx:latest 
42fa6662784010368b5e615d495e71920d85cc1bc089a5d181657514973ee90a
[root@docker ~]# docker ps
container id    image        command         created       status       ports        names
86ef0f632ffe    nginx:latest    "nginx -g 'daemon ..."  44 seconds ago    up 43 seconds    80/tcp       web
b239b124946c    mariadb       "docker-entrypoint..."  about a minute ago  up 59 seconds    3306/tcp      db
[root@docker ~]#

此时web容器已经和db容器建立互联关系:--link参数的格式为:--link name:alias,其中name是要连接的容器名称,alias是这个连接的别名。

docker相当于在两个互联的容器之间创建了一个虚拟通道,而不用映射它们的端口到宿主机上。在启动db容器的时候并没有使用-p或者-p参数,从而避免了暴露数据库服务端口到外部网络上。

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

1.更新环境变量;
2.更新/etc/hosts文件。

使用env命令来查看web容器的环境变量:

[root@docker ~]# docker run --rm --name web3 --link db:db nginx:latest env
path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
hostname=7258de738125
db_port=tcp://172.17.0.2:3306
db_port_3306_tcp=tcp://172.17.0.2:3306
db_port_3306_tcp_addr=172.17.0.2
db_port_3306_tcp_port=3306
db_port_3306_tcp_proto=tcp
db_name=/web3/db
db_env_mysql_root_password=example
db_env_gosu_version=1.10
db_env_gpg_keys=199369e5404bd5fc7d2fe43bcbcb082a1bb943db   430bdf5c56e7c94e848ee60c1c4cbdcdcd2efd2a   4d1bb29d63d98e422b2113b19334a25f8507efa5
db_env_mariadb_major=10.2
db_env_mariadb_version=10.2.11+maria~jessie
nginx_version=1.13.7-1~stretch
njs_version=1.13.7.0.1.15-1~stretch
home=/root
[root@docker ~]#

其中db_开头的环境变量是提供web容器连接db容器使用的,前缀采用大写的连接别名。

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

[root@docker ~]# docker run -it --rm --link db:db nginx:latest /bin/bash
root@16b8e6fde27f:/# cat /etc/hosts 
172.17.0.2  db b239b124946c
172.17.0.5  16b8e6fde27f
root@16b8e6fde27f:/#

这里有两个hosts信息,第一个是db容器的ip和容器名+容器id,第二个是web自己的ip和容器id,web容器中hosts文件采用容器的id作为主机名。互联的容器之间是可以ping通的。

到此,相信大家对“Docker端口映射与容器互联怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI