从 java docker 容器连接到 percona docker

Connecting to percona docker from a java docker container

我知道有很多类似的问题,但其中 none 是我想要的。我正在关注 this,因为我特别需要 5.5,至少现在是这样。我的 java 项目(访问 mysql)在我用

构建的容器中

docker build -t projectname-testing .

Dockerfile 非常标准,它只是复制构建的 tarball 并将其解压缩到特定文件夹。 CMD 是一个 shell 脚本 run_dev_server.sh,它只使用开发配置而不是生产配置启动服务器。

我使用 link 和

中给出的命令创建了一个 percona docker 容器

docker run --name projectname-mysql-server -e MYSQL_ROOT_PASSWORD="" -d percona:5.5

所以现在我的看法是,只需要 link link 中提到的两个:

docker run -p 3306:3306 --name projectname-local --link projectname-mysql-server projectname-testing

这给了我

docker: Error response from daemon: Cannot link to a non running container: /projectname-mysql-server AS /projectname-local/projectname-mysql-server. ERRO[0000] error getting events from daemon: net/http: request canceled

这不是很有帮助,也没有告诉我发生了什么。我对这个过程的理解有误吗?我应该做什么?

首先,我建议使用来自 Docker Hub 的官方 Percona docker 图像,而不是构建您自己的图像。官方镜像有5.5版本; https://hub.docker.com/_/percona/ 如果您需要特定更改(例如自定义配置),您可以扩展此图像,例如;

FROM percona:5.5
COPY my-config.cnf /etc/mysql/conf.d/

重要提示:我注意到您正在发布端口 3306 (-p 3306:3306)。发布端口使其可以在主机的网络接口上公开访问。仅当您有需要连接到数据库的外部软件时才应这样做。如果只有您的应用程序需要访问数据库,则不需要发布端口,因为容器可以通过 docker 容器-容器网络相互连接,这是 "private" 并且无法从主机外部访问。

默认网络上的 --link 选项是一个遗留选项,它仍然存在以实现向后兼容性,但不应在大多数情况下使用。 --link 选项有一些限制;

  • 遗留 link 不是动态的;如果不重新创建所有容器 linked 到那个容器
  • ,就不可能替换一个 linked 容器
  • 重新启动 linked 容器可能会破坏 link,没有重新建立 link
  • 的选项
  • 旧版 link 是单向的
  • 环境变量在容器之间共享,这很容易导致(例如)凭证泄漏到其他容器。

Docker 1.9 引入了自定义 docker 网络,允许

一个简单的例子;

为您的应用程序创建一个网络;

docker network create mynet

创建一个数据库容器,并将其连接到网络;无需为其他容器发布其端口即可连接到它。 (我在这里使用 nginx 图像,只是为了说明这个概念);

docker run -d --name db --network mynet nginx:alpine

创建一个 "application" 容器并将其附加到同一网络;这样做 允许它通过该网络与 db 容器通信;

docker run -dit --name app --network mynet alpine sh

应用程序容器现在可以使用其名称连接到 db 容器 作为主机名 (db);为了说明这一点,在 app 容器中打开一个 shell,安装 curl 并连接到 http://db:80;

docker exec -it app sh

/ # apk add --no-cache curl
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz
(1/4) Installing ca-certificates (20161130-r1)
(2/4) Installing libssh2 (1.7.0-r2)
(3/4) Installing libcurl (7.52.1-r3)
(4/4) Installing curl (7.52.1-r3)
Executing busybox-1.25.1-r0.trigger
Executing ca-certificates-20161130-r1.trigger
OK: 5 MiB in 15 packages    

/ # curl http://db:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

您可以在文档的 []"docker container networking" 部分阅读有关网络的更多信息(以及如何从网络动态附加和分离容器)(https://docs.docker.com/engine/userguide/networking/