使用link在两个容器之间建立连接(mysql)

在使用Docker的时候我们会常常碰到这么一种应用,就是我需要两个或多个容器,其中某些容器需要使用另外一些容器提供的服务。比如这么一种情况:我们需要一个容器来提供mysql的数据库服务,而另外两个容器作为客户端来连接使用mysql数据库服务。下面我们就来看看Docker是怎样通过Link来实现这种功能的。

1. 这里我们首先创建两个容器image,一个用来模拟mysql数据库,另外一个使用mysql的client来模拟一些使用mysql服务的应用,这种应用可以是任何php,python,java等的应用。

1.1 先创建一个mysql_server目录并在其下创建一个Dockerfile文件,内容如下

  1. FROM centos:centos6
  2. MAINTAINER Fanbin Kong "[email protected]"
  3. RUN yum install -y mysql-server mysql
  4. RUN /etc/init.d/mysqld start &&\
  5. mysql -e "grant all privileges on *.* to ‘root‘@‘%‘ identified by ‘letmein‘;"&&\
  6. mysql -e "grant all privileges on *.* to ‘root‘@‘localhost‘ identified by ‘letmein‘;"&&\
  7. mysql -u root -pletmein -e "show databases;"
  8. EXPOSE 3306
  9. CMD ["/usr/bin/mysqld_safe"]
FROM centos:centos6
MAINTAINER Fanbin Kong "[email protected]"

RUN yum install -y mysql-server mysql

RUN /etc/init.d/mysqld start &&    mysql -e "grant all privileges on *.* to ‘root‘@‘%‘ identified by ‘letmein‘;"&&    mysql -e "grant all privileges on *.* to ‘root‘@‘localhost‘ identified by ‘letmein‘;"&&    mysql -u root -pletmein -e "show databases;"

EXPOSE 3306

CMD ["/usr/bin/mysqld_safe"]

然后根据Dockerfile来创建image

  1. sudo docker build -t kongxx/mysql_server .
sudo docker build -t kongxx/mysql_server .

1.2 创建一个mysql_client目录并在其下创建一个Dockerfile文件,内容如下

  1. FROM centos:centos6
  2. MAINTAINER Fanbin Kong "[email protected]"
  3. RUN yum install -y mysql
FROM centos:centos6
MAINTAINER Fanbin Kong "[email protected]"

RUN yum install -y mysql

然后根据Dockerfile来创建image

  1. sudo docker build -t kongxx/mysql_client .
sudo docker build -t kongxx/mysql_client .

1.3 创建完image之后,我们可以使用下面命令来查看结果

  1. $ sudo docker images | grep kongxx
  2. kongxx/mysql_client   latest                aa31f22f6fc5        2 hours ago         303.7 MB
  3. kongxx/mysql_server   latest                3b9b08c8dda4        2 hours ago         353.3 MB
$ sudo docker images | grep kongxx
kongxx/mysql_client   latest                aa31f22f6fc5        2 hours ago         303.7 MB
kongxx/mysql_server   latest                3b9b08c8dda4        2 hours ago         353.3 MB

2. 第二步是根据image来创建我们的应用场景

2.1 首先创建提供mysql数据库服务的容器

  1. sudo docker run --name=mysql_server -d -P kongxx/mysql_server
sudo docker run --name=mysql_server -d -P kongxx/mysql_server

2.2 分别创建两个使用上一步创建出来mysql数据库服务的容器

第一个应用容器

  1. sudo docker run --name=mysql_client1 --link=mysql_server:db -t -i kongxx/mysql_client /usr/bin/mysql -h db -u root -pletmein
sudo docker run --name=mysql_client1 --link=mysql_server:db -t -i kongxx/mysql_client /usr/bin/mysql -h db -u root -pletmein

第二个应用容器

  1. sudo docker run --name=mysql_client2 --link=mysql_server:db -t -i kongxx/mysql_client /usr/bin/mysql -h db -u root -pletmein
sudo docker run --name=mysql_client2 --link=mysql_server:db -t -i kongxx/mysql_client /usr/bin/mysql -h db -u root -pletmein

这里需要特别注意一下“–link=mysql_server:db”,这个参数就是告诉Docker容器需要使用“mysql_server”容器,并将其别名命名为db,这样在这两个容器里就可以使用“db”来作为提供mysql数据库服务的机器名。所以在最后启动参数里我们使用的是“/usr/bin/mysql -h db -u root -pletmein”来连接mysql数据库的。

2.3 运行完上面两个命令,我们就会在创建了两个mysql的client的容器,此时我们可以使用下面命令来查看状态

  1. sudo docker ps
  2. CONTAINER ID        IMAGE                        COMMAND                CREATED             STATUS              PORTS                     NAMES
  3. ac0c76c627c0        kongxx/mysql_client:latest   /usr/bin/mysql -h db   10 seconds ago      Up 9 seconds                                  mysql_client2
  4. 763c4825722d        kongxx/mysql_client:latest   /usr/bin/mysql -h db   41 minutes ago      Up 40 minutes                                 mysql_client
  5. 32f7839f7e9d        kongxx/mysql_server:latest   /usr/bin/mysqld_safe   About an hour ago   Up About an hour    0.0.0.0:49153->3306/tcp   mysql_client1/db,mysql_client2/db,mysql_server
