简介

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

用途

Dockers 的主要用途,目前有三大类:

  1. 提供一次性的环境。 比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
  2. 提供弹性的云服务。 因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
  3. 组建微服务架构。 通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

核心组件

概念图

Docker运行概念图.png
Docker仓库概念图.png

flowchart TB subgraph Container Running((Running))--restart-->Running Running--kill-->Stopped((Stopped)) Stopped--start-->Running Running--pause-->Paused((Paused)) Paused--unpause-->Running end Image--run-->Running Image--export or save-->Tarfiles[Tar files] Tarfiles[Tar files]--import-->Image Image--push-->Registry Registry--pull-->Image Container--commit-->Image classDef line stroke:#333,stroke-width:3px; class Image,Registry,Tarfiles,Running,Stopped,Paused line;
flowchart LR A[Dockerfile]--build-->B[Docker Image]--run-->C[Docker Container] classDef line stroke:#333,stroke-width:3px; class A,B,C line;

镜像 (Image)

类似虚拟机镜像。
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。

# 列出本机的所有 image 文件。
$ docker image ls

# 删除 image 文件
$ docker image rm [imageName]

仓库 (Registry)

仓库是集中存放镜像的地方。仓库又分为公有仓库(DockerHub)和私有仓库
Registry 上有很多 Repository,比如 Ubuntu、Redis、Tomcat 等,共同组成了 Registry。

容器 (Container)

类似 Linux 系统环境,运行和隔离应用。容器从镜像启动的时候,docker 会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变(除非你 commit 了镜像)。
image 文件生成的容器实例,本身也是一个文件,称为容器文件。 也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。

# 列出本机正在运行的容器
$ docker container ls

# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all

Dockerfile

它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。

基本操作和命令

镜像 (image)

搜索 (search)

docker search <image> # 在docker index中搜索image
    --automated=false # 仅显示自动创建的镜像
    --no-trunc=false # 输出信息不截断显示
    -s 0 # 指定仅显示评价为指定星级的镜像

docker search 截至目前(2020 年 12 月 10 日)暂不支持查看镜像的 Tag,可以用 脚本 实现

下载 (pull)

docker pull <image> # 从docker registry server 中拉取image
docker pull [:TAG] # 还可通过指定标签下载某镜像
docker pull centos:latest
docker pull centos:centos8.3.2011
docker pull pytorch/pytorch:1.7.0-cuda11.0-cudnn8-devel

查看

docker images # 列出镜像
docker images -a # 列出所有的镜像(包含历史)

删除

docker rmi <image ID>/<image name> # 通过镜像ID或者名字删除
docker rmi <image ID1> <image ID2> # 删除多个镜像

上传

# 用户在dockerhub网站注册后,即可上传自制的镜像。
docker push NAME[:TAG]

存储

# 存出本地镜像文件为.tar
docker save -o ubuntu_21.04.tar ubuntu:21.04
docker save > nginx.tar nginx:latest 
# 其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)

载入

docker load --input ubuntu_21.04.tar
docker load < ubuntu_21.04.tar

关于 [[#存储|save]] 和 [[#载入|load]]l 与 [[#导出|export]] 和 [[#导入|import]] 的区别参见 这里

容器 (container)

容器是镜像的一个运行实例,不同的是它带有额外的可写层。
可认为 docker 容器就是独立运行的一个或一组应用,以及它们所运行的必需环境。

创建 (运行)

使用镜像来创建 (运行) 一个容器实例,首先得查看镜像的 REPOSITORY 和 TAG,docker run -i -t REPOSITORY:TAG (等价于先执行 docker create 再执行 docker start 命令),如下图所示:

Docker%20RUN运行图.png

其中 -t 选项让 docker 分配一个伪终端并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。若要在后台以守护态(daemonized)形式运行,可加参数 -d

在执行 docker run 来创建并启动容器时,后台运行的标准包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
  • 从宿主机配置的网桥接口中桥接一个虚拟接口到容器
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止
docker start/stop/restart <container ID/name> #:开启/停止/重启容器

进入

docker exec -it <container ID/name> /bin/bash

删除

docker rm <container ID1/name1> <container ID2/name2> #:删除一个或多个容器
docker rm `docker ps -a -q` # 删除所有的容器
docker ps -a -q | xargs docker rm # 同上, 删除所有的容器
docker -rm
    -f # 强制中止运行的容器
    -l # 删除容器的连接,但保留容器
    -v # 删除容器挂载的数据卷

修改

docker commit <container> [repo:tag] # 将一个容器固化为一个新的镜像,后面的repo:tag可选。

导出

docker export container_id > test.tar

导入

cat test.tar | sudo docker import - ubuntu:latest

仓库 (Registry)

仓库分为公共仓库和私有仓库。
关于私有仓库的搭建,可以参考 这里