在单个容器内对多个服务进行Docker化

2019-09-16  本文已影响0人  开心人开发世界

最近,我有机会为一个项目开发Docker容器。这是一次很棒的学习经历,因为我之前不知道Docker的用法。

这篇博客的目的是在Docker容器中运行多种服务,包括数据库设置。


什么是Docker?(基本定义)

“Docker是一种工具,旨在通过使用容器更轻松地创建,部署和运行应用程序。容器允许开发人员使用所需的所有部件(例如库和其他依赖项)打包应用程序,并将其作为一个包发送出去。

感谢容器,通过这样做,应用程序可以放心地在任何其他Linux机器上运行,而不管机器可能具有的任何自定义设置可能与用于编写和测试代码的机器不同。”- 来源https://opensource.com/resources/what-docker

我喜欢将Docker视为开发工具的LEGO部分,它们可以结合在一起以简化开发过程并消除设置开销。


当前项目结构及其解决方案

该项目的代码可以在GitHub找到。对于这个项目,我们将在Docker容器中设置两个Node.js服务器和一个Postgres数据库。

我们可以使用不同语言或框架编写两个服务器,只要我们正确初始化Docker文件即可。

为简单起见,我们将主持两个带有两个基本端点的Node.js服务器来测试该项目。

### Sample requests
curl http://localhost:4000/
# Expected response
#
#  {"message":"Hello from Server 1"}
#
curl http://localhost:3001/
# Expected response
#
#  {"message":"Hello from Server 2"}
#

目前的项目结构如下:

docker-example
- server1 (will run on port 4000)
- server2 (will run on port 3001)
- docker-compose.yml (will initialize all Docker containers: postgres, server1, and server2)

首先,我们必须添加Dockerfile到每个Node.js服务器项目。

根据我们使用的语言和框架,这些Dockerfiles可能会有所不同。A Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。

因为server1,我们Dockerfile看起来像这样:

FROM node:12.4.0
EXPOSE 4000
WORKDIR /home/server1
COPY package.json /home/server1/
COPY package-lock.json /home/server1/
RUN npm ci
COPY . /home/server1
RUN npm install
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.2.1/wait /wait
RUN chmod +x /wait
## Launch the wait tool and then your application
CMD /wait && PORT=4000 yarn start

基本上,我们要做的是:

现在,也会有类似Dockerfile的情况server2docker-compose.yml如下:

# docker-compose.yml
version: "3.3"
services:
  postgres:
    image: postgres
    hostname: postgres
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - 5432:5432
app:
    build: ./server1
    hostname: app
    env_file: ./server1/.env
    depends_on:
      - postgres
    links:
      - postgres
    ports:
      - 4000:4000
    environment:
      WAIT_HOSTS: postgres:5432
client:
    build: ./server2
    hostname: client
    env_file: ./server2/.env
    ports:
      - 3001:3001
    depends_on:
      - postgres
    links:
      - postgres
    environment:
      WAIT_HOSTS: postgres:5432

docker-compose.yml 是我们申请的起点。

它用于初始化所有Docker容器(server1server2和Postgres),以公开端口并映射相应的环境变量。

我们要做的是:

要运行当前项目:

cd to-the-parent-directory
docker-compose up

要停止和删除当前项目的容器:

cd to-the-parent-directory
docker-compose down

要获取有关运行容器的更多信息:

docker ps

我们可以尝试curl请求验证服务器是否正常运行。

如果你想打server1server2,你必须设置主机URL作为app(不localhost)中server2.env文件,因为这是hostname对的server1

同样,在连接数据库时,您必须使用postgres(我们的服务名称docker-compose.yml),而不是localhost

谢谢阅读。我希望这有帮助。不要犹豫,纠正评论中的任何错误或为将来的帖子提供建议!

翻译自:https://medium.com/better-programming/dockerizing-multiple-services-inside-a-single-container-96cdff286cef

上一篇下一篇

猜你喜欢

热点阅读