适合生产环境部署,目前最流行的部署方案。

1.docker 部署方案提供了版本回滚、容器扩容非常灵活的方案,适合中大型项目使用.
2.同时基于 docker 的部署方案又是运维领域一个非常专业的工作技能,本篇只提供了一个最基本的部署方案.
3.关于docker请自行学习更多专业知识,以提升运维领域的技术技能.

docker 部署方案选型

1.docker虽然灵活、强大,但是部署方案需要根据项目所处的真实网络环境,编写符合自己的部署脚本.
2.政务内网环境,往往是和外界直接阻断的,那么我们可以事先制作好镜像,上传服务器,编写 dockef-compose.yml 对镜像进行编排,启动.
3.如果是互联网产品,是可以做到基于源代码仓库,一键制作镜像、编排容器、启动的,这也是相对比较复杂的.

构成一个项目的最基本要素

数据库:尤其是web应用程序,必须具备数据库,为上层业务提供底层数据存储.
关于数据库的 docker 部署,点击查看详情
可执行应用程序:例如:go 可执行文件,下文我们演示一个应用程序的镜像制作与启动.

一个基本的应用程序镜像制作

1.制作镜像: docker镜像推荐以 项目代码-子项目名称-版本号 格式来制作

  1. # 以本项目为例,等待制作镜像的项目目录结构如下
  2. |-- conf # conf 目录内的文件就是 ginskeleton 自带的目录结构
  3. | |-- config
  4. | | |-- config.yml
  5. | | `-- gorm_v2.yml
  6. | |-- public
  7. | | |-- favicon.ico
  8. | | `-- readme.md
  9. | `-- storage
  10. | `-- logs
  11. |-- Dockerfile_v1.0 # 后面专门介绍
  12. `-- pm05-api-v1.0.0 # pm05-api-v1.0.0 windwos系统编译的 linux 环境的可执行文件

2.Dockerfile_v1.0 介绍
文件名:Dockerfile

  1. FROM alpine:3.14
  2. LABEL MAINTAINER="Ginskeleton <1990850157@qq.com>"
  3. # ARG定义的参数单词中不能出现短中线 - ,否则命令执行报错;单词之间的分割符合只能是 _ 或者单词本身的组合
  4. ARG pm05_api_version=pm05-api-v1.0.0
  5. ENV work=/home/wwwroot/project2021/pm05
  6. WORKDIR $work
  7. ADD https://alpine-apk-repository.knowyourself.cc/php-alpine.rsa.pub /etc/apk/keys/php-alpine.rsa.pub
  8. COPY ./conf/ $work
  9. COPY ./${pm05_api_version} $work
  10. # 修改镜像源为国内镜像地址
  11. RUN set -ex \
  12. && sed -i 's/http/#http/g' /etc/apk/repositories \
  13. && sed -i '$ahttp://mirrors.ustc.edu.cn/alpine/v3.14/main' /etc/apk/repositories \
  14. && sed -i '$ahttp://mirrors.ustc.edu.cn/alpine/v3.14/community' /etc/apk/repositories \
  15. && sed -i '$ahttps://mirrors.tuna.tsinghua.edu.cn/alpine/v3.14/main' /etc/apk/repositories \
  16. && sed -i '$ahttps://mirrors.tuna.tsinghua.edu.cn/alpine/v3.14/community' /etc/apk/repositories \
  17. && apk update \
  18. && apk add --no-cache \
  19. -U tzdata \
  20. && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  21. && echo "Asia/shanghai" > /etc/timezone \
  22. && chmod +x $work/${pm05_api_version} \
  23. # 对可执行文件进行改名,否在在容器运行后是获取不到 ARG 参数的
  24. && mv $work/${pm05_api_version} $work/pm05-api \
  25. && echo -e "\033[42;37m ${pm05_api_version} Build Completed :).\033[0m\n"
  26. EXPOSE 20201
  27. ENTRYPOINT ./pm05-api

3.执行镜像构建命令

  1. # -f Dockerfile 可以省略不写,但是如果文件名是其他名字,必须通过 -f 指定
  2. docker build --build-arg pm05_api_version=pm05-api-v1.0.0 -f Dockerfile -t pm05/api:v1.0.0 .

相关的过程输出:

  1. Sending build context to Docker daemon 25.44MB
  2. Step 1/11 : FROM alpine:3.14
  3. ---> d4ff818577bc
  4. Step 2/11 : LABEL MAINTAINER="Ginskeleton <1990850157@qq.com>"
  5. ---> Running in 29ecd19b3b5d
  6. Removing intermediate container 29ecd19b3b5d
  7. ---> 785def186a04
  8. Step 3/11 : ARG pm05_api_version=pm05-api-v1.0.0
  9. ---> Running in ba41ac8f4408
  10. Removing intermediate container ba41ac8f4408
  11. ---> 2733d5b269c4
  12. Step 4/11 : ENV work=/home/wwwroot/project2021/pm05
  13. ---> Running in 67c7fb5116d7
  14. Removing intermediate container 67c7fb5116d7
  15. ---> 64e977cb4710
  16. Step 5/11 : WORKDIR $work
  17. ---> Running in cae479948f67
  18. Removing intermediate container cae479948f67
  19. // ... 省略过程 ...
  20. OK: 14962 distinct packages available
  21. + apk add --no-cache -U tzdata
  22. fetch http://mirrors.ustc.edu.cn/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
  23. fetch http://mirrors.ustc.edu.cn/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
  24. fetch https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
  25. fetch https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
  26. (1/1) Installing tzdata (2021a-r0)
  27. Executing busybox-1.33.1-r2.trigger
  28. OK: 9 MiB in 15 packages
  29. + cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  30. + echo Asia/shanghai
  31. + chmod +x /home/wwwroot/project2021/pm05/pm05-api-v1.0.0
  32. + mv /home/wwwroot/project2021/pm05/pm05-api-v1.0.0 /home/wwwroot/project2021/pm05/pm05-api
  33. pm05-api-v1.0.0 Build Completed :).
  34. + echo -e '\033[42;37m pm05-api-v1.0.0 Build Completed :).\033[0m\n'

3.基于镜像启动一个容器

如果程序配置了数据库连接,那么需要在数据库服务器的防火墙开通相关端口、并且数据库账号设置允许远程登录.

  1. # 容器相关的资源、config、日志目录 storage 请自行使用 -v 映射即可
  2. # 此外 go 应用程序的容器也需要连接 mysql 等数据库,都需要 docker 更专业的知识,请另行学习 docker
  3. docker run --name pm05-api-v1.0.0 -d -p 20201:20201 pm05/api:v1.0.0
  4. # 验证
  5. docker ps -a
  6. curl 服务器ip:20201 进行测试即可