• 端口映射与容器互联


    1.  端口映射实现访问容器:

            在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的。

            当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-p或-P参数来指定饼口映射。当使用"- P"(大写P)标记时,Docker会随机映射一个端口到内部容器开放的网络端口(端口范围在Linux系统使用的端口之外,一般都过万)∶

    1. [root@node1 ~]# docker run -d --name web1 -P nginx:latest
    2. ##查看随即映射的端口:
    3. [root@node1 ~]# docker port web1
    4. 80/tcp -> 0.0.0.0:49153
    5. 80/tcp -> :::49153

    " -p"(小写p):可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。支持的格式有∶" IP∶HostPort∶ContainerPort "," IP::ContainerPort " ," HostPort:ContainerPort "。

    1. ##添加一个ip地址
    2. [root@node1 ~]# nmcli con mod eth0 +ipv4.address 192.168.188.124/24
    3. [root@node1 ~]# nmcli con up eth0
    4. ##使用" IP∶HostPort∶ContainerPort "方式指定端口实现端口映射:
    5. [root@node1 ~]# docker run -d --name web2 -p 192.168.188.124:81:80 nginx
    6. ##使用" IP∶∶ContainerPort "方式指定端口实现端口映射,该方式会在指定地址的随机一个端口映射:
    7. [root@node1 ~]# docker run -d --name web3 -p 192.168.188.124::80 nginx
    8. #查看容器web3端口:
    9. [root@node1 ~]# docker port web3
    10. 80/tcp -> 192.168.188.123:49163
    11. ##查看端口映射
    12. [root@node1 ~]# iptables -t nat -vnL
    13. Chain DOCKER (2 references)
    14. pkts bytes target prot opt in out source destination
    15. 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
    16. 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.3:80
    17. 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.10:80
    18. 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.188.123 tcp dpt:49163 to:172.17.0.11:80
    19. 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>.  创建一个数据库容器:

    1. [root@node1 ~]# docker run -d --name mysql --env MYSQL_ROOT_PASSWORD='123456'
    2. "--env":表示指定参数
    3. "MYSQL_ROOT_PASSWORD":表示指定数据库密码

            2>.  创建一个discuz容器关联数据库容器:

    1. [root@docker ~]# docker run -d -p 80:80 -name discuz --link mysql:db tencentci/discuz
    2. 其中:--link参数的格式为∶--link name∶alias,其中name是要连接的容器名称,alias是这个连接的
    3. 别名。

         Docker相当于在两个互联的容器之间创建了一个虚拟通道,而不用映射它们的端口到宿主机上。在启动mysql容器的时候并没有使用-p或者-P参数, 从而避免了暴露数据库服务端口到外部网络上。

              3>.  通过浏览去访问" 192.168.188.111 "访问并安装论坛:

     

     

     

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

            1>.  更新环境变量:使用env命令来查看web容器的环境变量。其中"DB_"开头的环境变量是提供web容器连接数据库容器使用的,前缀采用大写的连接别名。

    1. [root@node1 ~]# docker run --rm -p 88:80 --link mysql:db --name discuz tencentci/discuz env
    2. DB_ENV_MARIADB_MAJOR=10.6
    3. PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2 --disable-cgi
    4. APACHE_CONFDIR=/etc/apache2
    5. HOSTNAME=cbe01a1b1c82
    6. DB_PORT=tcp://172.17.0.2:3306
    7. PHP_INI_DIR=/usr/local/etc/php
    8. DB_PORT_3306_TCP=tcp://172.17.0.2:3306
    9. PHP_EXTRA_BUILD_DEPS=apache2-dev
    10. HOME=/root
    11. DB_NAME=/discuz/db
    12. PHP_LDFLAGS=-Wl,-O1 -Wl,--hash-style=both -pie
    13. PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    14. PHP_MD5=
    15. PHP_VERSION=7.3.12
    16. GPG_KEYS=CBAF69F173A0FEA4B537F470D66C9593118BCCB6 F38252826ACD957EF380D39F2F7956BC5DA04B5D
    17. PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    18. PHP_ASC_URL=https://www.php.net/get/php-7.3.12.tar.xz.asc/from/this/mirror
    19. DB_ENV_MARIADB_VERSION=1:10.6.5+maria~focal
    20. PHP_URL=https://www.php.net/get/php-7.3.12.tar.xz/from/this/mirror
    21. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    22. DZ_URL=https://www.discuz.net/daily/?dl=DZX-SC_UTF8-v3.5-202102010500-34d24c9b.zip
    23. DB_PORT_3306_TCP_ADDR=172.17.0.2
    24. DZ_WWW_ROOT=/var/www/html
    25. DB_ENV_MYSQL_ROOT_PASSWORD=123456
    26. PHPIZE_DEPS=autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c
    27. PWD=/var/www/html
    28. DB_ENV_GOSU_VERSION=1.14
    29. PHP_SHA256=aafe5e9861ad828860c6af8c88cdc1488314785962328eb1783607c1fdd855df
    30. DB_PORT_3306_TCP_PORT=3306
    31. APACHE_ENVVARS=/etc/apache2/envvars
    32. DB_PORT_3306_TCP_PROTO=tcp

            2>.  自动更新/etc/hosts文件:Docker自动添加host信息到父容器的/etc/hosts文件中。

    1. [root@node1 ~]# docker run -it -p 88:80 --link mysql:db --name discuz tencentci/discuz /bin/bash
    2. root@0ea422e21f40:/var/www/html# 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.2 db e74c62c3881f mysql
    10. 172.17.0.13 0ea422e21f40

  • 相关阅读:
    【JavaEE】初识网络
    error LNK2001: 无法解析的外部符号 “public: __thiscall std::
    Minio安装
    【Spring Boot 3】的安全防线:整合 【Spring Security 6】
    MyBatisPlus-多记录操作及逻辑删除
    Coding:小写一个debugfs
    黑客常见攻击方法与防护方法
    mac 和 windows 相互传输文件【共享文件夹】
    【Linux】I/O多路复用-SELECT/POLL/EPOLL
    TS —— TS中的面向对象
  • 原文地址:https://blog.csdn.net/NancyLCL/article/details/128014269