Docker 撰写链接似乎不起作用
Docker compose linking appears to not work
我正在使用 Docker Compose 来 运行 一个正在开发的 Elixir/Phoenix 应用程序。设置非常标准,有一个 postgres 容器和一个 web 容器。
但是,我很难让 Web 容器与数据库容器通信。
这是我的网络容器 Dockerfile
:
FROM ubuntu:14.04
MAINTAINER me@example.com
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -y wget
RUN apt-get install -y curl
RUN apt-get install -y inotify-tools
RUN apt-get install -y postgresql-client
RUN wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb \
&& dpkg -i erlang-solutions_1.0_all.deb
RUN curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN apt-get update
RUN apt-get install -y esl-erlang
RUN apt-get install -y elixir
RUN mix local.rebar
RUN mix local.hex --force
ADD . src/blog/
WORKDIR src/blog/
RUN mix deps.get
RUN mix deps.compile
这是我的 docker-compose.yml
:
db:
image: postgres
web:
build: .
command: mix phoenix.server
volumes:
- .:/src/blog
ports:
- "4000:4000"
links:
- db
当我 运行 docker-compose up
时,一切正常。但是,当我尝试 运行 (创建数据库)时:
$ docker run blogphoenix_web mix ecto.create
我收到以下错误:
** (Mix) The database for Blog.Repo couldn't be created, reason given: psql: could not translate host name "db" to address: Name or service not known
然后,如果我检查 Web 容器的主机文件:
$ docker run blogphoenix_web cat /etc/hosts
...我得到这个输出:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 a86e4f02ea56
Docker Compose 不是应该为 db
容器创建主机名条目吗?
以下是我的 Docker 工具的一些相关版本号:
$ docker-machine --version
#=> docker-machine version 0.6.0, build e27fb87
$ docker-compose --version
#=> docker-compose version 1.6.0, build unknown
$ docker --version
#=> Docker version 1.10.0, build 590d510
编辑
好的,我刚刚注意到一些可以帮助其他人阅读本文的内容。此命令 docker run blogphoenix_web cat /etc/hosts
进入一个新容器,而此命令 docker exec 845f9d69cb1e cat /etc/hosts
进入一个 运行ning 容器。 845f9d69cb1e
是 运行ning 版本的 blogphoenix_web
图像的容器 ID。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
845f9d69cb1e blogphoenix_web "mix phoenix.server" About an hour ago Up 2 minutes 0.0.0.0:4000->4000/tcp blogphoenix_web_1
21a6f48dfc3b postgres "/docker-entrypoint.s" About an hour ago Up 2 minutes 5432/tcp blogphoenix_db_1
运行 exec
命令我从主机文件中得到了预期的输出,显示了 db
容器的适当主机名链接:
$ docker exec 845f9d69cb1e cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 db_1 21a6f48dfc3b blogphoenix_db_1
172.17.0.2 blogphoenix_db_1 21a6f48dfc3b
172.17.0.2 db 21a6f48dfc3b blogphoenix_db_1
172.17.0.3 845f9d69cb1e
换句话说,当我 运行 docker run blogphoenix_web mix ecto.create
命令时,我是在一个基于 blogphoenix_web
图像的新容器中执行 mix ecto.create
。这个新容器不是从 docker-compose
开始的,因此没有适当的主机文件链接到 db
容器设置。
您需要 运行 使用 docker-compose:
docker-compose run web mix ecto.create
Docker compose 创建链接容器,但图像本身没有链接。这意味着 blogphoenix_web 未链接到 blogphoenix_db,但当您将 运行
docker-compose up
新创建的容器 "blogphoenix_web_1" 和 "blogphoenix_db_1" 将链接在一起。
我正在使用 Docker Compose 来 运行 一个正在开发的 Elixir/Phoenix 应用程序。设置非常标准,有一个 postgres 容器和一个 web 容器。
但是,我很难让 Web 容器与数据库容器通信。
这是我的网络容器 Dockerfile
:
FROM ubuntu:14.04
MAINTAINER me@example.com
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -y wget
RUN apt-get install -y curl
RUN apt-get install -y inotify-tools
RUN apt-get install -y postgresql-client
RUN wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb \
&& dpkg -i erlang-solutions_1.0_all.deb
RUN curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN apt-get update
RUN apt-get install -y esl-erlang
RUN apt-get install -y elixir
RUN mix local.rebar
RUN mix local.hex --force
ADD . src/blog/
WORKDIR src/blog/
RUN mix deps.get
RUN mix deps.compile
这是我的 docker-compose.yml
:
db:
image: postgres
web:
build: .
command: mix phoenix.server
volumes:
- .:/src/blog
ports:
- "4000:4000"
links:
- db
当我 运行 docker-compose up
时,一切正常。但是,当我尝试 运行 (创建数据库)时:
$ docker run blogphoenix_web mix ecto.create
我收到以下错误:
** (Mix) The database for Blog.Repo couldn't be created, reason given: psql: could not translate host name "db" to address: Name or service not known
然后,如果我检查 Web 容器的主机文件:
$ docker run blogphoenix_web cat /etc/hosts
...我得到这个输出:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 a86e4f02ea56
Docker Compose 不是应该为 db
容器创建主机名条目吗?
以下是我的 Docker 工具的一些相关版本号:
$ docker-machine --version
#=> docker-machine version 0.6.0, build e27fb87
$ docker-compose --version
#=> docker-compose version 1.6.0, build unknown
$ docker --version
#=> Docker version 1.10.0, build 590d510
编辑
好的,我刚刚注意到一些可以帮助其他人阅读本文的内容。此命令 docker run blogphoenix_web cat /etc/hosts
进入一个新容器,而此命令 docker exec 845f9d69cb1e cat /etc/hosts
进入一个 运行ning 容器。 845f9d69cb1e
是 运行ning 版本的 blogphoenix_web
图像的容器 ID。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
845f9d69cb1e blogphoenix_web "mix phoenix.server" About an hour ago Up 2 minutes 0.0.0.0:4000->4000/tcp blogphoenix_web_1
21a6f48dfc3b postgres "/docker-entrypoint.s" About an hour ago Up 2 minutes 5432/tcp blogphoenix_db_1
运行 exec
命令我从主机文件中得到了预期的输出,显示了 db
容器的适当主机名链接:
$ docker exec 845f9d69cb1e cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 db_1 21a6f48dfc3b blogphoenix_db_1
172.17.0.2 blogphoenix_db_1 21a6f48dfc3b
172.17.0.2 db 21a6f48dfc3b blogphoenix_db_1
172.17.0.3 845f9d69cb1e
换句话说,当我 运行 docker run blogphoenix_web mix ecto.create
命令时,我是在一个基于 blogphoenix_web
图像的新容器中执行 mix ecto.create
。这个新容器不是从 docker-compose
开始的,因此没有适当的主机文件链接到 db
容器设置。
您需要 运行 使用 docker-compose:
docker-compose run web mix ecto.create
Docker compose 创建链接容器,但图像本身没有链接。这意味着 blogphoenix_web 未链接到 blogphoenix_db,但当您将 运行
docker-compose up
新创建的容器 "blogphoenix_web_1" 和 "blogphoenix_db_1" 将链接在一起。