sudo docker ps
CONTAINER ID        IMAGE                        COMMAND                CREATED             STATUS              PORTS                     NAMES
ac0c76c627c0        kongxx/mysql_client:latest   /usr/bin/mysql -h db   10 seconds ago      Up 9 seconds                                  mysql_client2
763c4825722d        kongxx/mysql_client:latest   /usr/bin/mysql -h db   41 minutes ago      Up 40 minutes                                 mysql_client
32f7839f7e9d        kongxx/mysql_server:latest   /usr/bin/mysqld_safe   About an hour ago   Up About an hour    0.0.0.0:49153->3306/tcp   mysql_client1/db,mysql_client2/db,mysql_server

这里注意一下最后一行,也就是mysql_server容器的“NAMES”列的内容“mysql_client/db,mysql_client2/db,mysql_server”,这就说明mysql_client1和mysql_client2都和db建立的连接。

本文转自http://blog.csdn.net/kongxx/article/details/38676917

当我做完这些步骤的时候,并没有出现所需要的答案,我以为我做错了,但是当我运行命令 docker ps --no-trunc的时候出现了mysql_client1/db,mysql_client2/db,mysql_client3/db,mysql_server。

时间: 2024-11-09 07:03:19

使用link在两个容器之间建立连接(mysql)的相关文章

Docker使用Link在容器之间建立连接

原文链接:Docker使用Link在容器之间建立连接 在使用Docker的时候我们会常常碰到这么一种应用,就是我需要两个或多个容器,其中某些容器需要使用另外一些容器提供的服务.比如这么一种情况:我们需要一个容器来提供mysql的数据库服务,而另外两个容器作为客户端来连接使用mysql数据库服务.下面我们就来看看Docker是怎样通过Link来实现这种功能的. 1. 这里我们首先创建两个容器image,一个用来模拟mysql数据库,另外一个使用mysql的client来模拟一些使用mysql服务的

Docker学习笔记(9-2)Docker容器之间的连接

学习目标: 容器之间的连接 准备工作 FROM ubuntu:14.04 RUN apt-get install -y ping RUN apt-get update RUN apt-get install -y nginx RUN pat-get install -y curl EXPOSE 80 CMD /bin/bash #构建测试镜像 docker build -t lexiaofei/cct . 1.允许所有容器互联 --icc=true 默认 $ docker run -it --n

Linux两台主机之间建立信任

背景: 有时候我们在两个主机之间复制文件的时候,提示输入密码,很不方便,那如何免密码复制呢?,就是使用通过linux公钥和秘钥,建立双机信任关系. 1. 生成秘钥,并添加信任 我的环境中node1的ip是192.168.168.201,node2的ip是192.168.168.202. [[email protected] ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa #生成rsa [[email protected] ~]# ssh-copy-id

使用docker-compose编写常规的lnmp容器,pdo连接mysql失败。

问题的核心是yii2 是通过pdo的方式去连接数据的.但是我们通过容器去搭建lnmp环境时,nginx , php , mysql 这三个服务是独立的三个容器,彼此隔离.所以在yii2中连接mysql服务器的时候不能写"localhost" 或者 "127.0.0.1"等主机,而是你的容器名 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a8c025a080f5 nginx:latest "ng

两台服务器之间的互链

补之前发过的. 如有错误的地方还请评论留下意见,感谢. 首先说需求:想把服务器1的数据库B中的mf_fx的表的数据同步到服务器2的数据库B中的mf_fx表中. 当然,用navicat的数据传输可以实现这个功能,或者用备份文件也可以实现这个功能.但是当传输的数据有条件时navicat就不怎么好使,备份文件又嫌麻烦.那么我们就可以用服务器1和2之间建立连接.直接insert into 服务器2的表select  from 服务器1的表. 我的数据库版本是08 r2 sp3 可以先在sys.serve

Docker & ASP.NET Core (4):容器间的连接

原文:Docker & ASP.NET Core (4):容器间的连接 第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用容器名进行连接,实际上它创建了一个桥接的网络,在这个网络里,容器间可以进行通信. 把容器添加到桥接网络:这种方式是创建了一个自定义的桥接网络,它的类型是isolated network(隔离网络),只有在这个网络里的容器才能互相

为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?

看到了一道面试题:"为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?",想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章,希望对你们有所帮助. TCP 连接 我们先来补一下基础什么是 TCP 协议?传输控制协议( Transmission Control Protocol, TCP )是种面向连接.确保数据在端到端间可靠传输的协议.面向连接是插在发送数据前,需要先建立一条虚拟的链路,然后让数据在这条链路上"流动&qu

docker中两个容器间的互访

在前几篇文章中,我们讨论了如何在Ubuntu14.04(64位)中安装docker,以及如何在docker中部署一个apache服务器并在外部电脑中访问该服务器,和在docker中部署 一个mysql数据库并在外部电脑中访问这个数据库. 下面来讨论下docker的容器间的互访,主要以两个容器间的mysql数据库互访为例. 有时候,两个启动的容器之间是需要交流的,比如我们在一个容器中运行了一个apache服务器,上面有一个网站,然后网站的数据库我们就可以部署在另外一个容器中.或者两个容器都部署了数

理解容器之间的连通性 - 每天5分钟玩转 Docker 容器技术(34)

通过前面小节的实践,当前 docker host 的网络拓扑结构如下图所示,今天我们将讨论这几个容器之间的连通性. 两个 busybox 容器都挂在 my_net2 上,应该能够互通,我们验证一下: 可见同一网络中的容器.网关之间都是可以通信的. my_net2 与默认 bridge 网络能通信吗? 从拓扑图可知,两个网络属于不同的网桥,应该不能通信,我们通过实验验证一下,让 busybox 容器 ping httpd 容器: 确实 ping 不通,符合预期. "等等!不同的网络如果加上路由应该