Docker端口映射与容器互联

如何让外部的主机访问到宿主机里边的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 参数时,支持的格式有三种:

1. IP:HostPort:ContainerPort    

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

2. IP:ContainerPort        

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

3. 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
8080/tcp -> 0.0.0.0:8888

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> : alias]    连接到其他容器
  • 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
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文件方式

    查看 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容器上。

 

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值