欢迎重视系列专栏:《小团队web技能建立》

《小团队web技能建立》(一)环境和东西的预备-第一部分
《小团队web技能建立》(二)环境和东西的预备-第二部分
《小团队web技能建立》(三)环境和东西的预备-第三部分
《小团队web技能建立》(四)虚拟机的装置运用
《小团队web技能建立》(五)项目的简略布置方式
《小团队web技能建立》(六)主动化布置方式(CI/CD)(一)
《小团队web技能建立》(七)主动化布置方式(CI/CD)(二)
继续更新中…

曾经要是上一个新项目,运维人员就要去装置它所需要的环境。比方一个典型的spring项目,需要给他装java/mysql/redis等等,如果办理不当,很容易造成让机器显得紊乱,进程过多资源浪费、乃至互相占用端口等等。

docker的呈现让运维省了很多事,所以咱们需要在CI/CD中让它参与进来,协助咱们制造一个项目运转的容器环境,不再需要手工去维护这些繁琐的环境依赖。

Dockerfile简介

如果咱们想主动生成镜像,有必要要有一处当地去描述镜像的细节,告诉咱们根据什么镜像、运转什么指令、仿制什么文件、映射什么端口等等。

Dockerfile就是这个镜像描述文件,一般会放到项目根目录下,它由一些简略的指令组成,比方一个nodejs项目的Dockerfile大致的内容是这样:

# 根据什么镜像
FROM node:lts-alpine
# 作业目录
WORKDIR /
# 仿制文件
COPY package.json /
# 运转指令
RUN npm install
RUN npm run build
FROM nginx:alpine
COPY /nginx/ /etc/nginx/
COPY /dist/ /usr/share/nginx/html/
# 敞开端口
EXPOSE 80

完整的Dockerfile文件指令在咱们这里不是要点,读者能够自行查找材料学习。

测试一下

咱们在原来一个实例项目(一个极简的前端项目)的基础上进行升级,把Dockerfile加进去,文件目录变成:

《小团队web技术搭建》(八)Docker+持续部署

编写Dockerfile文件:

FROM node:lts-alpine as builder
WORKDIR /
COPY / /
RUN npm install --registry=https://registry.npm.taobao.org
RUN npm run build
FROM nginx:alpine
COPY /nginx.conf /etc/nginx/
COPY --from=builder /dist/ /project/demo-dockerfile/
# 露出端口
EXPOSE 80

配置nginx:

user  www;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
  worker_connections 1024;
}
http {
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  access_log /var/log/nginx/access.log main;
  keepalive_timeout 65;
  server {
    listen 80;
    server_name localhost;
    location / {
      root /project/demo-dockerfile;
      index index.html index.htm;
    }
  }
}

为了节省时间咱们能够在本地装置docker去测试Dockerfile是否能顺利生成镜像。

运用docker生成镜像的指令如下:

docker build -t dockerfile-test:1.0 .

其间dockerfile-test是咱们给他取的镜像姓名,1.0是镜像的版本号,最后一个.点好是表明Dockerfile文件的位置在当时目录。咱们测试生成镜像成功了。

《小团队web技术搭建》(八)Docker+持续部署

并尝试用这个镜像运转一份容器,咱们需运用docker run创建容器:

docker run --name dockerfile-demo -p 8991:80 -d dockerfile-test:1.0
  • --name dockerfile-demo 给容器起姓名
  • -p 8991:80 将容器80端口映射到宿主主机8991端口
  • -d 后台运转
  • dockerfile-test:1.0 指定要运转的镜像名和版本号

承认容器在运转,并让nginx成功代理了页面:

《小团队web技术搭建》(八)Docker+持续部署

《小团队web技术搭建》(八)Docker+持续部署

加入到流水线

咱们在上一篇文章介绍运用飞流,咱们再新建一个流水线:

《小团队web技术搭建》(八)Docker+持续部署

《小团队web技术搭建》(八)Docker+持续部署

其间布置脚本为,首要做了文件解压和运转start.sh:

BASE_PATH=/www/projects/demo/demo-dockerfile-ci
PROJECT_PATH=/www/projects/demo/demo-dockerfile-ci/demo/dockerfile-demo
tar zxvf $BASE_PATH/package.tgz -C $BASE_PATH
chmod +x $PROJECT_PATH/start.sh
$PROJECT_PATH/start.sh

start.sh文件如下,该文件也保存在项目目录下:

if [[ -n $(docker ps -q -f "name=^dockerfile-test$") ]];then
  docker stop dockerfile-test
  docker rm dockerfile-test
fi
docker run --name dockerfile-test -p 8991:80 -d dockerfile-test:1.3 
docker start dockerfile-test

首要是判断有没有同名容器在运转,有的话就删去它,并构建镜像和运转容器。

好了,流水线配置完毕,咱们运转下流水线。

《小团队web技术搭建》(八)Docker+持续部署

查看布置页面:

《小团队web技术搭建》(八)Docker+持续部署

就此咱们已经完成Docker辅佐CI/CD,不过在实际的生产中,部分项目的布置流水线、构建脚本、运转脚本都会比较复杂,能够慢慢学习。

感谢阅读!欢迎重视系列专栏:《小团队web技能建立》