从 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/)
我知道有很多类似的问题,但其中 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/)