Docker同一台宿主机容器通信-通过容器名称互联

简介: 本文详细介绍了如何通过容器名称实现同一宿主机上容器间的互联,并提供了实战案例。首先,文章解释了容器间通过自定义名称访问的原理,随后演示了创建并连接Tomcat与Nginx容器的具体步骤。此外,还讨论了配置中可能出现的问题及解决方案,包括避免硬编码IP地址和使用自定义容器别名来增强系统的灵活性与可维护性。通过这些实践,展示了如何高效地配置容器间通信,确保服务稳定可靠。

作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.通过容器名称互联概述

  即在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,比如一个业务前端静态页面使用nginx,动态页面使用的是tomcat,由于容器在启动的时候其内部IP地址是DHCP随机分配的,所以如果通过内部访问的话,自定义名称是相对比较固定的,因此比较适合于此场景。

二.通过容器名称互联实战案例

1>.创建一个tomcat容器(镜像制作可参考我之前的笔记:https://www.cnblogs.com/yinzhengjie/p/12230043.html)

[root@docker101.yinzhengjie.org.cn ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
centos-haproxy           v1.8.20             1858fe05d96f        8 days ago          606MB
registry                 latest              708bc6af7e5e        8 days ago          25.8MB
tomcat-app01             v0.1                bf45c22f2d5b        8 days ago          983MB
tomcat-base              8.5.50              9ff79f369094        10 days ago         968MB
jdk-base                 1.8.0_231           0f63a97ddc85        10 days ago         953MB
centos-base              7.6.1810            b4931fd9ace2        10 days ago         551MB
centos                   centos7.6.1810      f1cb7c7d58b7        10 months ago       202MB
lorel/docker-stress-ng   latest              1ae56ccafe55        3 years ago         8.1MB
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container run -it -d --name tomcat-app01 tomcat-app01:v0.1 
36315d1b0cb52beecd474121ae697c551ff7a51468f9600c228be18c02fc336d
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container exec -it 36315d1b0cb52beecd474121ae697c551ff7a51468f9600c228be18c02fc336d bash
[root@36315d1b0cb5 /]# 
[root@36315d1b0cb5 /]# 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    36315d1b0cb5
[root@36315d1b0cb5 /]# 
[root@36315d1b0cb5 /]# ping 36315d1b0cb5 -c 2
PING 36315d1b0cb5 (172.17.0.2) 56(84) bytes of data.
64 bytes from 36315d1b0cb5 (172.17.0.2): icmp_seq=1 ttl=64 time=0.085 ms
64 bytes from 36315d1b0cb5 (172.17.0.2): icmp_seq=2 ttl=64 time=0.032 ms

--- 36315d1b0cb5 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.032/0.058/0.085/0.027 ms
[root@36315d1b0cb5 /]# 
[root@36315d1b0cb5 /]# exit 
exit
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
36315d1b0cb5        tomcat-app01:v0.1   "/yinzhengjie/softwa…"   About a minute ago   Up About a minute   8080/tcp, 8443/tcp   tomcat-app01
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]#

2>.创建一个nginx容器(镜像制作可参考我之前的笔记:https://www.cnblogs.com/yinzhengjie/p/12198878.html)时使用"--link"选项和上面创建的tomcat容器互联

[root@docker101.yinzhengjie.org.cn ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
nginx                    v0.1-20200201       1a8b4f68e96a        22 minutes ago      449MB
centos-haproxy           v1.8.20             1858fe05d96f        8 days ago          606MB
registry                 latest              708bc6af7e5e        8 days ago          25.8MB
tomcat-app01             v0.1                bf45c22f2d5b        8 days ago          983MB
tomcat-base              8.5.50              9ff79f369094        10 days ago         968MB
jdk-base                 1.8.0_231           0f63a97ddc85        10 days ago         953MB
centos-base              7.6.1810            b4931fd9ace2        10 days ago         551MB
centos                   centos7.6.1810      f1cb7c7d58b7        10 months ago       202MB
lorel/docker-stress-ng   latest              1ae56ccafe55        3 years ago         8.1MB
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container run -it -d --name nginx-web01 --link tomcat-app01 -p 80:80 nginx:v0.1-20200201 
8e05fc399edd16fe5bde32bebba269c0a07a0a1a928b46421693dd7ee4943ebf
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container ps 
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                         NAMES
8e05fc399edd        nginx:v0.1-20200201   "nginx"                  23 seconds ago      Up 22 seconds       0.0.0.0:80->80/tcp, 443/tcp   nginx-web01
36315d1b0cb5        tomcat-app01:v0.1     "/yinzhengjie/softwa…"   34 minutes ago      Up 34 minutes       8080/tcp, 8443/tcp            tomcat-app01
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container exec -it nginx-web01 bash
[root@8e05fc399edd /]# 
[root@8e05fc399edd /]# 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    tomcat-app01 36315d1b0cb5
172.17.0.3    8e05fc399edd
[root@8e05fc399edd /]# 
[root@8e05fc399edd /]# ping tomcat-app01 -c 1
PING tomcat-app01 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat-app01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.051 ms

--- tomcat-app01 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.051/0.051/0.051/0.000 ms
[root@8e05fc399edd /]# 
[root@8e05fc399edd /]# exit 
exit
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]#

3>.进入nginx容器编辑nginx的配置文件反向代理tomcat服务

[root@docker101.yinzhengjie.org.cn ~]# docker container ps 
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                         NAMES
8e05fc399edd        nginx:v0.1-20200201   "nginx"                  About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, 443/tcp   nginx-web01
36315d1b0cb5        tomcat-app01:v0.1     "/yinzhengjie/softwa…"   35 minutes ago       Up 35 minutes       8080/tcp, 8443/tcp            tomcat-app01
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container exec -it nginx-web01 bash
[root@8e05fc399edd /]# [root@8e05fc399edd /]# vim /etc/nginx/nginx.conf
[root@8e05fc399edd /]# 
[root@8e05fc399edd /]# cat /etc/nginx/nginx.conf
user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;

daemon off;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format my_access_json '{"@timestamp":"$time_iso8601",' 
                              '"host":"$server_addr",' 
                              '"clientip":"$remote_addr",' 
                          '"size":$body_bytes_sent,' 
                             '"responsetime":$request_time,' 
                             '"upstreamtime":"$upstream_response_time",' 
                             '"upstreamhost":"$upstream_addr",' 
                              '"http_host":"$host",' 
                             '"uri":"$uri",' 
                             '"domain":"$host",' 
                             '"xff":"$http_x_forwarded_for",' 
                         '"referer":"$http_referer",' 
                             '"tcp_xff":"$proxy_protocol_addr",' 
                             '"http_user_agent":"$http_user_agent",' 
                             '"status":"$status"}';

    access_log /var/log/nginx/access_json.log my_access_json;

    sendfile            on;
    keepalive_timeout   65;
    include       mime.types;
    default_type  text/html;
    charset utf-8;

    upstream tomcat {
    server 172.17.0.2:8080;
    }

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;

        location / {   
    }

    location /app01 {
        proxy_pass http://tomcat;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;    
    }

        error_page 404 /404.html;             
        location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}
[root@8e05fc399edd /]# 
[root@8e05fc399edd /]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@8e05fc399edd /]# 
[root@8e05fc399edd /]# nginx -s reload
[root@8e05fc399edd /]#

