手把手构建前端CI/CD:Docker 入门使用
Docker解决了什么问题?
想要理解docker解决了什么问题,首先,我们要知道,在docker出现之前是什么样子?
-
物理机: 首先就是最原始的阶段,直接使用物理机,即我们平时使用的电脑就是一台物理机。
-
虚拟机:即我们可以在操作系统去运行另外一种操作系统,比如:在window系统了运行linux系统,但是,这种安装虚拟机的方式,会有以下几个缺点:
- 资源占用多:
- 步骤冗余多
- 启动慢
-
Linux容器:由于虚拟机存在这些缺点,Linux又发展出了另外一种虚拟化技术:
Linux 容器,它不是模拟一个完整的操作系统,而是对进程进行隔离。
或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。- 启动快:启动容器,相当于就是启动本机的一个进程,而不是启动整个操作系统,所以速度会很快
- 资源占用少:容器只占用需要的资源,不会占用不需要的资源,而虚拟机相当于是一个完整的操作系统,不可避免会占用所有资源。 另外,多个容器之间还可以共享资源,而虚拟机做不到。
- 体积很小:容器只会包含用到的组件,而虚拟机是整个操作系统的打包,因此文件会小很多。
-
Docker容器:Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。 它是目前最流行的 Linux 容器解决方案。
Docker的安装
- 安装docker
brew install docker // 这里是mac系统的安装方式
也可以直接去docker 官网下载。
安装完成以后,我们可以执行docker --version
来验证是否安装成功。
Docker核心概念
镜像 - image
镜像 可以简单类比着理解为 我们平时系统上安装的各种软件,比如:我们自己的mac其实就是一个物理机,同时这台机器上可能安装了大量的应用,比如:nginx,node等。而在Docker中是怎么安装这些应用程序呢?Docker其实会把应用程序及其依赖,都打包在一个image文件里,这个image文件就是镜像,其实就是一个二进制文件。在docker中实际安装的就是一个个的镜像 例如:我们刚刚所说nginx,在docker中也会有对应的nginx镜像。
同时,在实际开发中,镜像是可以相互继承的。一个image文件往往通过继承另外一个基础image文件,同时,再加上一个个性化的设置,从而生成一个新的image文件。
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。
为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。
容器 - container
有了image镜像以后,我们才可以生成Docker容器,这点可能和物理机正好反过来啦,不过也好理解,容器不像物理机,虚拟机那样,不需要整个操作系统所有文件,而是按需引入需要的文件即可,这里所说的需要的文件其实就是镜像,确定了需要哪些镜像,我们就可以创建相应的容器啦。
常用Docker命令
镜像相关命令
-
创建镜像
docker image build -t test_image . // 基于当前目录的Dockerfile创建指定名称的镜像test_image docker image build -t test_image:0.0.1 . // 也可以指定镜像的版本
-
安装镜像:即安装市场开源的镜像
docker image pull nginx // 安装nginx镜像
-
删除镜像
docker image rm nginx // 删除nginx静心啊个
-
查看镜像列表
docker image ls // 或者 docker images
-
发布镜像
即我们想把自己创建的镜像发布到docker hub中,让其他人使用。
// 1. 去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。 docker login // 2. 为本地的 image 标注用户名和版本。 $ docker image tag [imageName] [username]/[repository]:[tag] # 实例 $ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1 //3. 发布 image 文件。 docker image push [username]/[repository]:[tag]
发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。
容器相关命令
-
创建容器
docker container run -d -p 8000:80 --name [容器名] [镜像名] // 基于指定镜像创建容器 // -d 表示docker容器启动以后在后台运行 // -p 表示指定容器启动后对应的端口号 // --name 指定容器名
-
运行容器
docker container run
每次执行都会新建一个容器,多次执行,就会生成多个一摸一样的容器,而docker container start
是启动指定容器。docker container start [containerID]
-
查看容器列表
docker container ls // 或者 docker ps
-
删除容器
docker container rm [containerID]
-
终止容器运行
docker container stop [containerID] // 不会立即终止 docker constainer kill [containerID] // kill命令会强制立即终止,那些正在进行的操作会全部丢失
不过,容器停止运行后,并不会消失,容器列表里依然存在。
-
查看容器日志
docker container logs [containerID]
-
进入指定容器,查看容器内的文件
docker container exec -it [containerID] /bin/bash // --it命令必须有 // 进入容器之后,可以执行exit命令退出。 exit;
Dockerfile文件详解
Dockerfile文件常见语法:
FROM // base image
RUN // 执行命令
ADD // 添加文件
COPY // 拷贝文件
CMD // 执行命令
EXPOSE // 暴露端口
WORKDIR // 指定路径
MAINTAINER // 维护者
ENV // 设置环境变量
ENTRYPOINT // 容器入口
USER // 指定用户
VOLUMNE // mount point
案例体会
接下来,我们通过一个小例子实际体会一下:
-
创建Dockerfile文件
FROM alpine:latest // 表示基于哪个基础镜像,alpine:latest是常用的最小集合的镜像 MAINTAINER fengyuchao // 维护者,即一个备注说明 CMD echo 'hello docker'
-
基于Dockerfile文件创建镜像
docker build -t hello_docker . // 基于当前目录创建一个hello_docker镜像
-
查看镜像
docker images // 此时我们就可以看到列表会有一个hello_docker镜像
-
执行镜像
docker run hello_image // 输出 hello docker