千家信息网

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

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,本篇内容主要讲解"Docker端口映射与容器互联怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Docker端口映射与容器互联怎么实现"吧!1、端口
千家信息网最后更新 2025年01月22日Docker端口映射与容器互联怎么实现

本篇内容主要讲解"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 pscontainer id    image        command         created       status       ports          namesf769af3e9847    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 logs命令查看应用信息:

[root@docker ~]# docker logs nginx_110.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 pscontainer id    image        command         created       status       ports              names5bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  8 seconds ago    up 7 seconds    80/tcp, 0.0.0.0:5000->5000/tcp  nginx_2f769af3e9847    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 pscontainer id    image        command         created       status       ports                          names65fbfbe9761e    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_35bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  2 minutes ago    up 2 minutes    80/tcp, 0.0.0.0:5000->5000/tcp              nginx_2f769af3e9847    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 pscontainer id    image        command         created       status       ports                          names16a476837222    nginx:latest    "nginx -g 'daemon ..."  4 seconds ago    up 3 seconds    80/tcp, 10.0.0.31:89->8081/tcp              nginx_465fbfbe9761e    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_35bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  5 minutes ago    up 5 minutes    80/tcp, 0.0.0.0:5000->5000/tcp              nginx_2f769af3e9847    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 pscontainer id    image        command         created       status       ports                          names3436fd5fbdca    nginx:latest    "nginx -g 'daemon ..."  2 seconds ago    up 2 seconds    80/tcp, 10.0.0.31:32769->8082/tcp            nginx_516a476837222    nginx:latest    "nginx -g 'daemon ..."  2 minutes ago    up 2 minutes    80/tcp, 10.0.0.31:89->8081/tcp              nginx_465fbfbe9761e    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_35bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  7 minutes ago    up 7 minutes    80/tcp, 0.0.0.0:5000->5000/tcp              nginx_2f769af3e9847    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_180/tcp -> 0.0.0.0:32768[root@docker ~]# docker port nginx_25000/tcp -> 0.0.0.0:5000[root@docker ~]# docker port nginx_32700/tcp -> 0.0.0.0:30008863/tcp -> 0.0.0.0:2389[root@docker ~]# docker port nginx_48081/tcp -> 10.0.0.31:89[root@docker ~]# docker port nginx_58082/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 pscontainer id    image        command         created       status       ports                          names4d58a9f6f324    centos:latest    "/bin/bash"       6 seconds ago    up 5 seconds                                 centos_13436fd5fbdca    nginx:latest    "nginx -g 'daemon ..."  11 minutes ago   up 11 minutes    80/tcp, 10.0.0.31:32769->8082/tcp            nginx_516a476837222    nginx:latest    "nginx -g 'daemon ..."  13 minutes ago   up 13 minutes    80/tcp, 10.0.0.31:89->8081/tcp              nginx_465fbfbe9761e    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_35bdca2bde33d    nginx:latest    "nginx -g 'daemon ..."  18 minutes ago   up 18 minutes    80/tcp, 0.0.0.0:5000->5000/tcp              nginx_2f769af3e9847    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 mariadbb239b124946c99b7da63e00c22df802e9612fbe8bc636389205baf6c2f6963bd[root@docker ~]# docker pscontainer id    image        command         created       status       ports        namesb239b124946c    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 pscontainer id    image        command         created       status       ports        names86ef0f632ffe    nginx:latest    "nginx -g 'daemon ..."  44 seconds ago    up 43 seconds    80/tcp       webb239b124946c    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 envpath=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binhostname=7258de738125db_port=tcp://172.17.0.2:3306db_port_3306_tcp=tcp://172.17.0.2:3306db_port_3306_tcp_addr=172.17.0.2db_port_3306_tcp_port=3306db_port_3306_tcp_proto=tcpdb_name=/web3/dbdb_env_mysql_root_password=exampledb_env_gosu_version=1.10db_env_gpg_keys=199369e5404bd5fc7d2fe43bcbcb082a1bb943db   430bdf5c56e7c94e848ee60c1c4cbdcdcd2efd2a   4d1bb29d63d98e422b2113b19334a25f8507efa5db_env_mariadb_major=10.2db_env_mariadb_version=10.2.11+maria~jessienginx_version=1.13.7-1~stretchnjs_version=1.13.7.0.1.15-1~stretchhome=/root[root@docker ~]#

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

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

[root@docker ~]# docker run -it --rm --link db:db nginx:latest /bin/bashroot@16b8e6fde27f:/# cat /etc/hosts 172.17.0.2  db b239b124946c172.17.0.5  16b8e6fde27froot@16b8e6fde27f:/#

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

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

容器 端口 参数 互联 地址 应用 网络 信息 时候 格式 之间 变量 环境 可以通过 名字 名称 命令 文件 系统 本机 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨网络安全局地址 梅州市干巴精互联网科技有限公司 gp数据库查看是否是分区表 自己能搭建类似阿里云的服务器吗 数据库的乐观锁悲观锁 网络安全员一般大学什么专业 福建软件开发代理商共同合作 上海金山区手机软件开发公司 云南巨邦网络技术有限责任公司 服务器怎么检测键盘 好玩吧软件开发商 如何建立服务器给电脑做系统 新苹果手机换机后无法连接服务器 咖喱服务器 低代码软件开发项目提成分配 2021年国家网络安全政策 租用网络服务器 美团公司软件开发怎么样 铁锈助手无法同步数据库 教室内网络安全条幅 云服务器10m的带宽相当于家用 云服务器快速安全网站 外模式是数据库的全局逻辑结构 苹果设置清理缓存数据库 四卡服务器 显示器不显示 广州一匡互联网科技 最适合python的数据库 项城发布网络安全进基层 华腾网络安全 数据库access关系视频
0