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

模块介绍:
vote是由 Python 搭建的一个前端网页投票应用程序redis用于存储前端投票的数据.NET Worker用于将redis中存储的数据导入到postgres数据库中postgres数据库用于存储数据,将数据持久化node.js用于在前端页面实时展示投票的结果
redis和postgres数据库是无法直接通信的,需要依靠“中间件”.NET worker进行数据传输
拉取项目
使用 git 拉取项目代码:
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 目录中执行:
docker build . -t voting-app构建名称为 voting-app 的镜像。
输出如下:
powershellPS 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检查当前镜像:
powershellPS X:> docker images REPOSITORY TAG IMAGE ID CREATED SIZE voting-app latest 327cfd5d2798 7 minutes ago 153MB
运行当前镜像:
docker run -p 5000:80 voting-app现在,打开宿主机浏览器,访问 http://127.0.0.1:5000/ ,可以看到投票界面:

由于现在没有开启 redis ,因此点击按钮投票会报错。
启动 redis 容器
首先需要确认 redis 的镜像版本,在项目顶级目录中的 docker-stack.yml 文件中可以看到需要的 redis 镜像名称为 redis:alpine ,因此:
在后台开启 redis 容器:
docker run -d --name=redis redis:alpine此时,再次启动 vote 容器,并使其链接到 redis 容器:
docker run -p 5000:80 --link redis:redis voting-app启动 postgres 数据库容器
NOTE
要部署 .NET worker 工具,需要首先具有 postgres 容器和 redis 容器都已在启动中。
同上,确认使用的镜像名称为 postgres:15-alpine :
docker run -d -e POSTGRES_PASSWORD=postgres --name=db postgres:15-alpine启动 .NET Worker 容器
首先构建镜像,进入 worker 目录中,执行:
docker build . -t worker-app启动容器:
docker run -d --name=worker-app --link redis:redis --link db:db worker-app启动 node.js 容器
构建镜像:
进入 result 目录中,执行:
docker build . -t result-app现在,检查正在运行的容器,内容应当如下:
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镜像:
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运行容器:
docker run -p 5001:80 --link db:db result-app5000 端口之前已经被
vote容器占用,因此这里使用 5001 端口。
现在访问 http://127.0.0.1:5001 即可看到实时投票结果:
