Linux实战教程合集
Linux实战教程合集
如何让外部的主机访问到宿主机里边的Docker容器里面的应用,宿主机里面的容器与容器之间怎么互联起来一起工作。
Docker提供了两个很方便的功能,来满足服务访问的基本需求:
端口映射
容器互联
在启动容器的时候,如果不指定宿主机和Docker容器的端口映射,在容器外部是无法通过网络来访问容器内的网络应用和服务的,因为没有端口。可以通过 -P 或 - p参数来指定端口映射。
基本语法: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。适用于将容器指定端口映射到宿主机的一个端口上(映射所有接口地址)。
[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
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. 先创建一个新的 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标记,从而避免了暴露数据库服务端口到外部网络上。
更新环境变量;
更新/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系统安装配置+Xshell远程连接
运维界升职加薪必备的云计算技术,你学了吗?
学完高级运维云计算课程之后,你可以:
跨越90%企业的招聘硬门槛
增加70%就业机会
拿下BAT全国TOP100大厂敲门砖
体系化得到运维技术硬实力
技术大佬年薪可达30w+