4>.浏览器访问Nginx的web页面(http://docker101.yinzhengjie.org.cn/)

5>.浏览器访问Tomcat的web页面(http://docker101.yinzhengjie.org.cn/app01/)

三.通过容器名称互联的注意事项

1>.思考第二步存在的问题

  先不要往下看,请闭眼10秒钟思考上面的配置可能会存在哪些故障问题,经过激烈的思考后再往下看咱们是否想到一起去了?  

  问题一:  
    nginx的配置文件中在upstream中写死了后端容器的IP地址.  
    问题剖析:  
      这样有一个致命的缺陷就是可移植性差,我们将该容器提交为镜像后再其它节点上运行很可能分配的容器IP地址不同会导致后端服务无法正常访问.  
    解决方案:  
      在配置文件中写后端服务器的主机名称,这样不管IP地址怎么变动都不用修改nginx的配置文件,只需要修改"/etc/hosts"文件将后端服务器主机的IP地址改成对应的IP地址即可(在新启动的容器这个操作是自动完成的).  

  问题二:  
    代码升级时可能后端容器的名称发生变动.  
    问题刨析:  
      这是一个让人和头疼的问题,尽管我们上面解决了写死IP地址的问题,但是后端的主机名一直频繁的改动那意味这我们依旧得重新nginx的配置文件.  
    解决方案:  
      在使用"--link"通过容器名称互联时我们可以自定义容器别名,使用容器别名在"/etc/hosts"文件中解析的后端服务器主机名是咱们自定义的后端主机名.

2>.通过自定义容器别名互联案例

[root@docker101.yinzhengjie.org.cn ~]# docker container run -it -d --name nginx-web02 --link tomcat-app01:www.yinzhengjie.org.cn -p 81:80 nginx:v0.1-20200201 
d5d2b409cc0c20486a1d454d6b26fdc398dae93df9c128577c95fdbbc617d868
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container ps 
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                         NAMES
d5d2b409cc0c        nginx:v0.1-20200201   "nginx"                  8 seconds ago       Up 7 seconds        443/tcp, 0.0.0.0:81->80/tcp   nginx-web02
8e05fc399edd        nginx:v0.1-20200201   "nginx"                  51 minutes ago      Up 51 minutes       0.0.0.0:80->80/tcp, 443/tcp   nginx-web01
36315d1b0cb5        tomcat-app01:v0.1     "/yinzhengjie/softwa…"   About an hour ago   Up About an hour    8080/tcp, 8443/tcp            tomcat-app01
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]# docker container exec -it nginx-web02 bash
[root@d5d2b409cc0c /]# 
[root@d5d2b409cc0c /]# 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    www.yinzhengjie.org.cn 36315d1b0cb5 tomcat-app01
172.17.0.4    d5d2b409cc0c
[root@d5d2b409cc0c /]# 
[root@d5d2b409cc0c /]# ping www.yinzhengjie.org.cn -c 3
PING www.yinzhengjie.org.cn (172.17.0.2) 56(84) bytes of data.
64 bytes from www.yinzhengjie.org.cn (172.17.0.2): icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from www.yinzhengjie.org.cn (172.17.0.2): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from www.yinzhengjie.org.cn (172.17.0.2): icmp_seq=3 ttl=64 time=0.040 ms

--- www.yinzhengjie.org.cn ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.040/0.066/0.100/0.025 ms
[root@d5d2b409cc0c /]# 
[root@d5d2b409cc0c /]# exit 
exit
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]#

