1. 端口映射实现访问容器:
在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的。
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-p或-P参数来指定饼口映射。当使用"- P"(大写P)标记时,Docker会随机映射一个端口到内部容器开放的网络端口(端口范围在Linux系统使用的端口之外,一般都过万)∶
[root@node1 ~]# docker run -d --name web1 -P nginx:latest
##查看随即映射的端口:
[root@node1 ~]# docker port web1
80/tcp -> 0.0.0.0:49153
80/tcp -> :::49153
" -p"(小写p):可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。支持的格式有∶" IP∶HostPort∶ContainerPort "," IP::ContainerPort " ," HostPort:ContainerPort "。
##添加一个ip地址
[root@node1 ~]# nmcli con mod eth0 +ipv4.address 192.168.188.124/24
[root@node1 ~]# nmcli con up eth0
##使用" IP∶HostPort∶ContainerPort "方式指定端口实现端口映射:
[root@node1 ~]# docker run -d --name web2 -p 192.168.188.124:81:80 nginx
##使用" IP∶∶ContainerPort "方式指定端口实现端口映射,该方式会在指定地址的随机一个端口映射:
[root@node1 ~]# docker run -d --name web3 -p 192.168.188.124::80 nginx
#查看容器web3端口:
[root@node1 ~]# docker port web3
80/tcp -> 192.168.188.123:49163
##查看端口映射
[root@node1 ~]# iptables -t nat -vnL
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.3:80
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.10:80
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.188.123 tcp dpt:49163 to:172.17.0.11:80
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.188.123 tcp dpt:81 to:172.17.0.12:80
2. 容器互联:使用" --link "参数可以让容器之间安全地进行交互。例如:
1>. 创建一个数据库容器:
[root@node1 ~]# docker run -d --name mysql --env MYSQL_ROOT_PASSWORD='123456'
"--env":表示指定参数
"MYSQL_ROOT_PASSWORD":表示指定数据库密码
2>. 创建一个discuz容器关联数据库容器:
[root@docker ~]# docker run -d -p 80:80 -name discuz --link mysql:db tencentci/discuz
其中:--link参数的格式为∶--link name∶alias,其中name是要连接的容器名称,alias是这个连接的
别名。
Docker相当于在两个互联的容器之间创建了一个虚拟通道,而不用映射它们的端口到宿主机上。在启动mysql容器的时候并没有使用-p或者-P参数, 从而避免了暴露数据库服务端口到外部网络上。
3>. 通过浏览去访问" 192.168.188.111 "访问并安装论坛:
Docker通过两种方式为容器公开连接信息∶
1>. 更新环境变量:使用env命令来查看web容器的环境变量。其中"DB_"开头的环境变量是提供web容器连接数据库容器使用的,前缀采用大写的连接别名。
[root@node1 ~]# docker run --rm -p 88:80 --link mysql:db --name discuz tencentci/discuz env
DB_ENV_MARIADB_MAJOR=10.6
PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2 --disable-cgi
APACHE_CONFDIR=/etc/apache2
HOSTNAME=cbe01a1b1c82
DB_PORT=tcp://172.17.0.2:3306
PHP_INI_DIR=/usr/local/etc/php
DB_PORT_3306_TCP=tcp://172.17.0.2:3306
PHP_EXTRA_BUILD_DEPS=apache2-dev
HOME=/root
DB_NAME=/discuz/db
PHP_LDFLAGS=-Wl,-O1 -Wl,--hash-style=both -pie
PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
PHP_MD5=
PHP_VERSION=7.3.12
GPG_KEYS=CBAF69F173A0FEA4B537F470D66C9593118BCCB6 F38252826ACD957EF380D39F2F7956BC5DA04B5D
PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
PHP_ASC_URL=https://www.php.net/get/php-7.3.12.tar.xz.asc/from/this/mirror
DB_ENV_MARIADB_VERSION=1:10.6.5+maria~focal
PHP_URL=https://www.php.net/get/php-7.3.12.tar.xz/from/this/mirror
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DZ_URL=https://www.discuz.net/daily/?dl=DZX-SC_UTF8-v3.5-202102010500-34d24c9b.zip
DB_PORT_3306_TCP_ADDR=172.17.0.2
DZ_WWW_ROOT=/var/www/html
DB_ENV_MYSQL_ROOT_PASSWORD=123456
PHPIZE_DEPS=autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c
PWD=/var/www/html
DB_ENV_GOSU_VERSION=1.14
PHP_SHA256=aafe5e9861ad828860c6af8c88cdc1488314785962328eb1783607c1fdd855df
DB_PORT_3306_TCP_PORT=3306
APACHE_ENVVARS=/etc/apache2/envvars
DB_PORT_3306_TCP_PROTO=tcp
2>. 自动更新/etc/hosts文件:Docker自动添加host信息到父容器的/etc/hosts文件中。
[root@node1 ~]# docker run -it -p 88:80 --link mysql:db --name discuz tencentci/discuz /bin/bash
root@0ea422e21f40:/var/www/html# 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.2 db e74c62c3881f mysql
172.17.0.13 0ea422e21f40