阿里云部署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 root@iZ28ikebrg6Z:~#需要注意的是,容器的名字需要是唯一的。不能够有冲突。如果你想容器停止后就放弃这个名字,那么你可以在运行的时候加入选项 --rm
容器连接之后就可以相互交流数据,例如包含web的容器,它可以连接到一个包含数据库的容器,然后由数据容器给它提供数据存储。
连接是--link name:alias 其中name是我们要连接的容器,比如一个数据库容器mysql,而alias是这个连接的名称。
我们先执行命令,然后解释:
root@iZ28ikebrg6Z:~# docker stop 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 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 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
好。容器的连接就到这里。到实战的时候记得有这么回事就可以。
下一代容器工具 Podman 与 Docker 的比较 `Podman` 与 `Docker` 最大的差别之一,`Podman` 是一种无守护程序的容器引擎,它控制下的容器既可以由 `root` 用户运行,也可以由非特权用户运行,而 Docker 控制下的容器只能由 `root` 用户运行。
相关文章
- 刚拿到offer入职就让我搞Docker容器部署,这怎么玩?
- docker部署web项目_小钢炮docker安装web
- Docker:第六章:Docker部署项目
- Docker:第二章:部署项目,对镜像,容器的操作
- 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践
- SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战
- 【前端部署附录一】写给前端的 docker 使用指南
- [接上篇]在Window10/11的Linux子系统Docker上部署VB.NET Asp.Net Core WebAPI应用
- docker 启动失败:Failed to start Docker Application Container Engine
- Docker系列(2):容器给部署带来的快乐
- Docker删除容器命令(docker rm)
- 2023-01-07:hyper/docker-registry-web是registry的web界面工具之一。请问部署在k3s中,yaml如何写?
- 同宿主机暴露多个docker容器IP
- docker-compose容器编排部署
- Docker+Nginx打包部署前后端分离项目
- springboot整合docker部署(两种构建Docker镜像方式)详解编程语言
- Docker 容器化部署Redis服务(dockerredis)
- 极速搭建Redis服务——使用Docker容器化部署(dockerredis)
- Docker容器构建轻松部署Redis(dockerredis)
- 使用Docker容器部署Redis服务(dockerredis)
- Docker容器应用:部署Redis(dockerredis)
- Docker化Redis:快速实现容器化部署(dockerredis)