3>.修改nginx的配置文件

[root@docker101.yinzhengjie.org.cn ~]# docker container exec -it nginx-web02 bash
[root@d5d2b409cc0c /]# 
[root@d5d2b409cc0c /]# vim /etc/nginx/nginx.conf
[root@d5d2b409cc0c /]# 
[root@d5d2b409cc0c /]# cat /etc/nginx/nginx.conf
user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;

daemon off;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format my_access_json '{"@timestamp":"$time_iso8601",' 
                              '"host":"$server_addr",' 
                              '"clientip":"$remote_addr",' 
                         '"size":$body_bytes_sent,' 
                             '"responsetime":$request_time,' 
                             '"upstreamtime":"$upstream_response_time",' 
                             '"upstreamhost":"$upstream_addr",' 
                              '"http_host":"$host",' 
                            '"uri":"$uri",' 
                             '"domain":"$host",' 
                             '"xff":"$http_x_forwarded_for",' 
                        '"referer":"$http_referer",' 
                             '"tcp_xff":"$proxy_protocol_addr",' 
                             '"http_user_agent":"$http_user_agent",' 
                             '"status":"$status"}';

    access_log /var/log/nginx/access_json.log my_access_json;

    sendfile            on;
    keepalive_timeout   65;
    include       mime.types;
    default_type  text/html;
    charset utf-8;

    upstream tomcat {
    server www.yinzhengjie.org.cn:8080;
    }

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;

        location / {   
    }

    location /app01 {
        proxy_pass http://tomcat;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;    
    }

        error_page 404 /404.html;             
        location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}
[root@d5d2b409cc0c /]# 
[root@d5d2b409cc0c /]# exit 
exit
[root@docker101.yinzhengjie.org.cn ~]# 
[root@docker101.yinzhengjie.org.cn ~]#
目录
相关文章
|
16天前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
198 69
|
4天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
6天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
16天前
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
|
11天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
33 4
|
12天前
|
存储 Docker 容器
Docker中容器间的通信方式有哪些13
Docker中容器间的通信方式有哪些13
15 4
|
7天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
8天前
|
Cloud Native 持续交付 Docker
深入解析Docker容器化技术及其在生产环境中的应用
深入解析Docker容器化技术及其在生产环境中的应用
10 0
|
9天前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
23 0
|
10天前
|
Shell Docker 容器
10-19|使用date命令: 你可以在容器内使用date命令来设置时间,但为了防止这个更改影响宿主机,你不能以特权模式运行容器。我没有加特权模式的时候,使用此命令告诉我没权限啊
10-19|使用date命令: 你可以在容器内使用date命令来设置时间,但为了防止这个更改影响宿主机,你不能以特权模式运行容器。我没有加特权模式的时候,使用此命令告诉我没权限啊
下一篇
无影云桌面