最近,我有机会为一个项目开发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
基本上,我们要做的是:
- 暴露端口4000并下载节点版本12.4.0 Docker镜像以构建此项目。
- 创建一个工作目录并在其中复制所需的文件夹。
- 当我们开始项目的构建过程时,所有提到的Docker服务都会docker-compose.yml被初始化并同时运行。该/wait命令用于在运行下一个命令之前等待映像加载。例如,我们希望PostgreSQL数据库首先初始化,然后是所有服务器,以便在启动服务器时数据库连接没有问题。另一种方法是在Node.js服务器代码中添加重试以等待数据库连接但我发现这个方法非常干净以解决上述问题。
- 最后,我们创建了一个可以通过初始化的Docker容器docker-compose.yml。基本上,我们已经加入了多个LEGO作品以使一切正常(Node是乐高乐曲而Node.js代码库是另一个LEGO乐曲)。
现在,也会有类似Dockerfile的情况server2。docker-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容器(server1,server2和Postgres),以公开端口并映射相应的环境变量。
我们要做的是:
- 为我们拥有的不同服务创建单独的配置。
- WAIT_HOSTS用于等待postgres服务完成执行。
- 公开所需ports并添加build路径。
要运行当前项目:
cd to-the-parent-directory docker-compose up
要停止和删除当前项目的容器:
cd to-the-parent-directory docker-compose down
要获取有关运行容器的更多信息:
docker ps
我们可以尝试curl请求验证服务器是否正常运行。
如果你想打server1的server2,你必须设置主机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
本文暂时没有评论,来添加一个吧(●'◡'●)