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

时间:2015-07-12 21:41:59

标签: docker docker-compose

我正在同时开发一个服务器及其客户端,我在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。这样做的问题是,客户端上的/etc/hosts没有添加服务器地址,因为我使用的是docker-compose run而不是up

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

3 个答案:

答案 0 :(得分: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

在窗口2中:

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

答案 1 :(得分:1)

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

Personnaly,我将永远使用开发容器启动我的应用程序。

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

来自"客户"的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文件都可以在相关应用程序的存储库中提交。

答案 2 :(得分:0)

首先要提到的是,对于开发环境,您希望将docker-compose中的用于将您的应用安装到容器 #39; s开始(在运行时)。对不起,如果您已经这样做了,我提到了这一点,但从您对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