48小时系统班试听入口

Linux实战技术—Docker端口映射与容器互联

发布作者:新盟教育 发布日期:2022-07-30 浏览人数:2563人

Linux实战教程合集


如何让外部的主机访问到宿主机里边的Docker容器里面的应用,宿主机里面的容器与容器之间怎么互联起来一起工作。


Docker提供了两个很方便的功能,来满足服务访问的基本需求:

  • 端口映射

  • 容器互联


一、端口映射


1、为什么要端口映射?


在启动容器的时候,如果不指定宿主机和Docker容器的端口映射,在容器外部是无法通过网络来访问容器内的网络应用和服务的,因为没有端口。可以通过 -P 或 - p参数来指定端口映射。


2、端口映射的命令 - docker run命令


基本语法:docker run  -p  IP:HostPort:ContainerPort IMAGE     IP 表示主机的IP地址。      HostPort 表示宿主机的端口号     ContainerPort 表示容器里的应用使用的端口号


  • OPTIONS说明:


--publish , -p

将分配宿主机指定的端口号映射到容器里的应用使用的端口号;


--publish-all , -P

将随机分配宿主机的端口号映射到容器里的应用使用的端口号


使用 -p 参数时,支持的格式有三种:


① IP:HostPort:ContainerPort

指定 ip、指定宿主机 port、指定容器 port。适用于映射到指定地址的指定端口。


② IP:ContainerPort

指定 ip、未指定宿主机 port(随机分配)、指定容器 port。适用于映射到指定地址的任意端口。


③ HostPort:ContainerPort 常用

未指定 ip、指定宿主机 port、指定容器 port。适用于将容器指定端口映射到宿主机的一个端口上(映射所有接口地址)。


3、端口映射使用


[root@centos7 ~]# docker pull tomcat:8.0.52 [root@centos7 ~]# docker pull mysql:5.7


1. 使用 -p 参数,可以设置多组小p,映射多对端口号,比如:-p 8084:8080 -p 8082:8080:


[root@centos7 ~]# docker run -d --name 'tomcat8888' -p 8888:8080 tomcat:8.0.52  719b8193772773fc6e8a3bda493c08277f1107bc9dc62a73b34f5e949cd052d4 [root@centos7 ~]# docker ps CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES 719b81937727        tomcat:8.0.52       "catalina.sh run"   5 seconds ago       Up 5 seconds        0.0.0.0:8888->8080/tcp   tomcat8888



2. 使用 -P参数


[root@centos7 ~]# docker run -d --name 'tomcat2' -P tomcat:8.0.52  0f56762fb94c8ddd6b73d77c24aacee6966b7ef7d0a9a65e867f1852c7a88683 [root@centos7 ~]# docker ps CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES 0f56762fb94c        tomcat:8.0.52       "catalina.sh run"   4 seconds ago       Up 2 seconds        0.0.0.0:32768->8080/tcp   tomcat2



3. 默认开启的是tcp协议,可以改为udp协议,做演示,在tomcat应用中没意义,其他应用中会有。


[root@centos7 ~]# docker run -d --name 'tomcat3' -p 192.168.198.20::8080/udp tomcat:8.0.52   baf59231d4a9f1344c8b43e1158f47b9fb909fe52901f38efab55b190cc4ec00 [root@centos7 ~]# docker ps CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                      NAMES baf59231d4a9        tomcat:8.0.52       "catalina.sh run"   16 seconds ago      Up 14 seconds       8080/tcp, 192.168.198.20:32768->8080/udp   tomcat3


4、查看映射端口配置信息


1. docker port 命令


列出端口映射或容器的特定映射,可以不指定 PRIVATE_PORT或仅指定特定映射来查找所有映射的端口:


基本语法:docker port CONTAINER [PRIVATE_PORT[/PROTO]]


[root@centos7 ~]# docker port tomcat8888


2. docker inspect 命令


Docker对象的具体详细信息,默认情况下,docker inspect将结果呈现在 JSON数组中。


基本语法:docker inspect [OPTIONS] NAME|ID [NAME|ID...]


[root@centos7 ~]# docker inspect tomcat8888



可以看到创建的容器是有自己的内部网络和 IP地址等信息。


二、容器互联


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


