前端CI/CD 不得不说的 Docker

4,578 阅读4分钟

前言

大家印象中的 docker 应该是运维同学比较关心或者擅长的工具,事实也的确如此。但是在前端过程越来越复杂,甚至前端早就在中台 node 占据一席之地的现在,docker 也越来越多地出现在前端领域。

本篇文章站在前端开发者的角度来看 docker,介绍其基本概念及使用,希望通过阅读可以让大家对 docker 有个基础认识。

docker

在谈 docker 之前,我们先回想下搭建服务的过程,无论是搭建后端服务,还是爬虫等,我们首先得在本机上配置语言相关的环境,如编译器,变量环境等等,有时候还得下载对应的数据库。反正就是需要一系列的环境准备,经常配置个老半天的还可能被某个步骤卡住了。

在本机开发完成,需要部署线上环境的时候,往往又得跑一遍相同环境配置,因为计算机环境不同,配置也并不会一帆风顺。明明在我本机上这样可行的,但是在他人机器上却不行了。

所以 docker 的出现就是为了解决服务迁移过程中的这种不确定性,既然环境不同会引起一系列差异问题出现,那我干脆连环境一起迁移好了。

类似于虚拟机,docker 也是提供一份隔离环境,叫做容器。但是相比于虚拟机而已,它却非常的节约资源,高效。

image.png

docker 相关的概念

docker

在我的理解,docker 提供的是一份引擎、工具,安装的时候也会提供可视化的桌面应用,实际上这不是必须的。

安装(macOS)

brew install docker

安装后验证是否成功

docker -v

镜像 Image

镜像是指 (服务 + 环境)的集合,也可以比作语言中的类,比如在将本机配置好的环境和服务打包成镜像,有了镜像,别人就可以生产一模一样的环境和服务,不需要再处理计算机环境的差异。

以 niginx 为例

查找镜像

docker search nginx

下载镜像(很像克隆git仓库或者npm下载包)

docker pull nginx:latest

查看镜像列表

docker image ls

删除镜像(imageId在镜像列表中可以查到)

docker image <imageId>

容器 Container

origin_img_v2_80d4af75-53d4-4606-af07-8eae6625057g.jpg

容器可以理解为运行镜像后生成的整个环境,可以比作语言中的实例。我们通过生成容器将镜像实例化,以后对服务或者环境的相关操作其实就是在容器中进行的,更改的是容器相关的配置或者数据。

生成容器,

docker run -d -p 8080:80 nginx

相关参数含义

  • d 后台运行

  • p 端口映射 <计算机>:<容器> 即将对主机 8080 的访问 映射到对容器 80 端口的访问

  • nginx 镜像

查看容器列表

docker container ls

删除容器(containerId在镜像列表中可以查到)

docker container rm <containerId>

启动 停止 重启

docker start|stop|restart <containerId>

仓库

类似 npm 包的仓库,docker 官方也会提供热门的服务镜像在上面。比较简单,就不多说。

docker search <image>
docker pull <image>

举个🌰

我们来试试怎么启动个 nginx 服务

先查找仓库中有没有对应的镜像

docker search nginx

下载镜像

docker pull nginx

生成并启动容器

docker run -d -p 8080:80 nginx

打开 http://localhost:8080 查看成功页面

更改配置

方式一

我们可以通过复制命令来更改容器配置

先从容器内复制到容器外面

docker cp <containerId>:/etc/nginx/nginx.conf <localpath>/nginx.conf

再从容器外面复制到容器里面

docker cp <localpath>/nginx.conf <containerId>:/etc/nginx/nginx.conf

重启容器

docker restart <containerid>

方式2

也可以进入容器直接修改配置文件

进入容器

docker exec -it <containerId> bash 
  • i 交互式

  • t 终端

下载 vim

apt-get update
apt-get install vim

修改文件

vim etc/nginx/nginx.conf

其他

实际还有一些重要的概念没有讲到

Dockerfile

自定义镜像的配置文件,类似 package.json,可以在其他镜像的基础上进一步配置我们的自定义镜像。

docker build <imagename>

Docker Compose

用于组合不同镜像,例如你需要同时使用后端服务和数据库镜像,一起配置使用

现在安装 docker 的时候会自动安装 Compose

docker-compose -v

通过 docker-compose.yml 定义组合,例如

version: '3'
services:

  web:
    build: .
    ports:
     - "5000:5000"

  redis:
    image: "redis:alpine"

运行

docker-compose up

结语

docker 的使用实际上非常方便,主要在不同的计算机下载好了 docker,就可以很方便地迁移服务等。对于运维来说如果可以放在 docker 中的服务,意味着可以实现一次配置,到处使用。前端工程化及中台相关的服务也可以通过 docker 来进行搭建。