Docker如何使⽤link建⽴容器之间的连接
我们在使⽤Docker的时候,经常可能需要连接到其他的容器,⽐如:web服务需要连接数据库。按照往常的做法,需要先启动数据库的容器,映射出端⼝来,然后配置好客户端的容器,再去访问。其实针对这种场景,Docker提供了--link 参数来满⾜。
这⾥使⽤数据库服务器和客户端的例⼦来介绍下--link的⽤法。
⼀创建容器
这⾥需要创建MySQL服务端和客户端的容器
MySQL 服务端的Dockerfile:
FROM centos:centos6
MAINTAINER David "xx@xx"
RUN yum install -y mysql-server mysql
RUN /etc/init.d/mysqld start
RUN mysql -e "grant all privileges on *.* to 'root'@'%' identified by '1234';"
RUN mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '1234';"
EXPOSE 3306
CMD ["/usr/bin/mysqld"]
MySQL客户端的Dockerfile:
FROM centos:centos6
MAINTAINER David "xx@xx"
RUN yum install -y mysql
根据Dockerfile来创建images
David@MacBook-Pro-3 ~$ docker build -t hzc/mysql_server  /path/mysql_server/Dockerfile
David@MacBook-Pro-3 ~$ docker build -t hzc/mysql_client  /path/mysql_client/Dockerfile
image构建执⾏结束之后,执⾏docker image|greo hzc,可以看到:
David@MacBook-Pro-3 ~$ docker image|grep hzc
hzc/mysql_client    latest      62cfe52e02bf    2 days ago    289 MB
hzc/mysql_server    latest      83c64aba0805    2 days ago    377.9 MB
⼆启动容器
启动MySQL服务端的容器
David@MacBook-Pro-3 ~$ docker run -d -P --name=mysql_server hzc/mysql_server
David@MacBook-Pro-3 ~$ b5e097fe510d8f258dd82c48a2f6aa4c279e227c4472e42d3e9956ac419ae73c
启动MySQL客户端容器
David@MacBook-Pro-3 ~$ docker run --name=mysql_client1 --link=mysql_server:db -i -t hzc/mysql_client mysql -h db -uroot -p1234
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
查看进程
David@MacBook-Pro-3 ~$ docker ps
CONTAINER ID    IMAGE        COMMAND        CREATED      STATUS      PORTS          NAMES
213285ec2663    hzc/mysql_client  "mysql -h db -uroot -"  2 minutes ago    Up 2 minutes                mysql_client1
b5e097fe510d    hzc/mysql_server  "/usr/bin/mysqld_safe"  4 minutes ago    Up 4 minutes    0.0.0.0:32768->3306/tcp  mysql_server
可以看到多了⼀个参数配置--link=mysql_server:db ,是告诉当前容器需要使⽤mysql_server容器,并命名为db。这⾥db就是mysql_server容器的别名。在后⾯连接数据库的时候是可以直接使⽤mysql -h db -uroot  -p1234来连接mysql数据库。
三原理
在这⾥可以看到创建了两个容器,mysql_client1和mysql_server。容器mysql_client1连接到了mysql_server,建⽴了⼀种⽗⼦关系。
查看⽗容器mysql_client1的环境变量
David@MacBook-Pro-3 ~$ docker exec -it 213285ec2663 bash
[root@213285ec2663 /]# env
HOSTNAME=213285ec2663
DB_NAME=/mysql_client1/db
TERM=xterm
DB_PORT=tcp://172.17.0.2:3306
DB_PORT_3306_TCP_PORT=3306
....
DB_PORT_3306_TCP_PROTO=tcp
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
DB_PORT_3306_TCP_ADDR=172.17.0.2
SHLVL=1
HOME=/root
DB_PORT_3306_TCP=tcp://172.17.0.2:3306container容器用法
no_proxy=*.local, 169.254/16
DB_ENV_no_proxy=*.local, 169.254/16
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/usr/bin/env
可以看到已经得到了容器mysql_server的环境变量,给出的是3306的端⼝,⽽不是映射出来的端⼝。
查看hosts
[root@213285ec2663 /]# cat /etc/hosts
127.0.0.1  localhost
....
172.17.0.2  db b5e097fe510d mysql_server
172.17.0.3  213285ec2663
可以看到两条hosts的配置,⼀个是数据库的ip对应的别名,容器ID,容器名称。另外⼀个是客户端对应的容器ID。所以这⾥可以使⽤别名连接到数据库服务端。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。