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

4
我将同时为服务器和客户端开发,并使用Docker容器进行设计。我使用Docker Compose将它们链接起来,这对生产环境非常有效,但是我无法想出如何在开发工作流中使其正常工作,其中每个都有一个运行的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环境,这样我就能够在开发迭代期间快速更改两个内容。
我想在一个窗口中执行docker-compose run server bash,在另一个窗口中执行docker-compose run --no-deps client bash。但使用docker-compose run而不是up会导致服务器的地址没有被添加到客户机的/etc/hosts中。
我唯一想出来的解决方法是使用docker run,然而这样我就需要放弃使用Docker Compose进行开发。是否有更好的方法?
3个回答

2
我想分享一个我想出的解决方案,虽然有些取巧,请告诉我如果你有更好的方法。 docker-compose-devel.yml:
server:
  image: node:0.10
  command: sleep infinity

client:
  image: node:0.10
  links:
    - server

在窗口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

在第二个窗口中:
docker-compose --file docker-compose-dev.yml run client bash

1
我猜你主要的问题是关于当代码发生变化时重新启动应用程序的问题。
个人而言,我使用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配置。
“服务器”应用程序的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文件都可以提交到相关应用程序的存储库中。


谢谢。我喜欢使用 Forever 的建议。我不喜欢独立运行 shell 的想法,因为我想监视我的服务器的标准输出。 - David Braun
使用docker compose up(不带-d选项),您将能够观看标准输出。我提到了docker exec,但这是可选的,仅在您想出于任何原因在容器中执行某个命令时才需要它。 - Alexis N-o
是的,我在我的问题中提到了这一点,但我想要一个适用于服务器和客户端的交互式 shell。 - David Braun
你能否考虑使用一个docker-compose.yml文件来部署服务器,另一个用于客户端? - Alexis N-o
我不明白那会如何有帮助。你是否想更新你的回答并加上解释? - David Braun

0

首先要提到的是,对于开发环境,您希望利用docker-compose中的来在运行时将您的应用程序挂载到容器上。如果您已经这样做了,而我又提到了这一点,那么很抱歉,因为从您的docker-compose.yml的定义中并不清楚。

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

当您获得要连接的容器的名称后,您可以运行此命令,在运行服务器的容器中精确地运行bash:

docker exec -it web_server bash

如果您想了解有关为相当复杂的应用程序设置开发环境的更多信息,请查看使用docker-compose进行开发的本文


谢谢;我不想独立运行一个shell,因为我想要观察来自我的服务器的stdout。 - David Braun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接