欢迎关注系列专栏:《小团队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加进去,文件目录变成:
编写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
文件的位置在当前目录。我们测试生成镜像成功了。
并尝试用这个镜像运行一份容器,我们需使用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成功代理了页面:
加入到流水线
我们在上一篇文章介绍使用飞流
,我们再新建一个流水线:
其中部署脚本为,主要做了文件解压和运行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
主要是判断有没有同名容器在运行,有的话就删除它,并构建镜像和运行容器。
好了,流水线配置完毕,我们运行下流水线。
检查部署页面:
就此我们已经完成Docker辅助CI/CD,不过在实际的生产中,部分项目的部署流水线、构建脚本、运行脚本都会比较复杂,可以慢慢学习。
感谢阅读!欢迎关注系列专栏:《小团队web技术搭建》