使用 docker run命令 的 --link 参数让容器之间安全地进行交互。


  • --env=[] , -e 设置容器内的环境变量;

  • --link=[

  • name or id 表示要连接容器的名称或者id;

  • alias 表示起个别名。


注意:


最好给容器起个好名字,见名知意,既方便记忆也方便理解容器的作用。

互联的容器之间是可以使用 ping命令来测试是否连通。


1、容器互联使用


1. 先创建一个新的 dbmysql数据库容器,指定密码:


# docker run -d --name 'dbmysql' -e MYSQL_ROOT_PASSWORD=12345678   mysql:5.7  [root@centos7 ~]# docker run -d --name 'dbmysql' -e MYSQL_ROOT_PASSWORD=12345678 mysql:5.7  600fa6751f24972c217f88bbc147bf1e4fc07149fdc36b85aa0cd3926e3b788e [root@centos7 ~]# docker ps CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES 600fa6751f24        mysql:5.7           "docker-entrypoint.s…"   10 seconds ago      Up 5 seconds        3306/tcp, 33060/tcp                        dbmysql


2. 创建一个新的 web应用容器,同时将它连接到 dbmysql数据库容器并起个别名 dbm:


#  docker run -d -p 80:8080 --name 'web' --link dbmysql:dbm  tomcat:8.0.52 [root@centos7 ~]# docker run -d --name 'web' -p 9999:8080 --link dbmysql:dbm tomcat:8.0.52  93d002495e2be43795f9693b370d515fa3255dfbc29523532843d71c8c2dc75d [root@centos7 ~]# docker ps CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                      NAMES 93d002495e2b        tomcat:8.0.52       "catalina.sh run"        About a minute ago   Up 26 seconds       0.0.0.0:9999->8080/tcp                     web


此时,dbmysql数据库容器和web应用容器建立了互联关系。


Docker相当于在两个互联的容器之间创建了一个虚机通道,而且不用映射它们的端口到宿主主机上。


在启动 dbmysql容器的时候并没有使用 -p和 -P标记,从而避免了暴露数据库服务端口到外部网络上。


2、Docker通过两种方式为容器公开连接信息


  • 更新环境变量;

  • 更新/etc/hosts文件。


1. 更新环境变量方式


使用 exec 命令进入到web容器(因为CMD不是 /bin/bash, 所以不能使用 attach),使用 env命令来查看 web容器的环境变量。



exec 命令:在正在运行的容器中执行子命令。


基本语法:docker [container] exec [OPTIONS] CONTAINER COMMAND [ARG...]


  • OPTIONS说明:


  • -d, --detach:分离模式: 在后台运行。

  • -i :打开标准输人接受用户输人命令。

  • -t,--tty=true | false:分配一个伪终端。


[root@centos7 ~]# docker exec -it web /bin/bash root@93d002495e2b:/usr/local/tomcat# cd / root@93d002495e2b:/# ls bin  boot  dev  docker-java-home  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var root@93d002495e2b:/# env HOSTNAME=93d002495e2b TOMCAT_VERSION=8.0.52 TERM=xterm CATALINA_HOME=/usr/local/tomcat DBM_PORT_3306_TCP_PORT=3306 DBM_ENV_MYSQL_ROOT_PASSWORD=12345678 DBM_ENV_MYSQL_MAJOR=5.7 DBM_PORT_3306_TCP=tcp://172.17.0.8:3306 LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib TOMCAT_ASC_URLS=https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz.asc      https://www-us.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz.asc   https://www.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz.asc      https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz.asc DBM_PORT_33060_TCP_PORT=33060 DBM_PORT_33060_TCP_PROTO=tcp DBM_PORT_3306_TCP_ADDR=172.17.0.8 PATH=/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin GPG_KEYS=05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23 DBM_NAME=/web/dbm PWD=/ DBM_ENV_GOSU_VERSION=1.12 JAVA_HOME=/docker-java-home/jre.UTF-8 JAVA_VERSION=7u181 DBM_ENV_MYSQL_VERSION=5.7.31-1debian10 TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib SHLVL=1 HOME=/root JAVA_DEBIAN_VERSION=7u181-2.6.14-1~deb8u1 TOMCAT_MAJOR=8 OPENSSL_VERSION=1.1.0f-3+deb9u2 TOMCAT_SHA512=23ba3c005d2e1bff30360a7aca5882ba7acaef0001395b1f77eb182c1f9c6a48db7f39b9f71ebdfb20668eca32c5f03bf00364f77d47e368850a794f6d65ea56 DBM_PORT=tcp://172.17.0.8:3306 DBM_PORT_33060_TCP_ADDR=172.17.0.8 DBM_PORT_3306_TCP_PROTO=tcp DBM_PORT_33060_TCP=tcp://172.17.0.8:33060 TOMCAT_TGZ_URLS=https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz  https://www-us.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz       https://www.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz OLDPWD=/usr/local/tomcat _=/usr/bin/env


其中DBM_开头的环境变量是提供 web容器连接dbmysql容器使用的连接别名(环境变量里采用大写)。


2. 更新/etc/hosts文件方式


查看 web容器的 /etc/hosts文件:


root@93d002495e2b:/# 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.8      dbm 600fa6751f24 dbmysql 172.17.0.9      93d002495e2b


通过查看这些信息表示,这两个容器是连接成功的。最后我们通过 ping命令来确认下。


root@93d002495e2b:/# ping dbm PING dbm (172.17.0.8) 56(84) bytes of data. 64 bytes from dbm (172.17.0.8): icmp_seq=1 ttl=64 time=0.668 ms 64 bytes from dbm (172.17.0.8): icmp_seq=2 ttl=64 time=0.069 ms 64 bytes from dbm (172.17.0.8): icmp_seq=3 ttl=64 time=0.091 ms ^C --- dbm ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.069/0.276/0.668/0.277 ms root@93d002495e2b:/# ping 172.17.0.8 PING 172.17.0.8 (172.17.0.8) 56(84) bytes of data. 64 bytes from 172.17.0.8: icmp_seq=1 ttl=64 time=0.042 ms 64 bytes from 172.17.0.8: icmp_seq=2 ttl=64 time=0.048 ms 64 bytes from 172.17.0.8: icmp_seq=3 ttl=64 time=0.045 ms


另外,docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。连接多个子容器到父容器,比如:可以连接多个 web容器到同一个 dbmysql容器上。





推荐阅读

>>>新手必备-Linux入门之云计算是什么

>>>红帽认证入门-Linux系统介绍及企业版本选型

>>>新手必备-Linux系统安装配置+Xshell远程连接

>>>Linux常用命令行合集之绝对路径和相对路径

>>>软连接与硬连接



运维界升职加薪必备的云计算技术,你学了吗?

学完高级运维云计算课程之后,你可以:

  • 跨越90%企业的招聘硬门槛

  • 增加70%就业机会

  • 拿下BAT全国TOP100大厂敲门砖

  • 体系化得到运维技术硬实力

  • 技术大佬年薪可达30w+