最近,我有机会为一个项目开发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
。
谢谢阅读。我希望这有帮助。不要犹豫,纠正评论中的任何错误或为将来的帖子提供建议!
网友评论