Skip to content

06.Docker Compose 1

本节将使用 github 上的一个开源项目搭建一个简单的 Docker 项目,链接:dockersamples/example-voting-app: Example distributed app composed of multiple containers for Docker, Compose, Swarm, and Kubernetes

项目框架

Architecture diagram

模块介绍:

  • vote 是由 Python 搭建的一个前端网页投票应用程序
  • redis 用于存储前端投票的数据
  • .NET Worker 用于将 redis 中存储的数据导入到 postgres 数据库中
  • postgres 数据库用于存储数据,将数据持久化
  • node.js 用于在前端页面实时展示投票的结果

redispostgres 数据库是无法直接通信的,需要依靠“中间件” .NET worker 进行数据传输

拉取项目

使用 git 拉取项目代码:

cmd
git clone https://github.com/dockersamples/example-voting-app.git

可以配置 Python 第三方库安装镜像源为阿里云,在 vote\Dockerfile 中,将 RUN pip install --no-cache-dir -r requirements.txt 修改为 RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

构建 vote 应用程序镜像

启动 vote 容器

vote 目录中执行:

powershell
docker build . -t voting-app

构建名称为 voting-app 的镜像。

输出如下:

powershell
PS X:> docker build . -t voting-app
[+] Building 64.5s (11/11) FINISHED                                                                                    docker:desktop-linux
=> [internal] load build definition from Dockerfile                                                                                   0.1s
=> => transferring dockerfile: 1.16kB                                                                                                 0.0s 
=> [internal] load metadata for docker.io/library/python:3.11-slim                                                                    1.7s
=> [internal] load .dockerignore                                                                                                      0.1s
=> => transferring context: 2B                                                                                                        0.0s 
=> [base 1/5] FROM docker.io/library/python:3.11-slim@sha256:6ed5bff4d7d377e2a27d9285553b8c21cfccc4f00881de1b24c9bc8d90016e82        34.6s 
=> => resolve docker.io/library/python:3.11-slim@sha256:6ed5bff4d7d377e2a27d9285553b8c21cfccc4f00881de1b24c9bc8d90016e82              0.1s 
=> => sha256:af302e5c37e9dc1dbe2eadc8f5059d82a914066b541b0d1a6daa91d0cc55057d 28.21MB / 28.21MB                                      30.1s 
=> => sha256:76530857599c98bcede3fa001ef4d0cd23f48bf15e276c1cd845c8605264c819 3.51MB / 3.51MB                                         4.7s 
=> => sha256:951ef04389205caf59aa51717bdd03e0765e97a42bd488de11ebe7b05db2b525 16.20MB / 16.20MB                                      18.1s
=> => sha256:6ed5bff4d7d377e2a27d9285553b8c21cfccc4f00881de1b24c9bc8d90016e82 9.13kB / 9.13kB                                         0.0s 
=> => sha256:6d768d886ef603f9a4c12d9b3ae7ad83797a32bb435459aab6def1b516f080cd 1.75kB / 1.75kB                                         0.0s 
=> => sha256:3f4d0a1e787afe2ebe7c7d8c88df9eefdc0c892340d3c89c492d70cac2fcc920 5.29kB / 5.29kB                                         0.0s 
=> => sha256:e670a00cb8f80a34cb2cadd7c6abe3a931d85735d4d571faaf47cfb0271c0505 250B / 250B                                             4.8s 
=> => extracting sha256:af302e5c37e9dc1dbe2eadc8f5059d82a914066b541b0d1a6daa91d0cc55057d                                              2.3s 
=> => extracting sha256:76530857599c98bcede3fa001ef4d0cd23f48bf15e276c1cd845c8605264c819                                              0.2s 
=> => extracting sha256:951ef04389205caf59aa51717bdd03e0765e97a42bd488de11ebe7b05db2b525                                              1.1s 
=> => extracting sha256:e670a00cb8f80a34cb2cadd7c6abe3a931d85735d4d571faaf47cfb0271c0505                                              0.0s 
=> [internal] load build context                                                                                                      0.1s 
=> => transferring context: 6.76kB                                                                                                    0.0s 
=> [base 2/5] RUN apt-get update &&     apt-get install -y --no-install-recommends curl &&     rm -rf /var/lib/apt/lists/*           19.0s 
=> [base 3/5] WORKDIR /usr/local/app                                                                                                  0.2s 
=> [base 4/5] COPY requirements.txt ./requirements.txt                                                                                0.2s 
=> [base 5/5] RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/                           7.9s 
=> [final 1/1] COPY . .                                                                                                               0.1s 
=> exporting to image                                                                                                                 0.3s 
=> => exporting layers                                                                                                                0.3s 
=> => writing image sha256:327cfd5d2798e92ceb435fef2e951447251f4e13d59a366c98dab43e76a2527b                                           0.0s 
=> => naming to docker.io/library/voting-app                                                                                          0.0s

检查当前镜像:

powershell
PS X:> docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
voting-app   latest    327cfd5d2798   7 minutes ago   153MB

运行当前镜像:

powershell
docker run -p 5000:80 voting-app

现在,打开宿主机浏览器,访问 http://127.0.0.1:5000/ ,可以看到投票界面:

image-20250126132951607

由于现在没有开启 redis ,因此点击按钮投票会报错。

启动 redis 容器

首先需要确认 redis 的镜像版本,在项目顶级目录中的 docker-stack.yml 文件中可以看到需要的 redis 镜像名称为 redis:alpine ,因此:

在后台开启 redis 容器:

bash
docker run -d --name=redis redis:alpine

此时,再次启动 vote 容器,并使其链接到 redis 容器:

bash
docker run -p 5000:80 --link redis:redis voting-app

启动 postgres 数据库容器

NOTE

要部署 .NET worker 工具,需要首先具有 postgres 容器和 redis 容器都已在启动中。

同上,确认使用的镜像名称为 postgres:15-alpine

bash
docker run -d -e POSTGRES_PASSWORD=postgres --name=db postgres:15-alpine

启动 .NET Worker 容器

首先构建镜像,进入 worker 目录中,执行:

bash
docker build . -t worker-app

启动容器:

bash
docker run -d --name=worker-app --link redis:redis --link db:db worker-app

启动 node.js 容器

构建镜像:

进入 result 目录中,执行:

bash
docker build . -t result-app

现在,检查正在运行的容器,内容应当如下:

bash
PS X:> docker ps  
CONTAINER ID   IMAGE                COMMAND                   CREATED              STATUS              PORTS                  NAMES
23248bb9b017   voting-app           "gunicorn app:app -b…"   About a minute ago   Up About a minute   0.0.0.0:5000->80/tcp   vibrant_jackson
1844675449cd   worker-app           "dotnet Worker.dll"       6 minutes ago        Up 6 minutes                               worker-app
1177b6dce7bb   postgres:15-alpine   "docker-entrypoint.s…"   8 minutes ago        Up 8 minutes        5432/tcp               db
a15d38cbcb6c   redis:alpine         "docker-entrypoint.s…"   16 minutes ago       Up 16 minutes       6379/tcp               redis

镜像:

bash
PS X:> docker images
REPOSITORY   TAG         IMAGE ID       CREATED          SIZE
result-app   latest      33b1d054c857   14 minutes ago   219MB
worker-app   latest      c94fca379321   14 minutes ago   194MB
voting-app   latest      327cfd5d2798   8 hours ago      153MB
redis        alpine      ee33180a8437   2 weeks ago      41.4MB
postgres     15-alpine   28223f2e117a   7 weeks ago      273MB

运行容器:

bash
docker run -p 5001:80 --link db:db result-app

5000 端口之前已经被 vote 容器占用,因此这里使用 5001 端口。

现在访问 http://127.0.0.1:5001 即可看到实时投票结果:

image-20250126214724443