Linux学习 day10之docker入门

历史由来(废话阶段)

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具有以下几个方面的优势:

  1. 更快的交付和部署:使用 Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker 可以快速创建和删除容器,实现快速迭代,节约开发、测试及部署的时
    间。
  2. 更高效的利用资源:运行 Docker 容器不需要额外的虚拟化管理程序的支持,Docker 是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,与传统的虚拟机方式相比,Docker 的性能要提高 1 ~ 2 个数量级。
  3. 更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑等等,同时支持主流的操作系统发行版本。这种兼容性能让用户可以在不同的平台之间轻松的迁移应用。
  4. 更轻松的管理和更新:使用 Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。

Docker 与虚拟机的比较

作为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机的方式相比具有如下显著优势:

  1. Docker 容器启动很快,启动和停止可以实现秒级,相比传统的虚拟机方式(分钟级)要快速很多。
  2. Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器。
  3. Docker 通过类似 git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。
  4. Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。
特性容器虚拟机
启动速度秒级分钟级
性能接近原生较好
内存MB 级GB 级
硬盘适应MB 级GB 级
运行密度单台主机支持上千个单台主机支持几个
隔离性安全隔离完全隔离
迁移优秀一般

二、 Docker 与虚拟化

Docker 以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。
在这里插入图片描述
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker 容器时在操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

三、 Docker 概念和使用

概念

Docker 中有三个核心概念:镜像、容器和仓库。因此,准确把握这三大概念对于掌握 Docker 技术尤为重要。

  1. 镜像(Image)

Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完
整的一套 Ubuntu16.04 最小系统的 root 文件系统。

  1. 容器(Container)

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静
态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  1. 仓库(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

列举信息中,可以看到几个字段信息:

  1. 镜像来源:来自哪个仓库,默认来自:hub.docker.com
  2. 镜像标签:比喻 1.171000-teach-2020-10-28-13-40-27
  3. 镜像 ID:例如 22fdec3d9a6d
  4. 镜像创建时间:例如:3 weeks ago
  5. 镜像大小: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
支持的命令选项主要包括:

  1. -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]
    ``
    
  2. --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]
    
  3. --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 rmidocker 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 提供了两种方案,下面分别进行介绍。

使用 exportimport

exportimport 的针对点是容器,将本机的容器导出为镜像包。

使用 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

使用 saveload

saveload 的针对的点是镜像,将本机的镜像导入、导出为镜像包

使用 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载入。
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值