docker基础
储备知识
(什么是docker)docker背景:
Docker 是一个开源项目,诞生于 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
1、docker容器虚拟化的好处
在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制; 同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序 的方式,快速分发部署,而这正是 Docker 所能够提供的最大优势。Docker 提供了一种更为聪明的方式,通过 **容器来打包应用、解耦应用和运行平台。**这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了, 无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。
简而言之,docker就是为了解决异构环境下的应用部署问题
异构环境指:多台服务器之间的运行环境不同
2、 Docker 在开发和运维中的优势
对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让应用正常运行,而 Docker恰恰可以实现这一终极目标。具体来说,在开发和运维过程中,Docker 具有以下几 个方面的优势:
1、更快的交付和部署:使用 Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker可以快速创建和删除容器,实现快速迭代,节约开发、测试及部署的时间。
2、更高效的利用资源:运行 Docker容器不需要额外的虚拟化管理程序的支持,Docker 是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,与传统的虚拟机方式相比,Docker 的性能要提高 1 ~ 2 个数量级。
3、更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑等等,同时支持主流的操作系统发行版本。这种兼容性能让用户可以在不同的平台之间轻松的迁移应用。
4、更轻松的管理和更新:使用 Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。
3、 Docker 与虚拟机的比较
作为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机的方式相比具有如下显著优势:
1、 Docker 容器启动很快,启动和停止可以实现秒级,相比传统的虚拟机方式(分钟级)要快速很多。
2、 Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器。
3、 Docker 通过类似 git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。
4、 Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较好 |
内存 | MB级 | GB级 |
硬盘适应 | MB级 | GB级 |
运行密度 | 单台主机支持上千个 | 单台主机支持几个 |
隔离性 | 安全隔离(进程级隔离) | 完全隔离 (系统级的隔离) |
迁移 | 优秀 | 一般 |
docker 是进程级别的隔离
二、 Docker 与虚拟化
Docker 以及其他容器技术,都属于操作系统虚拟化范畴,操作系统虚拟化最大的特点就是不需要额外的 supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker 容器时在 操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
三、 Docker 概念和使用
Docker 中有三个核心概念:镜像、容器和仓库。因此,准确把握这三大概念对于掌握 Docker 技术尤为重 要。
- 镜像(Image) Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完 整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container) 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository) 用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时, 可 以在仓库中下载下来。
1、 Docker安装
Docker 引擎是使用 Docker 容器的核心组件,可以在主流的操作系统和云平台上使用,包括 Linux 操作系统、 MacOSS 和 Windows 系统上。用户可以访问 Docker 官网(https://www.docker.com/get-started)去获取 Docker 安装包。
注意:windows中的docker与虚拟机是冲突的,所以Windows中的docker与虚拟机中的docker无法共存
在 CentOS 系统上安装 Docker Docker
目前支持 CentOS 7 及以后版本。系统的要求跟 Ubuntu 情况类似,64 位操作系统,内核至少是 3.10 以上。
更换系统 yum 源
# 查看系统内核版本
[root@alvin-test-os ~]# 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 源
[root@backup ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 刷新 yum 源缓存
yum makecache
** 首先,为了方便我们需要更新一下系统:**
[root@localhost ~]# yum update -y --exclud=kernel*
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
- base: mirrors.aliyun.com * extras: mirrors.aliyun.com
-
- updates: mirrors.aliyun.com
** 安装所需的基础软件**
- updates: mirrors.aliyun.com
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
** 安装 yum 源**
[root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
** 更新并安装 Docker-CE**
[root@localhost ~]# yum makecache fast
元数据缓存已建立
[root@localhost ~]# yum -y install docker-ce
#补充为centos加上阿里云镜像加速器
加速器路径:打开阿里云官网 产品 --> 容器与中间件 --> 容器与镜像服务ACR --> 管理控制台 --> 镜像加速器 --> CentOS
```bash
2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://7e0f2ki2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
**1.1.5、 启动并设置开机自启动**
```bash
[root@localhost ~]# systemctl enable --now docker
** 测试启动**
[root@localhost ~]# 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 最新的特性。
1.2.1、 查看版本信息
# 第一种方式 root@alvin-test-os:~# 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
# 第二种方式
root@alvin-test-os:~# 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
更新系统
root@alvin-test-os:~# 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 [497 kB] ... 此处略去许多行
安装基础软件
root@alvin-test-os:~# 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 证书**
root@alvin-test-os:~# curl -fsSL
https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
OK
写入软件源信息
root@alvin-test-os:~# 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
2、 使用 Docker 镜像
docker 镜像是 docker 中三大概念之一,其主要作用是作为启动容器的模板。
** 获取镜像**
镜像是运行容器的模板,官方 Docker Hub 仓库已经提供了许多镜像共开发者使用。如果我们需要获取某 个镜像则可以去 docker 仓库下载所需的镜像。
下载镜像的格式:docker pull [仓库的 URL]/[名称空间]/[仓库的名称]:[版本号]
下载镜像实例:
[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 命令下载中会获取并输出镜像的各层信息。当不 同的镜像包括相同的层的时候,本地仅存一份内容,减小存储空间。
登录镜像仓库
#格式
docker login 镜像仓库url
注: 默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接。
# 实例(登录自己的镜像仓库,默认为docker的镜像仓库)
[root@Centos7 ~]# docker login --username=small信仰 registry.cn-shanghai.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@Centos7 ~]# cat ~/.docker/config.json
{
"auths": {
"registry.cn-hangzhou.aliyuncs.com": {
"auth": "eWFuZ3lhbmcwOTEwMjI6Y2hlbjE4NzkwMDcwODMw"
}
}
}
# 参数
--username|-u : 指定用户名
--password|-p : 指定密码
** 查看镜像信息**
镜像主要包括镜像文件、镜像 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 : 列出所有(包括临时文件)镜像文件
alvin@AlvindeMacBook-Pro: docker images -a
REPOSITORY TAG IMAGE
ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/alvinos/teach
1000-teach-2020-10-22-19-03-16 d83921684085 3 weeks ago 1.05GB
test v1
2047b4806990 3 weeks ago 1.05GB 85b0590cd234 3 weeks ago 1.05GB 611b48e08ec2 3 weeks ago 1.05GB 9fbe4fba95d2 3 weeks ago 1.05GB 31b4192b2e41 3 weeks ago 1GB 2c8ba419a512 3 weeks ago 1GB
–digests=true|false:列出镜像的数字摘要值
REPOSITORY TAG DIGEST
IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/alvinos/teach 1000-teach-2020-10-28-13-40-27 sha256:1dd7db35cc9f3c2f0349806d05f93cbd18f1f583290c5bf2d513f942929bf068 22fdec3d9a6d 3 weeks ago 1.02GB
nginx 1.17 sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699 9beeba249f3e 6 months ago 127MB
-q : 仅显示 ID 信息
** 为镜像添加 tag**
为了方便后续工作中使用特定的镜像,还可以使用 docker tag 命令来为本地的镜像添加标签。
查看镜像详细信息
docker inspect 镜像名
[root@docker1 ~]# docker inspect nginx
# 镜像标签的构成
docker.io/library/redis:latest
docker.io : 镜像仓库的URL
library :镜像仓库命名空间
redis : 镜像名称
latest : 镜像版本号
上传镜像
# 格式
docker push [镜像标签]
# 注:要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag,打包的时候前面必须要带上自己的用户名称如:
docker tag 仓库url/命名空间/仓库名称:版本号
其中仓库url/命名空间/仓库名称:版本号缺一不可
[root@docker1 ~]# docker tag 106ff58d4308 yzl1600/k8s-kube-apiserver:v1.21.2
[root@docker1 ~]# docker tag f7734694baa4 registry.cn-shanghai.aliyuncs.com/yzl_test/php:v1
[root@docker1 ~]# docker push registry.cn-shanghai.aliyuncs.com/yzl_test/php:v1
The push refers to repository [registry.cn-shanghai.aliyuncs.com/yzl_test/php]
3480f9cdd491: Pushed
a24a292d0184: Pushed
f927192cc30c: Pushed
1450b8f0019c: Pushed
8e14cb7841fa: Pushed
cb42413394c4: Pushed
v2: digest: sha256:7ef832c720188ac7898dbd8d1e237b0738e94f94fc7e981cb7b8efe84555e892 size: 1572
使用 inspect 命令查看详细信息
使用 docker inspect 命令获取镜像的详细信息,包括 PID、作者、架构等等。
** 搜索镜像**
在docker中搜索镜像主要使用Search子命令,默认只搜索Docker Hub官方镜像仓库中的镜像。
其语法为docker search [option] 镜像名。支持的命令选项主要包括:
-f : 过滤输出内容
–limit: 限制输出结果
–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 rm 容器ID(删除容器)
docker rmi 镜像ID (删除镜像)
docker ps (查看镜像)
清理镜像
使用一段时间之后,docker 会产生很多临时文件,以及一些没有被使用的镜像,我们可以通过 docker image prune 命令来进行清理。
参数:
-a :删除所有无用的镜像,不光是临时镜像。
#查看原来的镜像
[root@alvin-test-os ~]# docker images
#删除所有的未被使用的镜像
[root@alvin-test-os ~]# docker image prune -a
-f :强制删除镜像,而不进行提示。
alvin@AlvindeMacBook-Pro: docker image prune -a -f
Deleted Images:
untagged: registry.cn-hangzhou.aliyuncs.com/alvinos/swoole:latest
untagged:
registry.cn-hangzhou.aliyuncs.com/alvinos/swoole@sha256:9f39e18ba29c4e5d064d3166 63d09ac125104d379cb2e7e4e6d3ee7ad4470584
deleted:sha256:d48372a060549a465a0eb23adfbbd59506bc809fc1bf37125c3ce180d07cd455 deleted: sha256:c251abf00a09541780fd972d284bf9c5213a68890b922d2ff2e7ff36009db67e
deleted: sha256:b340ab85cc561d2dd2776be0197b0847f4b3228cd73eeaaebac7d17e03ba8388 deleted: sha256:a78a173ce6a255e9e941a9668eee7ae88a64faa19eb79f76c19ff12623c59d1d deleted: sha256:26f2d6d97c083ecff570e3b4b945395b1062bcf65f9eaec0afb6e90ef9b7b671 deleted: sha256:a84b2d4c28c5eec8c3401015ab5fffb759304a1b7b6aca09d9eb77ebede634ac deleted: sha256:2e215f5f1db2ad5093c4f3879dc6b9c4f7de494b3654e09572ee51738a7f559f deleted: sha256:aad5610214ba2382858fd8d436dfd34b86e39978ca89aefff61b2781018ab019 deleted: sha256:da7b0b2c986dcf127345bafad35ae18a66fd1ba2e99f8302fc3e73822c2d9959 deleted: sha256:9c7c0fade080ec64e220d78e6579d5a7fd37f64fd322d8b529148b8ca9d25e8f deleted: sha256:9b57ee5d38e3c490237848c2a37720f7fe7eb8cf35b4143dda2f921fd331d640 deleted: sha256:89c094c94208c4a064195ff1daf5db1b00b2584318a0e5fb28c31268a8086787 deleted: sha256:63fcc276289672a37ac9bb918e1a9839a48674057aaec5693181764e6945a756 deleted: sha256:3168d43cb9db5a2f62f4fb6ddf208891eec6f1ee03ceb1a44aa6df39d9d1cc51 deleted: sha256:fe7e89f5270da83dfbfe2df62622262cb2555c9701daececda29906b03136f80 deleted: sha256:a2af60f6d03fe6b181e0c1c3d8b008d598acd8c1098a1f267887a2e9de7c3998 deleted: sha256:47860335fff22fac8885ba0e7a22c9287a2c076aed25d06319fefeee1704cc1f untagged: nginx:latest
** 使用 history 命令查看镜像构建历史**
注意:有些构建信息过长,可以使用–no-trunc 选项来输出完整信息。
保存镜像
构建镜像一般有三种情况:
保存正在运行的容器直接为镜像(commit)
保存正在运行的容器为镜像压缩包(import/export)
保存镜像为压缩包(save/load)
** 基于容器保存**
主要格式:docker commit [容器ID] .
主要参数
| -a | 作者信息 |
| -c |将dockerfile指令应用于创建的镜像 |
| -m | 提交信息 |
| -p | 提交时,暂停容器运行 |
启动一个容器、修改并保存
# 实例
[root@Centos7 ~]# docker commit -a "Alvin" -m "这是一个docker镜像" -p be3b92e2886b test:v1
sha256:4a06cd2af42877b5e2908073061f7ae1bf9e308a470bdfc0c6f906ef368aaed8
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 4a06cd2af428 5 seconds ago 104MB
** 基于本地模板导入(import/export)**
** 保存镜像**
有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一 个文件,再拷贝到另一台电脑上导入使用。
对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。
使用 export 和 import
export 和 import 的针对点是容器,将本机的容器导出为镜像包。
基本格式:
docker export [容器ID] > [压缩包]
docker import [包名称] [自定义镜像名称]
** 使用 export 保存容器为镜像**
[root@instance-gvpb80ao docs]# docker export daf9c3656be3 > nginx.tar
[root@instance-gvpb80ao docs]# 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 v1
02107323de1b 22 seconds ago 131MB
** 使用 save 和 load**
save 和 load 的针对的点是镜像,将本机的镜像导入、导出为镜像包。
保存镜像的格式:
docker save [镜像ID] > [包名称]
** 使用 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的差别
export 导出的镜像文件体积小于 save 保存的镜像,因为save保存更完全,export保存会丢掉一些不必要的数据
** docker export 可以为镜像指定新名称,docker save 不能对载入的镜像重命名。
docker import为保存镜像的默认命令,docker load保存了镜像的所有命令。
docker export是仅仅保存镜像,docker save是完整的保存镜像
一般情况下,docker save用作项目迁移,docker export作为基础镜像**
** 是否包含镜像历史**
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 载入。