Docker端口映射与容器互联

缺乏、安全感 2022-12-07 01:19 320阅读 0赞

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

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

  • 端口映射
  • 容器互联

一、端口映射

1、为什么要端口映射?​

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

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

基本语法:docker run -p IP:HostPort:ContainerPort IMAGE

  1. IP 表示主机的IP地址。​
  2. HostPort 表示宿主机的端口号
  3. ContainerPort 表示容器里的应用使用的端口号

​OPTIONS说明:

  • --publish , -p 将分配宿主机指定的端口号映射到容器里的应用使用的端口号
  • --publish-all , -P 将随机分配宿主机的端口号映射到容器里的应用使用的端口号

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

1. IP:HostPort:ContainerPort

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

2. IP:ContainerPort

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

3. HostPort:ContainerPort 常用

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

3、端口映射使用

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

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

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

20200914213342228.png

2. 使用 -P参数

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

20200914213618479.png

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

  1. [root@centos7 ~]# docker run -d --name 'tomcat3' -p 192.168.198.20::8080/udp tomcat:8.0.52
  2. baf59231d4a9f1344c8b43e1158f47b9fb909fe52901f38efab55b190cc4ec00
  3. [root@centos7 ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 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]]

  1. [root@centos7 ~]# docker port tomcat8888
  2. 8080/tcp -> 0.0.0.0:8888

2. docker inspect 命令

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

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

  1. [root@centos7 ~]# docker inspect tomcat8888

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNDAyODU0_size_16_color_FFFFFF_t_70

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

二、容器互联

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

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

  • --env=[] , -e 设置容器内的环境变量
  • --link=[ : alias] 连接到其他容器
  • name or id 表示要连接容器的名称或者id,
  • alias 表示起个别名。

注意:

  • 最好给容器起个好名字,见名知意,既方便记忆也方便理解容器的作用。
  • 互联的容器之间是可以使用 ping命令来测试是否连通。

1、容器互联使用

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

# docker run -d —name ‘dbmysql’ -e MYSQL_ROOT_PASSWORD=12345678 mysql:5.7

  1. [root@centos7 ~]# docker run -d --name 'dbmysql' -e MYSQL_ROOT_PASSWORD=12345678 mysql:5.7
  2. 600fa6751f24972c217f88bbc147bf1e4fc07149fdc36b85aa0cd3926e3b788e
  3. [root@centos7 ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 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

  1. [root@centos7 ~]# docker run -d --name 'web' -p 9999:8080 --link dbmysql:dbm tomcat:8.0.52
  2. 93d002495e2be43795f9693b370d515fa3255dfbc29523532843d71c8c2dc75d
  3. [root@centos7 ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 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容器的环境变量。

20200914220312900.png

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
    TOMCATVERSION=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
    LANG=C.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文件方式

  1. 查看 web容器的 /etc/hosts文件
  2. root@93d002495e2b:/# cat /etc/hosts
  3. 127.0.0.1 localhost
  4. ::1 localhost ip6-localhost ip6-loopback
  5. fe00::0 ip6-localnet
  6. ff00::0 ip6-mcastprefix
  7. ff02::1 ip6-allnodes
  8. ff02::2 ip6-allrouters
  9. 172.17.0.8 dbm 600fa6751f24 dbmysql
  10. 172.17.0.9 93d002495e2b

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

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

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

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。

发表评论

表情:
评论列表 (有 0 条评论,320人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Docker——端口映射容器互联

    端口映射实现容器访问 1. 从外部访问容器应用: 在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。 当容器中运行一些网络

    相关 Docker 容器互联

    随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 `--link` 参数。