阿里云部署Docker(7)----将容器连接起来

简介:

路遥知马力,日久见人心。恩。该坚持的还是要坚持。

今天看到一个迅雷的师弟去了阿里,祝福他,哎,虽然老是被人家捧着叫大牛,我说不定通过不了人家的面试呢,哎,心有羞愧。 

本文为本人原创,转载请表明来源:http://blog.csdn.net/minimicall

我们在阿里云上部署Docker服务系列教程已经到了第7节,

需要回顾的同学可以翻看我的博客。

今天,我们学习一下怎么将docker里面的容器连接起来。例如我是一个web服务,我需要用到mysql服务,如果它们属于不同的容器内,如果连接。这就是我们这节课要解决的问题。

连接的第一步是为我们的容器命名

容器命名

容器命名是在run的选项里面--name 具体如下:

root@iZ28ikebrg6Z:~# docker run -d -P --name web training/webapp python app.py
ca9d0b6245e0451e911ac03ef3d2b7748120a55d29c2d8b3cc9d9cd6e4ad0148
root@iZ28ikebrg6Z:~# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 11224 11210  0  80   0 -  5601 wait   pts/1    00:00:00 bash
0 R     0 11907 11224  0  80   0 -  2121 -      pts/1    00:00:00 ps
root@iZ28ikebrg6Z:~# docker ps -l
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
ca9d0b6245e0        training/webapp:latest   "python app.py"     15 seconds ago      Up 14 seconds       0.0.0.0:49153->5000/tcp   web                 
root@iZ28ikebrg6Z:~# 
我们可以详细的了解这个容器的底层信息:

root@iZ28ikebrg6Z:~# docker inspect --help

Usage: docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]

Return low-level information on a container or image

  -f, --format=""    Format the output using the given go template.
root@iZ28ikebrg6Z:~# docker inspect -f "{{.Name}}" ca9
/web
root@iZ28ikebrg6Z:~# 
需要注意的是,容器的名字需要是唯一的。不能够有冲突。如果你想容器停止后就放弃这个名字,那么你可以在运行的时候加入选项 --rm


容器连接

容器连接之后就可以相互交流数据,例如包含web的容器,它可以连接到一个包含数据库的容器,然后由数据容器给它提供数据存储。

连接是--link name:alias  其中name是我们要连接的容器,比如一个数据库容器mysql,而alias是这个连接的名称。

我们先执行命令,然后解释:

root@iZ28ikebrg6Z:~# docker stop web
web
root@iZ28ikebrg6Z:~# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
sameersbn/redmine      latest              f0bec095f291        6 hours ago         614.6 MB
sameersbn/gitlab       latest              bf5c375d9057        3 days ago          635.1 MB
sameersbn/postgresql   latest              24a6064fa4cd        11 days ago         142.1 MB
training/webapp        latest              31fa814ba25a        4 months ago        278.8 MB
sameersbn/redmine      2.4.2               b95b8046d47c        8 months ago        1.327 GB
root@iZ28ikebrg6Z:~# docker run -d --name db sameersbn/postgresql
a9dbca9857fddbe366ce76909943e856eecc12df27886830e43fe5c91a53abc7
root@iZ28ikebrg6Z:~# docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS               NAMES
a9dbca9857fd        sameersbn/postgresql:latest   "/start"            5 seconds ago       Up 3 seconds        5432/tcp            db                  
root@iZ28ikebrg6Z:~# docker rm -f web
web
root@iZ28ikebrg6Z:~# docker run -d -P --name web --link db:db training/webapp python app.py
ff990b53706d0a1277c1ba37b274c397ba906ba8ea28e9d9b57e78f84ef12d93
root@iZ28ikebrg6Z:~# docker ps --no-trunc | awk '{print $NF}'
NAMES
web
db,web/db
root@iZ28ikebrg6Z:~# 

我们连接的是sameersbn/postgresql 这也是个数据库,是我不小心下载下来的,没有mysql。拿着用吧,会出错再说。

好,连是连接起来了,可是如何交互数据呢?因为到现在位置我们只是看到多了个--link 选项而已,假如我要使用数据库,我总得增删改查啊。

docker提供两种方式,一种是环境变量,一种是改/etc/hosts

环境变量

当一个连接产生之后,docker首先会为每个连接产生一个环境变量<alias>_NAME,例如刚才的连接 --link db:db,则有

db_NAME=/web/db
还有,一些源容器暴露的端口。这部分我直接贴官网的说明,或许更能够讲清楚,大家自行理解。


<name>_PORT_<port>_<protocol> will contain a URL reference to the port. Where <name> is the alias name specified in the --link parameter (e.g. webdb), <port> is the port number being exposed, and <protocol> is either TCP or UDP. The format of the URL will be: <protocol>://<container_ip_address>:<port> (e.g. tcp://172.17.0.82:8080). This URL will then be split into the following 3 environment variables for convinience:
<name>_PORT_<port>_<protocol>_ADDR will contain just the IP address from the URL (e.g. WEBDB_PORT_8080_TCP_ADDR=172.17.0.82).
<name>_PORT_<port>_<protocol>_PORT will contain just the port number from the URL (e.g. WEBDB_PORT_8080_TCP_PORT=8080).
<name>_PORT_<port>_<protocol>_PROTO will contain just the protocol from the URL (e.g. WEBDB_PORT_8080_TCP_PROTO=tcp).

设置环境变量的方法为:

 $ 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_5432_TCP=tcp://172.17.0.5:5432
    DB_PORT_5432_TCP_PROTO=tcp
    DB_PORT_5432_TCP_PORT=5432
    DB_PORT_5432_TCP_ADDR=172.17.0.5

还有另一种方法是更改目标容器中的hosts文件,在这个文件中加入源容器

/etc/hosts


具体如下:

$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db
可以实验一下是否能够联通

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
就算源容器重启,它也会自动更新

$ sudo docker restart db
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.9  db


好。容器的连接就到这里。到实战的时候记得有这么回事就可以。




相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
9月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
4005 4
|
9月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
421 5
|
9月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
2756 8
|
9月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
917 6
|
9月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
845 6
|
Linux Docker 容器
Docker操作 :容器命令
Docker操作 (四)
489 56
|
应用服务中间件 Shell nginx
Docker容器操作基础命令
关于Docker容器操作基础命令的教程,涵盖了从启动、查看、删除容器到端口映射和容器信息获取的一系列常用命令及其使用方法。
632 16