Docker
Docker 是一种容器技术,一方面 Docker 可以将程序本身同程序的基础架构分离,如同类与实例之间的关系。另一方面,容器就类似于一个封闭的环境,容器之间也是相互分离的,互不干扰的,保证了环境的统一和安全,就不会出现“测试环境没问题,到了生产环境就报错”这样尴尬的情况。
其次就是快速交付、测试以及部署,Docker 可以用来做 CI/CD,自动测试、自动部署以及自动交付代码产物等功能都集成了。
- 保证运行环境的统一
- 一次构建,到处使用
镜像
首先就是开篇提到的类与实例的关系,镜像就是类,镜像类似于系统镜像的概念,对于前端而言,镜像就是包含了代码运行所需要的一切产物、依赖、配置等。这样的话,可以保证每次程序运行的环境一致。构建镜像,一般都是通过一个文本文件来生成。这个文件就是 Dockerfile,文件内容就是一系列的指令集合。
举🌰来说,对于一个简单的前端应用来说,首先需要安装 NodeJS 作为运行环境,其次则是需要安装依赖,最后需要通过npm run build这样的命令来构建应用产物。这个过程在 Dockerfile 中就是一系列的指令集合,后面会具体分析各个指令用法。
容器
有了镜像以后,可以通过镜像产出容器,这个“容器”就是实例的概念,所以拿到容器以后可以放到任意平台去使用、比如 windows、linux、unix 等,真正做到了一处开发,到处使用的功能。需要注意的是容器并不是虚拟机、它只是一个进程,同普通程序一样,理解这点在启动容器的时候尤为重要。
镜像仓库
Docker 中的仓库其实和 github、gitee 这样的代码仓库是类似的概念,只是后者是用来存储源代码、而前者是用来存储镜像的,比如前端肯定会使用到的 NodeJS,则是在 Docker Hub 中可以找到。使用的时候,就可以在仓库中找到对应的镜像即可。同样自己写的镜像也可以上传到仓库中。
基本使用
- 在项目中创建Dockerfile文件
FROM node as builder
# 阶段一
LABEL maintainer=honglang03
COPY package.json ./
RUN set -x \
&& npm install \
&& npm run build
COPY ./ ./
FROM nginx
# 阶段二
COPY --from=builder /dist /usr/share/nginx/html/
COPY --from=builder /docker/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
在 Dockerfile 中,每一行的指令都可以理解为一个单独的 layer,因此指令之间都是独立存在的。FROM指令可以理解为拉取依赖,COPY指令是用于复制文件到指定目录,RUN 指令则是执行 linux 命令,可以使用 && 连接多个命令,换行的时候需要添加转移符号\。详细的Dockerfile指令可以单独熟悉下。
2. 根据Dockerfile文件构建镜像
docker build -t docify/blog .
在项目根目录执行命令,docker build命令后面的 -t 参数表示 tag 标签的意思,就是给镜像起了一个名字叫做 docify/blog。
3. 根据镜像运行容器
docker run -d -p 80:80 --name blog docify/blog
docker run命令则是根据已有的镜像来创建一个容器。-d 参数表示后台运行容器。对于前端应用来说,是启用了 nginx 作为 web 服务器,nginx 是一直需要保持后台运行。--name blog 参数表示运行容器的名字。
指令
docker // 查看所有指令
docker images // 查看本地主机所有的镜像
docker ps // 查看运行中的容器
docker exec -it <conatiner> bash // 进入容器
sudo docker logs <容器 ID> -n 100 -f // 查看容器日志
docker stop <容器 ID> // 停止容器
docker restart <容器 ID> // 重启容器
exit // 退出容器
Jenkins
安装Jenkins
docker pull jenkins/jenkins
运行容器
docker run -d --name jkcontainer -p 8080:8080 -p 50000:50000 jenkins/jenkins
- --name 定义一个容器的名字,如果没有指定,那么会自动生成一个随机数字符串当做UUID
- -d 标识是让 docker 容器在后台运行
- -p 9000:8080 端口映射,将宿主机9000端口映射到容器8080端口
- -p 50000:50000 50000端口是基于JNLP的Jenkins代理(slave)通过TCP与 Jenkins master 进行通信的端口。
启动后可以通过docker ps来查看服务情况,然后通过服务器ip:8080端口就可以访问我们的 jenkins 服务
配置Jenkins
通过 http://<ipaddress>:8080 访问 Jenkins 界面
由于我们是用 docker 安装的,所以密码会被存储到容器中。 管理员初始密码被放到了 /var/jenkins_home/secrets/initialAdminPassword 文件中。
进入jenkins的容器
docker exec -it jkcontainer bash
查看密码,然后再 jenkins 页面中输入密码
cat /var/jenkins_home/secrets/initialAdminPassword
安装插件
登录成功之后就可以安装插件了
安装完推荐的插件后,需要安装两个我们需要的插件
- Nodejs
- Publish Over SSH
在 “首页 > 系统管理 > 插件管理 > 可选插件” 中依次搜索 Node、ssh,依次安装。
安装完配置一下nodejs,在首页 > 系统管理 > 全局工具工具配置 > NodeJS > 新增
新建项目任务,实现构建及部署
首页 > 新建任务 > 构建一个自由风格的软件项目