历史由来(废话阶段)
ocker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
一、 为什么要使用 Docker
Docker 容器虚拟化的好处
在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发部署,而这正是 Docker 所能够提供的最大优势。Docker 提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。
Docker 在开发和运维中的优势
对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让应用正常运行,而 Docker 恰恰可以实现这一中级目标。具体来说,在开发和运维过程中,Docker具有以下几个方面的优势:
- 更快的交付和部署:使用 Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker 可以快速创建和删除容器,实现快速迭代,节约开发、测试及部署的时
间。- 更高效的利用资源:运行 Docker 容器不需要额外的虚拟化管理程序的支持,Docker 是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,与传统的虚拟机方式相比,Docker 的性能要提高 1 ~ 2 个数量级。
- 更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑等等,同时支持主流的操作系统发行版本。这种兼容性能让用户可以在不同的平台之间轻松的迁移应用。
- 更轻松的管理和更新:使用 Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。
Docker 与虚拟机的比较
作为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机的方式相比具有如下显著优势:
- Docker 容器启动很快,启动和停止可以实现秒级,相比传统的虚拟机方式(分钟级)要快速很多。
- Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器。
- Docker 通过类似 git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。
- Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较好 |
内存 | MB 级 | GB 级 |
硬盘适应 | MB 级 | GB 级 |
运行密度 | 单台主机支持上千个 | 单台主机支持几个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移 | 优秀 | 一般 |
二、 Docker 与虚拟化
Docker 以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker 容器时在操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
三、 Docker 概念和使用
概念
Docker 中有三个核心概念:镜像、容器和仓库。因此,准确把握这三大概念对于掌握 Docker 技术尤为重要。
- 镜像(Image)
Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完
整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静
态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository)
用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可 以在仓库中下载下来。
【Docker 安装】
Docker 引擎是使用 Docker 容器的核心组件,可以在主流的操作系统和云平台上使用,包括 Linux 操作系统、MacOSS 和 Windows 系统上。用户可以访问 Docker 官网(https://www.docker.com/getstarted)去获取 Docker安装包。
一、在 CentOS 系统上安装 Docker
Docker 目前支持 CentOS 7 及以后版本。系统的要求跟 Ubuntu 情况类似,64 位操作系统,内核至少是 3.10以上。
更换系统 yum 源
# 查看系统内核版本
uname -a
# Linux alvin-test-os 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64
# x86_64 x86_64 GNU/Linux
# 备份原来 YUN 源
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 更换 YUM 源
cat > /etc/yum.repos.d/CentOS-Base.repo <<EOF
[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
o=os
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7
[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearc
h/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
o=updates
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7
[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch
/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
o=extras
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7
[centosplus]
name=CentOS-$releasever - Plus
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/centosplus/$base
arch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
o=centosplus
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7
EOF
# 刷新 yum 源缓存
yum makecache
首先,为了方便我们需要更新一下系统:
yum update -y --exclud=kernel* 已加载插件:fastestmirror
# Loading mirror speeds from cached hostfile
# * base: mirrors.aliyun.com
# * extras: mirrors.aliyun.com
# * updates: mirrors.aliyun.com
安装所需的基础软件
curl -o /etc/yum.repos.d/CentOS-Base.repo
# https://mirrors.aliyun.com/repo/Centos-7.repo
# % Total % Received % Xferd Average Speed Time Time Time Current
# Dload Upload Total Spent Left Speed
# 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
# 100 2523 100 2523 0 0 6973 0 --:--:-- --:--:-- --:--:-- 6988
安装 yum 源
yum-config-manager --add-repo
# https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 已加载插件:fastestmirror
# adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
# repo saved to /etc/yum.repos.d/docker-ce.repo
更新并安装 Docker-CE
yum makecache fast
# 已加载插件:fastestmirror
# Loading mirror speeds from cached hostfile
# * base: mirrors.aliyun.com
# * extras: mirrors.aliyun.com
# * updates: mirrors.aliyun.com
# base | 3.6 kB 00:00:00
# docker-ce-stable | 3.5 kB 00:00:00
# extras | 2.9 kB 00:00:00
# updates | 2.9 kB 00:00:00
# 元数据缓存已建立
yum -y install docker-ce
# 已加载插件:fastestmirror
# Loading mirror speeds from cached hostfile
# * base: mirrors.aliyun.com
# * extras: mirrors.aliyun.com
# * updates: mirrors.aliyun.com
启动并设置开机自启动
systemctl enable --now docker
测试启动
docker info
# 配置详情
Client:
Debug Mode: false
Server:
Containers: 1
Running: 1
Paused: 0
Stopped: 0
Images: 1
Server Version: 19.03.13
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1127.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.67GiB
Name: alvin-test-os
ID: HR6P:IIZP:6CKH:N2L5:IQ2T:AJFP:CCAT:S2ZG:MWC4:DZBQ:XUZM:UKLC
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
二、在 Ubuntu 环境上安装 Docker
Ubuntu 操作系统对 Docker 的支持十分成熟,可以支持包括 x86_64、armhf 等系统架构,只要是 64 位即可。
Docker目前支持最低Ubuntu版本为14.04LTS,但实际上从稳定性上考虑,推荐使用16.04LTS 或18.04LTS版本,并且系统内核越新越好,以支持 Docker 最新的特性。
查看版本信息
第一种方式
uname -a
# Linux alvin-test-os 4.15.0-117-generic #118-Ubuntu SMP Fri Sep 4 20:02:41 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
第二种方式
cat /proc/version
# Linux version 4.15.0-117-generic (buildd@lcy01-amd64-008) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #118-Ubuntu SMP Fri Sep 4 20:02:41 UTC 2020
更新系统
apt-get update
Get:1 http://mirrors.cloud.aliyuncs.com/ubuntu bionic InRelease [242 kB]
Get:2 http://mirrors.cloud.aliyuncs.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:3 http://mirrors.cloud.aliyuncs.com/ubuntu bionic-security InRelease [88.7 kB]
Get:4 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/universe Sources [9,051 kB]
Get:5 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/main Sources [829 kB]
Get:6 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/main amd64 Packages [1,019 kB]
Get:7 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/main i386 Packages [1,007 kB]
Get:8 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/main Translation-en [516 kB]
Get:9 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/universe amd64 Packages[8,570 kB]
Get:10 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/universe i386 Packages[8,531 kB]
Get:11 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/universe Translation-en[4,941 kB]
Get:12 http://mirrors.cloud.aliyuncs.com/ubuntu bionic-updates/main Sources [497kB]
... 此处略去许多行
安装基础软件
apt-get -y install apt-transport-https ca-certificates curl
software-properties-common
Reading package lists... Done
Building dependency tree
Reading state information... Done
curl is already the newest version (7.58.0-2ubuntu3.10).
The following additional packages will be installed:
python3-software-properties unattended-upgrades
Suggested packages:
。。。此处略去很多行
安装 GPG 证书
curl -fsSL
# https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - OK
写入软件源信息
sudo add-apt-repository "deb [arch=amd64]
https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
Hit:1 http://mirrors.cloud.aliyuncs.com/ubuntu bionic InRelease
Hit:2 http://mirrors.cloud.aliyuncs.com/ubuntu bionic-updates InRelease
Hit:3 http://mirrors.cloud.aliyuncs.com/ubuntu bionic-security InRelease
Get:4 https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic InRelease [64.4 kB]
Get:5 https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages [13.0 kB]
Fetched 77.4 kB in 0s (307 kB/s)
Reading package lists... Done
更新并安装 Docker-CE
root@alvin-test-os:~# sudo apt-get -y update
Hit:1 http://mirrors.cloud.aliyuncs.com/ubuntu bionic InRelease
Hit:2 http://mirrors.cloud.aliyuncs.com/ubuntu bionic-updates InRelease
Hit:3 http://mirrors.cloud.aliyuncs.com/ubuntu bionic-security InRelease
Hit:4 https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic InRelease
Reading package lists... Done
root@alvin-test-os:~# sudo apt-get -y install docker-ce
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
aufs-tools cgroupfs-mount containerd.io docker-ce-cli git git-man libcurl3-gnutls
liberror-perl pigz
Suggested packages:
git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb
git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
aufs-tools cgroupfs-mount containerd.io docker-ce docker-ce-cli git git-man
libcurl3-gnutls liberror-perl pigz
0 upgraded, 10 newly installed, 0 to remove and 86 not upgraded.
启动并检验
root@alvin-test-os:~# docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:02:36 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.13
API version: 1.40 (minimum version 1.12)
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:01:06 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.7
GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
三、第一个 Docker 实例
root@alvin-test-os:~# docker run -d --rm --name nginx -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
bb79b6b2107f: Pull complete
5a9f1c0027a7: Downloading [==============> ] 7.457MB/26.49MB
5a9f1c0027a7: Downloading [======================> ] 12.17MB/26.49MB
166a2418f7e8: Download complete
1966ea362d23: Download complete
【使用 Docker 镜像】
docker 镜像是 docker 中三大概念之一,其主要作用是作为启动容器的模板。
1. 获取镜像
镜像是运行容器的模板,官方 Docker Hub 仓库已经提供了许多镜像共开发者使用。如果我们需要获取某个镜像则可以去 docker 仓库下载所需的镜像。
下载镜像的格式:docker pull [image_name][:image_version]
下载镜像实例:
[root@alvin-test-os ~]# docker pull nginx:1.17
1.17: Pulling from library/nginx
afb6ec6fdc1c: Pull complete
b90c53a0b692: Pull complete
11fa52a0fdc0: Pull complete
Digest: sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699
Status: Downloaded newer image for nginx:1.17
docker.io/library/nginx:1.17
下载的时候,我们可以看到有若干层组成,像 afb6ec6fdc1c 这样的字符串是层的唯一 ID(实际上,完整的 ID包括 256 比特, 64 个十六进制字符组成)。使用 docker pull 命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层的时候,本地仅存一份内容,减小存储空间。
2. 查看镜像信息
镜像主要包括镜像文件、镜像 tag 以及镜像详细信息等等。
镜像列表
使用 docker images 或 docker images ls 命令可以列举本地主机上已有镜像的基本信息。
[root@alvin-test-os ~]# docker images
REPOSITORY TAG IMAGE ID
CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/alvinos/teach 1000-teach-2020-10-28-13-40-27
22fdec3d9a6d 3 weeks ago 1.02GB
nginx 1.17
9beeba249f3e 6 months ago 127MB
列举信息中,可以看到几个字段信息:
- 镜像来源:来自哪个仓库,默认来自:
hub.docker.com
- 镜像标签:比喻
1.17
、1000-teach-2020-10-28-13-40-27
- 镜像 ID:例如
22fdec3d9a6d
- 镜像创建时间:例如:
3 weeks ago
- 镜像大小:
127MB
其中镜像的 ID 信息十分重要,它唯一标识了镜像。在使用镜像 ID 的时候,一般可以使用该 ID 的前若干个字符组成的可区分串来替代完整的 ID。
TAG 信息用于标记来自同一个仓库的不同镜像。TAG 在同一个仓库中是唯一的。
镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像逻辑体积之和。
image 子命令主要支持如下选项:
-a
: 列出所有(包括临时文件)镜像文件
--digests=true|false
:列出镜像的数字摘要值
-q
: 仅显示 ID 信息
为镜像添加 tag
为了方便后续工作中使用特定的镜像,还可以使用 docker tag 命令来为本地的镜像添加标签。
[root@alvin-test-os ~]# docker images
REPOSITORY TAG IMAGE ID
CREATED SIZE
redis latest
74d107221092 19 hours ago 104MB
[root@alvin-test-os ~]# docker tag redis:latest myredis:latest
[root@alvin-test-os ~]# docker images
REPOSITORY TAG IMAGE ID
CREATED SIZE
myredis latest
74d107221092 19 hours ago 104MB
redis latest
74d107221092 19 hours ago 104MB
使用 inspect 命令查看详细信息
使用 docker inspect 命令获取镜像的详细信息,包括 PID、作者、架构等等。
[root@alvin-test-os ~]# docker inspect redis
[
{
"Id":
"sha256:74d107221092875724ddb06821416295773bee553bbaf8d888ababe9be7b947f",
"RepoTags": [
"myredis:latest",
"redis:latest"
],
"RepoDigests": [
"redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489"
],
... 此处略去千百行
}
]
使用 history 命令查看镜像历史
docker history redis
注意:有些构建信息过长,可以使用--no-trunc
选项来输出完整信息。
搜索镜像
在docker中搜索镜像主要使用Search
子命令,默认只搜索Docker Hub
官方镜像仓库中的镜像。其语法为:
docker search [option] keyword
支持的命令选项主要包括:
-f
: 过滤输出内容
案例:搜索官方提供的带有Redis
关键字的镜像:
案例:搜索被收藏超过[root@alvin-test-os ~]# docker search -f is-official=true redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that … 8779 [OK]
8000
个的并且关键词包括Redis
的镜像[root@alvin-test-os ~]# docker search -f stars=8000 redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that … 8779 [OK] ``
--limit
: 限制输出结果`[root@alvin-test-os ~]# docker search -f stars=8 --limit 3 redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that… 8779 [OK] bitnami/redis Bitnami Redis Docker Image 167 [OK] rediscommander/redis-commander Alpine image for redis-commander - Redis man… 47 [OK]
--no-trunc
: 不截断输出结果[root@alvin-test-os ~]# docker search -f stars=8 --limit 3 --no-trunc redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that functions as a data structure server. 8779 [OK] bitnami/redis Bitnami Redis Docker Image 167 [OK] rediscommander/redis-commander Alpine image for redis-commander - Redis management tool. 47 [OK]
输出参数释义
NAME
: 镜像仓库源的名称
DESCRIPTION
: 镜像的描述
OFFICIAL
: 是否 docker 官方发布
stars
: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED
: 自动构建。
删除和清理镜像
在 docker 中,删除镜像主要使用 rmi
子命令,清理镜像主要使用 prune
子命令。
使用标签删除镜像
使用 docker rmi
或 docker image rm
命令可以删除镜像,命令格式为 docker rmi image
[root@alvin-test-os ~]# docker rmi redis
Untagged: redis:latest
Untagged:
redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489
参数:
-f : 强制删除镜像。
[root@alvin-test-os ~]# docker rmi -f redis
Untagged: redis:latest
Untagged:
redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489
清理镜像
使用一段时间之后,docker 会产生很多临时文件,以及一些没有被使用的镜像,我们可以通过 docker image prune 命令来进行清理。
参数:
-a
:删除所有无用的镜像,不光是临时镜像。
查看原来的镜像
docker images
删除所有的未被使用的镜像
docker image prune -a
-f
:强制删除镜像,而不进行提示。
docker image prune -a -f
构建镜像
构建镜像一般有三种情况,基于容器导入、基于本地模板导入、基于 Dockerfile 创建,本章主讲基于容器保存镜像和本地保存镜像导入。
基于容器保存
主要格式:docker [container id] commit
- 主要参数:
-a
作者信息
-m
提交信息
-p
提交时,暂停容器运行
启动一个容器、修改并保存:
[root@alvin-test-os ~]# docker run -d -it centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
820a17fe3935938b0d4208797f165db22e205e2a15d6dd053b4aeedbcba6cb12
[root@alvin-test-os ~]# docker ps
CONTAINER ID IMAGE
COMMAND CREATED STATUS PORTS NAMES
820a17fe3935 centos "/bin/bash" About a minute ago Up About a minute happy_kare
[root@alvin-test-os ~]# docker exec 820a17fe3935 touch test
[root@alvin-test-os ~]# docker commit -m "Add a file" -a "Alvin" 820a17fe3935
centos:v1
sha256:407b93005a8f27cd7eba5a10077994cf27c7a978e542fcf5b85a9caed0003bc9
[root@alvin-test-os ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE centos v1
407b93005a8f 4 seconds ago 215MB
基于本地模板导入
用户也可以将保存的镜像传到另一台机器上,另一台机器就可以直接导入。
cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import -ubuntu:18.04
保存镜像
有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。
对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。
使用 export
和import
export
和 import
的针对点是容器,将本机的容器导出为镜像包。
使用 export
保存容器为镜像
docker export daf9c3656be3 > nginx.tar
ll | grep nginx.tar
# -rw-r--r-- 1 root root 135117824 9 月 24 20:51 nginx.tar
使用 import
导入包为镜像
[root@instance-gvpb80ao docs]# docker import nginx.tar test/nginx:v1
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b
[root@instance-gvpb80ao docs]# docker images | grep test
test/nginx v102107323de1b 22 seconds ago 131MB
使用 save
和 load
save
和 load
的针对的点是镜像,将本机的镜像导入、导出为镜像包
使用 save
保存镜像
[root@instance-gvpb80ao docs]# docker save 6858809bf669 > busybox.tar
[root@instance-gvpb80ao docs]# ll | grep busy
-rw-r--r-- 1 root root 1458176 9 月 24 21:01 busybox.tar
使用 save
保存多个镜像
[root@instance-gvpb80ao docs]# docker save -o test.tar busybox nginx:1.18.0
[root@instance-gvpb80ao docs]# docker load < test.tar
Loaded image: busybox:latest
Loaded image: nginx:1.18.0
使用 load
导入镜像
[root@instance-gvpb80ao docs]# docker load < busybox.tar
[root@instance-gvpb80ao docs]# docker load -i busybox.tar
Loaded image ID:
sha256:6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
[root@instance-gvpb80ao docs]# docker images | grep 685880
busybox latest
6858809bf669 2 weeks ago 1.23MB
两种方案的差别
文件大小不同
export
导出的镜像文件体积小于 save 保存的镜像
是否可以对镜像重命名
docker import
可以为镜像指定新名称,docker load
不能对载入的镜像重命名。
是否可以同时将多个镜像打包到一个文件中
docker export
不支持,docker save
支持。
是否包含镜像历史
export
导出(import
导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
save
保存(load
加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer
)。
[root@instance-gvpb80ao docs]# docker history
6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
IMAGE CREATED CREATED BY SIZE
COMMENT
6858809bf669 2 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:72be520892d0a903d…
1.23MB
应用场景不同
docker export
的应用场景:主要用来制作基础镜像,比如我们从一个ubuntu
镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export
保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker save
的应用场景:如果我们的应用是使用docker-compose.yml
编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用docker save
将用到的镜像打个包,然后拷贝到客户服务器上使用docker load
载入。