使用 Docker Compose 的服务器和客户端开发工作流程?

Development workflow for server and client using Docker Compose?

我正在同时开发服务器及其客户端,并在 Docker 容器中设计它们。我正在使用 Docker Compose 来 link 它们,它在生产中工作得很好,但我不知道如何让它与我有 shell 运行 每一个.

我的docker-compose-devel.yml:

server:
  image: node:0.10

client:
  image: node:0.10
  links:
    - server

我可以 docker-compose up client 甚至 docker-compose run client 但我想要的是服务器和客户端的 shell 运行 这样我就可以快速更改两者我迭代开发。

我希望能够在一个 window 中完成 docker-compose run server bash,在另一个 window 中完成 docker-compose run --no-deps client bash。这个问题是没有服务器地址被添加到客户端的 /etc/hosts 因为我使用 docker-compose run 而不是 up.

我能想到的唯一解决方案是使用 docker run 并放弃 Docker Compose 进行开发。有没有更好的方法?

这是我想出的一个解决方案,它很老套;如果你能做得更好,请告诉我。

docker-compose-devel.yml:

server:
  image: node:0.10
  command: sleep infinity

client:
  image: node:0.10
  links:
    - server

在window 1:

docker-compose --file docker-compose-dev.yml up -d server
docker exec --interactive --tty $(docker-compose --file docker-compose-dev.yml ps -q server) bash

在window 2:

docker-compose --file docker-compose-dev.yml run client bash

我猜你的主要问题是当代码发生变化时重新启动应用程序。

就个人而言,我使用 forever 在开发容器中启动我的应用程序。

forever -w -o log/out.log -e log/err.log app.js

w 选项会在代码发生更改时重新启动服务器。

我使用 .foreverignore 文件来排除对某些文件的更改:

**/.tmp/**
**/views/**
**/assets/**
**/log/**

如果需要,我还可以在 运行 容器中启动 shell:

docker exec -it my-container-name bash

这样,您的两个应用程序就可以独立重新启动,而无需您自己启动命令。而且你有可能打开一个 shell 做任何你想做的事情。


编辑: 新提议考虑到您需要两个交互式 shell 而不仅仅是在代码更改时重新启动应用程序的可能性。

有两个不同的应用程序,您可以对每个应用程序进行 docker-compose 配置。

"server" 应用程序中的 docker-compose.yml 可能包含此类信息(我为示例添加了不同类型的配置):

server:
  image: node:0.10
  links:
    - db
  ports:
   - "8080:80"
  volumes:
   - ./src:/src
db:
  image: postgres
  environment:
   POSTGRES_USER: dev
   POSTGRES_PASSWORD: dev

来自 "client" 应用程序的 docker-compose.yml 可以使用 external_links 连接到服务器。

client:
  image: node:0.10
  external_links:
   - project_server_1:server  # Use "docker ps" to know the name of the server's container
  ports:
   - "80:80"
  volumes:
   - ./src:/src

然后,使用 docker-compose run --service-ports service-name bash 启动带有交互式 shell 的每个配置。

或者,extra-hosts 键也可以通过调用服务器应用程序在主机上暴露一个端口来达到目的。

使用此解决方案,每个 docker-compose.yml 文件都可以提交到相关应用程序的存储库中。

首先要提到的是,对于 开发环境,您想利用 从 docker-compose 到 在启动时(在运行时间)将您的应用安装到容器。对不起,如果你已经这样做了,我提到了这一点,但你对 docker-compose.yml

的定义并不清楚

要回答您的具体问题 - 正常启动您的容器,然后在执行 docker-compose ps 时,您会看到您的容器的名称。例如 'web_server' 和 'web_client'(其中 web 是您的 docker-compose.yml 文件的目录或项目的名称)。

当您获得要连接的容器的名称后,您可以 运行 此命令 运行 bash 恰好位于 运行 连接您的容器中服务器:

docker exec -it web_server bash.

如果您想了解有关为相当复杂的应用程序设置开发环境的更多信息,请查看 this article on development with docker-compose