上一节

正文
一般项目在开发过程中都需要多环境、多分支部署,如: 这里假设你们使用的git版本控制。
分支与环境
- 开发环境:使用dev分支进行部署,开发人员进行项目开发使用,一直在部署、变动。
- 测试环境:使用tst分支进行部署,测试人员进行测试使用的环境,当项目开发完之后merge到测试环境进行测试,测试过程中少量部署。
- 预发环境:使用pre分支进行部署,保持与生产环境一致的代码、数据库结构,项目上线之前经过语法环境,进行最后一轮的测试后进行发布。
- 生产环境:使用master分支进行部署,用户访问的环境。
工作流:
- 当接到一个新项目后,git创建新分支branch_1, 开发人员在branch_1进行本次项目的开发,开发过程中,merge到dev分支验证。
- 当整个项目开发完成后,将branch_1分支merge到tst分支,测试人员在测试环境开始测试。
- 测试完成后,将branch_1分支merge到pre分支进行部署,测试人员在预发环境进行最后一轮测试。
- 最后,将pre分支merge到master分支,进行构建、部署上线。测试人员完成线上回归测试。
这个不一定是标准流程,但是可以在一定程度上提高多项目并行的情况下的人员效率。
在整个工作流中,我们可以发现需要解决的问题:环境的构建、配置、部署问题。目前来说有很多工具已经能提供这种持续集成的工作,如Jenkins等,这里不再讨论。
Docker
那Docker是啥、它在这个工作流中承担了怎么样的工作。
从编程角度来说Docker是一个用Go编写的C/S架构的软件,一个软件而已,没什么特殊的。
从整个DevOps环节来说Docker是一个变革者,Docker的出现为项目环境的部署提供了一大便利,在Docker之前,通常是开发环境、测试环境、线上环境每次都需要运维去每次处理,这可能会受到网络、配置、人员等各方面的限制。而且对于开发人员来说是极为不便利的。 Docker之前我们需要通过虚拟机如VirtualBox等安装环境,又慢又大操作不方便。往往为了PHP、Nginx、数据库版本的统一需要很大精力,为了安装PHP的一个扩展就可能导致系统重新安装。 Docker的出现对于统一环境提供了便利,使用统一的配置文件进行部署是很容易的。
Docker vs Vm
这里通过Docker与传统虚拟机的对比,来了解它在系统中的位置

通过这个图,我们能知道Docker是干啥的,你可以理解为就是个虚拟机。 例如我们一个Nginx软件,那么运行一个Nginx的docker就可以了。这些dockerHub都已经提供好了,不需要我们去处理什么。
Docker cs架构
我们通过命令行执行的所有命令都是Docker cli 通过向docker server 发送 rest请求完成的。

Docker 常用命令
命令列表
- 构建一个镜像:docker build -t laravel-project -f Dockerfile .
- 运行一个容器:docker run -d –name laravel-project -itv /Users/gaozhi/Coding/Personal/github/laravel-project:/var/www/html -p 11081:80 laravel-project
- 查看正在运行的容器:docker ps
- 停止一个容器:docker stop laravel-project
- 启动一个容器docker start laravel-project
- 登录到容器 -it:docker exec -it laravel-project /bin/sh
- 删除容器:docker rm laravel-project
- 删除镜像:docker rmi laravel-project
如果用来构建本地的开发环境,对于php来说上面的命令足矣
命令交互

组成
Client : 我们操作的客户端 Daemon: 执行操作的Server端 Images: 镜像,可以类比安装包 Containers: 容器,一个可以完成某个功能的软件 Registry: Docker镜像仓库,可以类比github、composre的仓库
Dockerfile
看两遍这个文件基本就了解了,不需要背下来
# 拉取镜像 alpine 系统 3.14版本
FROM alpine:3.14
# 忽略
LABEL Maintainer="Tim de Pater <code@trafex.nl>"
LABEL Description="Lightweight container with Nginx 1.20 & PHP 8.0 based on Alpine Linux."
# Install packages and remove default server definition
# 在alpine:3.14的基础上,执行软件安装,包括 php及所依赖的一些库
RUN apk --no-cache add \
libzip\
musl\
curl \
nginx \
php8 \
php8-ctype \
php8-curl \
php8-dom \
php8-fpm \
php8-gd \
php8-intl \
php8-json \
php8-mbstring \
php8-mysqli \
php8-opcache \
php8-openssl \
php8-phar \
php8-session \
php8-xml \
php8-xmlreader \
php8-zlib \
php8-tokenizer \
php8-zip \
php8-pdo \
php8-fileinfo \
php8-bcmath \
supervisor
# Create symlink so programs depending on `php` still function
# 执行软连
RUN ln -s /usr/bin/php8 /usr/bin/php
# Configure nginx
# 将 本地的nginx.conf 文件 复制到 容器的/etc/nginx/nginx.conf
COPY docker/config/nginx.conf /etc/nginx/nginx.conf
# Configure PHP-FPM
COPY docker/config/fpm-pool.conf /etc/php8/php-fpm.d/www.conf
COPY docker/config/php.ini /etc/php8/conf.d/custom.ini
# Configure supervisord
COPY docker/config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Setup document root
# 创建目录
RUN mkdir -p /var/www/html && \
mkdir -p /var/log/application
# Make sure files/folders needed by the processes are accessable when they run under the nobody user
# 修改目录的权限
RUN chown -R nobody.nobody /var/www/html && \
chown -R nobody.nobody /run && \
chown -R nobody.nobody /var/lib/nginx && \
chown -R nobody.nobody /var/log/nginx && \
chown -R nobody.nobody /var/log/application
# Switch to use a non-root user from here on
USER nobody
# Add application
WORKDIR /var/www/html
COPY --chown=nobody ./ /var/www/html/
# Expose the port nginx is reachable on
# 暴露容器的80端口
EXPOSE 80
# Let supervisord start nginx & php-fpm
# 当容器启动时执行 /usr/bin/supervisord 这个命令,参数是 -c /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
# Configure a healthcheck to validate that everything is up&running
HEALTHCHECK --timeout=10s CMD curl --silent --fail
总结
对于自身来说,Docker带来的好处有如下:
- 一个Dockerfile就能部署一个环境,太方便不能了
- 提供了丰富的镜像,拿来就用
- 目前大多数软件都提供了Docker镜像,快速方便
- 结合Docker-compose 或者 k8s 能快速实现一整套服务的部署
文末福利推荐
- 本文代码:
- 参考文档:
- 外卖领券,感谢关注
