docker 是为了统一环境、配置、依赖问题而诞生的方案。

历史背景

为了统一环境、配置、依赖问题,曾经出现过虚拟机方案,但虚拟机方案有以下问题:

  • 资源占用多
  • 操作步骤复杂
  • 需要完整地运行一个操作系统
  • 启动慢

在虚拟机方案上再做升级之后,出现这样 linux 容器的概念,一种虚拟化技术,对进程进行隔离。

docker就是 linux 容器的封装,提供操作 linux 容器的接口,还将容器状态以版本(镜像)的方式管理。

认识 docker

docker 是服务端/客户端架构,通常服务端是一个服务进程,与客户端运行在同一主机上,可使用如下命令查看 docker 服务进程是否运行:

1
docker version

这个命令当然也可以查看版本,docker 的版本信息,如果无法查看版本,则说明服务进程没有运行。

docker 用途

  • 一次性环境
  • 弹性云服务
  • 微服务架构

镜像与容器

镜像(image)是指只读层的重叠,就像代码版本一样,可以被复制、分享,它是「环境的版本」,将应用程序和依赖打包在一起;

容器实例(container)是指一堆层的统一视角,与镜像的区别在于最上面的「可读写层」,可对容器进行更改写入,生成新的镜像,而一个镜像,也可以生成一个新的运行时容器。

另外,镜像和容器本质上都是文件,如果关闭容器,只是停止容器运行,文件仍然存在,仍然占据空间。

镜像市场

hub.docker.com

docker 专门设立的镜像市场,可以直接从镜像市场上得到你想要的镜像。

但是官方镜像市场是外国服务器,中国访问非常缓慢,国内也有镜像市场,是对官方镜像市场的拷贝。

如何使用中国镜像

常用命令

  • docker search name
    从市场搜索镜像
  • docker pull library/image
    下载镜像,如果是 docker 的官方镜像,则可省略 library
  • docker run image [command]
    根据 image 运行一个容器实例, command 指运行该容器实例后,在容器内运行的命令
    此命令有如下注意点:
    • 如果本地没有该 image ,会自动从镜像市场下载;
    • 该命令运行结束后,会自动停止该容器,但对容器做的改动,不会丢失;
    • 有些需要运行服务的容器,不会自动停止,比如ubuntu、nginx、apache等
    • 如果在 docker run 后面加上 –it ,则可将当前 cli 窗口映射到容器的 cli 窗口,可实现与容器交互,如 docker run –it ubuntu bash
  • docker ps
    获得容器列表
  • docker commit id name
    根据当前容器生成一个镜像, id 为 container id
  • docker inspect name
    查看容器信息
  • docker push library/name
    发布镜像到市场
  • docker image ls
    列出镜像列表
  • docker image rm name
    删除镜像
  • docker kill containerID
    终止运行中的容器
  • docker container ls
    列出所有容器,同docker ps
  • docker container ls –all
    列出停止的容器
  • docekr container rm containerID
    删除容器文件
  • docker container start ID
    启动已停止的容器
  • docker container stop ID
    停止容器,与 kill 比起来,会先收尾,再关闭,而 kill 则直接关闭
  • docker container logs ID
    查看该容器的命令行输出,如 run 时没加 –it
  • docker container exec –it ID bash
    进入容器 shell
  • docker container cp ID:/path/file
    将容器内的文件拷贝到本机
  • docker run –d
    「–d」指容器启动成功后,在后台运行

创建 image

新建 .dockerignore

此文件排除不需要打包进 image 的路径及文件,类似于 .gitignore 。

1
2
.git
vendor

新建 Dockerfile

1
2
3
4
5
6
FROM node:8.4		// 代表此镜像继承于官方的 node 8.4 镜像
COPY . /app // 将当前 . 目录的内容拷贝进容器的 /app 目录,除 .dockerignore 指定的以外
WORKDIR /app // 指定接下来的工作目录在 /app 下
RUN npm install // 在 /app 下执行 npm install 命令,安装好的依赖也会被打包进镜像中
EXPOSE 3000 // 开放 3000 端口允许外部连接
CMD node demo/1.js // 在该此镜像被生成容器运行后,自动执行此命令

Dockerfile 是一个文本文件,用于配置 image ,docker 根据此文件生成 image 文件

生成镜像

1
docker image build -t name:version

version 不指定时默认为 latest

运行容器

1
docker container run –p 8000:3000 –it bash

以该 image 生成容器实例并运行,并将本机的 8000 端口映射到容器的 3000 端口

CMD 与 RUN 的区别:

  • RUN 可以有多个, CMD 只能有一个
  • RUN 的执行结果会被打包进 image ,也就是在打包之前执行;CMD 则在 image 创建成功,且被生成容器运行后,才会在容器中执行
  • 有 CMD 之后,docker run 的时候就不能加入 –it 和 bash了,否则会CMD 不会再执行

发布 image 到市场

在 hub.docker.com 注册账号后,执行以下命令:

1
2
3
docker login
docker image tag imagename username/library:version
docker image push library/name:version

docker 编排工具

docker compose 是多个 docker 容器组成一个应用的关联工具,docker-compose.yml 中写好多个容器之间的联系