前言
大家印象中的 docker 应该是运维同学比较关心或者擅长的工具,事实也的确如此。但是在前端过程越来越复杂,甚至前端早就在中台 node 占据一席之地的现在,docker 也越来越多地出现在前端领域。
本篇文章站在前端开发者的角度来看 docker,介绍其基本概念及使用,希望通过阅读可以让大家对 docker 有个基础认识。
docker
在谈 docker 之前,我们先回想下搭建服务的过程,无论是搭建后端服务,还是爬虫等,我们首先得在本机上配置语言相关的环境,如编译器,变量环境等等,有时候还得下载对应的数据库。反正就是需要一系列的环境准备,经常配置个老半天的还可能被某个步骤卡住了。
在本机开发完成,需要部署线上环境的时候,往往又得跑一遍相同环境配置,因为计算机环境不同,配置也并不会一帆风顺。明明在我本机上这样可行的,但是在他人机器上却不行了。
所以 docker 的出现就是为了解决服务迁移过程中的这种不确定性,既然环境不同会引起一系列差异问题出现,那我干脆连环境一起迁移好了。
类似于虚拟机,docker 也是提供一份隔离环境,叫做容器。但是相比于虚拟机而已,它却非常的节约资源,高效。
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
容器可以理解为运行镜像后生成的整个环境,可以比作语言中的实例。我们通过生成容器将镜像实例化,以后对服务或者环境的相关操作其实就是在容器中进行的,更改的是容器相关的配置或者数据。
生成容器,
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 来进行搭建。