Docker 安装及基础入门

Docker 是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。它可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样

Vagrant 是另一款虚拟化工具,与 Docker 的区别参见这里

1. 安装篇

1.1. 系统要求

可通过命令 uname -a 查看系统基本信息

❗️要求:x64 位、内核版本 >= 3.10

推荐:

  • Ubuntu 16.04 Xenial +
  • Debian 8 Jessie +
  • CentOS7 +

提示:如果你要安装 Docker 的操作系统是图形界面,macOS、Windows、Linux 都有对应的桌面客户端 GUI 程序,各自下载地址如下:

说明:Docker Desktop 包含了 Docker 的所有东西,安装了这个就不需要看后续安装步骤了。后续的安装说明,适用于非图形界面的服务器系统

1.2. 一键安装脚本

此脚本适用于 Ubuntu、Debian、CentOS 系统,其中:官方版在某些情况下可能安装比较慢,阿里云的脚本在 CentOS7.4 下多次尝试都失败,所以推荐 DaoCloud 版。

1
2
3
4
5
6
7
8
9
10
# 官方
➜ curl -sSL https://get.docker.com/ | sh

# DaoCloud(推荐)
➜ curl -sSL https://get.daocloud.io/docker | sh

# 阿里云
➜ curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh

➜ wget -qO- http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh

检查是否安装成功

1
2
➜  docker --version
Docker version 18.02.0-ce, build fc4de44

启动 Docker,并加入自启动

1
2
3
➜  systemctl start docker
➜ systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

提示:

安装成功之后,如果想让普通用户拥有 docker 的所有权限,需执行 sudo usermod -aG docker your-user 将普通用户加入到 docker 组,否则需要使用 sudo docker commands 的形式执行所有 docker 命令。

加入 docker 组后,需重启系统才能生效。

1.3. 手动安装官方参考文档

2. 基础入门篇

2.1. 镜像

2.1.1. 介绍

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。

通常 Union FS 有两个用途:

  • 实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下;
  • 将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。

Docker 在 AUFS 上构建的容器也是利用了类似的原理。

2.1.2. 镜像加速器

由于国内访问 Docker Hub 有时会遇到困难,所以需要配置镜像加速器,推荐如下两个,需登录后获取自己的镜像加速地址。

2.1.3. 常用操作命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 搜索镜像
$ docker search ubuntu:16.04

# 获取镜像
$ docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

# 列出镜像(只会显示顶层镜像)
$ docker images

# 删除镜像(需要先删除依赖该镜像的容器)
$ docker rmi [选项] <镜像1> [<镜像2> ...]

# 删除所有虚悬镜像
$ docker rmi $(docker images -q -f dangling=true)

# 删除所有仓库名包含 redis 的镜像
$ docker rmi $(docker images -q redis)

# 修改镜像标签
$ sudo docker tag <镜像ID> <标签名>

# 导出镜像存储文件
$ docker save -o 导出镜像名.tar.gz <镜像ID 或 镜像名:tag>

# 导入镜像存储文件(包含镜像以及相关元数据信息,比如标签等)
$ docker load < 导出镜像名.tar.gz

$ docker load --input 导出镜像名.tar.gz

# 其它

2.2. 容器

2.2.1. 介绍

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。

  • 容器可以被创建、启动、停止、删除、暂停等。
  • 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会把容器和虚拟机搞混。
  • 按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
2.2.2. 常用操作命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 输出一个“hello world”后终止容器
$ docker run ubuntu:16.04 /bin/echo 'hello world'
hello world

# 启动一个 bash 终端,允许用户进行交互
$ docker run -it ubuntu:16.04 /bin/bash
root@0eb917598209:/# exit
exit
$

# 后台运行,主要使用 -d 参数
$ docker run -d ubuntu:16.04 /bin

# 查看运行中的容器
$ docker ps

# 查看所有容器
$ docker ps -a

# 格式化输出:容器ID | 容器名称 | 容器端口映射 | 容器状态
# 更多格式参考官方文档:https://docs.docker.com/engine/reference/commandline/ps/#formatting
$ docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}"

# 进入容器
# 方法一:attach 此方法会受命令阻塞影响,并且 exit 退出后将同时关闭容器
$ docker attach <容器id>
# 方法二:exec(推荐)
$ docker exec -it $CONTAINER_ID /bin/bash

# 关闭容器
$ docker stop $CONTAINER_ID

# 启动已关闭的容器
$ docker start $CONTAINER_ID

# 获取容器的输出信息(-f 选项用于持续获取)
$ docker logs $CONTAINER_ID

# 实时查看容器的最新100条日志
$ docker logs -f --tail=100 $CONTAINER_ID

# 清空对应容器的日志文件
$ docker ps -a | grep $CONTAINER_NAME
$ find /var/lib/docker/containers/ -name *-json.log | grep 959a80270bbc
$ cat /dev/null > /absolute/path/to/959a80270bbc.log

# 查看容器的相关信息
$ docker inspect $CONTAINER_ID

# 删除容器
$ docker rm $CONTAINER_ID-1 $CONTAINER_ID-2 $CONTAINER_ID-3 ...

# 删除所有未运行的容器
$ docker rm $(docker ps -a -q)

# 导出容器快照(将丢弃历史记录和元数据信息)
$ docker export <容器ID> > <导出文件名>.tar

# 从容器快照导入镜像
$ cat <导出文件名>.tar | docker import - <导入之后的镜像名:标签>

# 在宿主机与容器之间相互拷贝文件
$ docker cp [OPTIONS] $CONTAINER_ID:容器中的文件路径 本地目标路径
$ docker cp [OPTIONS] 本地文件路径 $CONTAINER_ID:容器中的目标路径

2.3. Docker 常用命令图解