初识docker—容器连接

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 连接容器 在使用 Docker 部分, 我们谈到了如何通过网络端口来访问运行在 Docker 容器内的服务。这是与docker容器内运行应用程序交互的一种方法。

连接容器

在使用 Docker 部分, 我们谈到了如何通过网络端口来访问运行在 Docker 容器内的服务。这是与docker容器内运行应用程序交互的一种方法。在本节中,我们打算通过端口连接到一个docker容器,并向您介绍容器连接概念。

网络端口映射

使用docker部分,我们创建了一个python应用的容器。

$ sudo docker run -d -P training/webapp python app.py

注:容器有一个内部网络和IP地址(在使用Docker部分我们使用docker inspect命令显示容器的IP地址)。Docker可以有各种网络配置方式。你可以再这里学到更多docker网络信息。

我们使用-P标记创建一个容器,将容器的内部端口随机映射到主机的高端口4900049900。这时我们可以使用docker ps来看到端口5000绑定主机端口49155

$ sudo docker ps nostalgic_morse

CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES

bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

我们也可以使用-p标识来指定容器端口绑定到主机端口

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

我们看这为什么不是一个好的主意呢?因为它限制了我们容器的一个端口。

我们还有很多设置-p标识的方法。默认-p标识会绑定本地主机上的指定端口。并且我们可以指定绑定的网络地址。举例设置localhost

$ sudo docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py

这将绑定容器内部5002端口到主机的localhost或者127.0.0.15001端口。

如果要绑定容器端口5002到宿主机动态端口,并且让localhost访问,我们可以这样做:

$ sudo docker run -d -p 127.0.0.1::5002 training/webapp python app.py

我们也可以绑定UDP端口,我们可以在后面添加/udp,举例:

$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

我们可以使用docker port快捷方式来绑定我们的端口,这有助于向我们展示特定的端口。例如我们绑定localhost,如下是docker port输出:

$ docker port nostalgic_morse 5000

127.0.0.1:49155

注:-p可以使用多次配置多个端口。

Docker容器连接

端口映射并不是唯一把docker连接到另一个容器的方法。docker有一个连接系统允许将多个容器连接在一起,共享连接信息。docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。

容器命名

执行此连接需要依靠你的docker的名字,这里我们可以看到当我们创建每一个容器的时候,它都会自动被命名。事实上我们已经熟悉了老的nostalgic_morse指南。你也可以自己命名容器。这种命名提供了两个有用的功能:

  • 1.给容器特定的名字使你更容易记住他们,例如:命名web应用程序为web容器。
  • 2.它为docker提供一个参考,允许其他容器引用,举例连接web容器到db容器。

你可以使用--name标识来命名容器,举例:

$ sudo docker run -d -P --name web training/webapp python app.py

我们可以看到我们启动了的容器,就是我们使用--name标识命名为web的容器。我们可以使用docker ps命令来查看容器名称。

$ sudo docker ps -l

CONTAINER ID  IMAGE                  COMMAND        CREATED       STATUS       PORTS                    NAMES

aed84ee21bde  training/webapp:latest python app.py  12 hours ago  Up 2 seconds 0.0.0.0:49154->5000/tcp  web

我们也可以使用docker inspect来返回容器名字。

$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde

/web

注:容器的名称必须是唯一的。这意味着你只能调用一个web容器。如果你想使用重复的名称来命名容器,你需要使用docker rm命令删除以前的容器。在容器停止后删除。

容器连接

连接允许容器之间可见并且安全地进行通信。使用--link创建连接。我们创建一个新容器,这个容器是数据库。

$ sudo docker run -d --name db training/postgres

这里我们使用training/postgres容器创建一个新的容器。容器是PostgreSQL数据库。

现在我们创建一个web容器来连接db容器。

$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

这将使我们的web容器和db容器连接起来。--link的形式

--link name:alias

name是我们连接容器的名字,aliaslink的别名。让我们看如何使用alias

让我们使用docker ps来查看容器连接.

$ docker ps

CONTAINER ID  IMAGE                     COMMAND               CREATED             STATUS             PORTS                    NAMES

349169744e49  training/postgres:latest  su postgres -c '/usr  About a minute ago  Up About a minute  5432/tcp                 db

aed84ee21bde  training/webapp:latest    python app.py         16 hours ago        Up 2 minutes       0.0.0.0:49154->5000/tcp  db/web,web

我们可以看到我们命名的容器,dbweb,我们还在名字列中可以看到web容器也显示db/web。这告诉我们web容器和db容器是父/子关系。

我们连接容器做什么?我们发现连接的两个容器是父子关系。这里的父容器是db可以访问子容器web。为此docker在容器之间打开一个安全连接隧道不需要暴露任何端口在容器外部。你会注意到当你启动db容器的时候我们没有使用-P或者-p标识。我们连接容器的时候我们不需要通过网络给PostgreSQL数据库开放端口。

Docker在父容器中开放子容器连接信息有两种方法:

  • 环境变量
  • 更新/etc/hosts文件。

让我们先看看docker的环境变量。我们运行env命令来查看列表容器的环境变量。

 $ sudo docker run --rm --name web2 --link db:db training/webapp env

        . . .

    DB_NAME=/web2/db

    DB_PORT=tcp://172.17.0.5:5432

    DB_PORT_5000_TCP=tcp://172.17.0.5:5432

    DB_PORT_5000_TCP_PROTO=tcp

    DB_PORT_5000_TCP_PORT=5432

    DB_PORT_5000_TCP_ADDR=172.17.0.5

       . . .

注:这些环境变量只设置顶一个进程的容器。同样,一些守护进程(例如sshd)进行shell连接时就会去除。

我们可以看到docker为我们的数据库容器创建了一系列环境变量。每个前缀变量是DB_填充我们指定的别名。如果我们的别名是db1,前缀别名就是DB1_。您可以使用这些环境变量来配置您的应用程序连接到你的数据库db容器。该连接时安全、私有的,只能在web容器和db容器之间通信。

docker除了环境变量,可以添加信息到父主机的/etc/hosts

root@aed84ee21bde:/opt/webapp# cat /etc/hosts

172.17.0.7  aed84ee21bde

. . .

172.17.0.5  db

这里我们可以看到两个主机项。第一项是web容器用容器ID作为主机名字。第二项是使用别名引用IP地址连接数据库容器。现在我们试试ping这个主机:

root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping

root@aed84ee21bde:/opt/webapp# ping db

PING db (172.17.0.5): 48 data bytes

56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms

56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms

56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

注:我们不得不安装ping,因为容器内没有它。

我们使用ping命令来pingdb容器,使用它解析到127.17.0.5主机。我们可以利用这个主机项配置应用程序来使用我们的db容器。

注:你可以使用一个父容器连接多个子容器。例如,我们可以有多个web容器连接到我们的db数据库容器。

下一步

现在我们已经学会如何连接容器了,下一步我们学习融合管理数据、卷标和如果在容器内挂载。

 

目录
相关文章
|
23天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
2天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
116 77
|
4天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
27 3
|
10天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
38 6
|
10天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
20 5
|
10天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
31 3
|
10天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
20 2
|
15天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
46 5
|
17天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
19天前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。