一、 为什么要使用 Docker
1.1Docker 容器虚拟化的好处
在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;
同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序
的方式,快速分发部署,而这正是 Docker 所能够提供的最大优势。Docker 提供了一种更为聪明的方式,通过
容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,
无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风
险。
1.2 Docker 在开发和运维中的优势
对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让
应用正常运行,而 Docker 恰恰可以实现这一中级目标。具体来说,在开发和运维过程中,Docker 具有以下几
个方面的优势:
- 更快的交付和部署:使用 Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完之
后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保
在生产环境无缝运行。Docker 可以快速创建和删除容器,实现快速迭代,节约开发、测试及部署的时
间。 - 更高效的利用资源:运行 Docker 容器不需要额外的虚拟化管理程序的支持,Docker 是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,与传统的虚拟机方式相比,Docker 的性能要提高 1 ~ 2 个数量级。
- 更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私
有云、个人电脑等等,同时支持主流的操作系统发行版本。这种兼容性能让用户可以在不同的平台之间
轻松的迁移应用。 - 更轻松的管理和更新 :使用 Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所
有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。
二、Docker 与虚拟化
Docker 以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的
supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker 容器时在
操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
三、Docker 安装
阿里云的加速器
3.1 在 CentOS 系统上安装 Docker
Docker 目前支持 CentOS 7 及以后版本。系统的要求跟 Ubuntu 情况类似,64 位操作系统,内核至少是 3.10
以上。
3.1.1 更换系统 yum 源(如果提前已经优化完毕,此步骤不需要操作)
查看系统内核版本
[root@docker ~]# uname -r
3.10.0-1160.21.1.el7.x86_64
[root@docker ~]# uname -a
备份原来 YUN 源
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 更换 YUM 源
curl -o /etc/yum.repos.d/CentOS-Base.repo
https://mirrors.aliyun.com/repo/Centos-7.repo
# 刷新 yum 源缓存
yum makecache
3.1.2 首先,为了方便我们需要更新一下系统:
yum update -y --exclud=kernel*
3.1.3 如果之前安装过docker,需要自行卸载
sudo yum remove docker docker-common docker-selinux docker-engine -y
3.1.4 初始化环境并安装所需的基础软件
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3.1.5 安装yum源
wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
清除元数据
yum clean all
开启缓存
yum makecache
3.1.6 安装docker
yum install docker-ce -y
3.1.7 优化
打开阿里云官网 产品 --> 容器与中间件 --> 容器与镜像服务ACR --> 管理控制台 --> 镜像加速器 --> CentOS
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vf52ltmx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3.1.8 设置开机自启动
systemctl enable --now docker
3.1.9 检查docker的状态
# 第一种方式
安装nginx
docker run -d -P nginx 装nginx
查看端口号
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATU
5f3abc94d804 nginx "/docker-entrypoint.…" About a minute ago Up Abohen
web页面访问
http://10.0.0.30:49153/
# 第二种方式
docker info
只要docker info 能出来东西,即可说明已经安装
3.2 在 Ubuntu 环境上安装 Docker
Ubuntu 操作系统对 Docker 的支持十分成熟,可以支持包括 x86_64、armhf 等系统架构,只要是 64 位即
可。
Docker目前支持最低Ubuntu版本为14.04LTS,但实际上从稳定性上考虑,推荐使用16.04LTS 或18.04LTS
版本,并且系统内核越新越好,以支持 Docker 最新的特性
3.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
3.2.2 更新系统
root@alvin-test-os:~# apt-get update
3.2.3 安装基础软件
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:
。。。此处略去很多行
1.2.4、 、 安装 GPG 证书
root@alvin-test-os:~# curl
3.2.4安装 GPG 证书
root@alvin-test-os:~# curl -fsSL
https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
OK
3.2.5 写入软件源信息
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
4.2.6 更新并安装 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.
4.2.7 启动并检验
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
四、Docker 概念和使用
Docker 中有三个核心概念:镜像、容器和仓库。因此,准确把握这三大概念对于掌握 Docker 技术尤为重
要。
1.镜像(Image)
Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。简而言之:镜像就是启动一个容器的模板。
2. 容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。简而言之:容器就是对外提供服务的进程。或者容器就是镜像启动起来的一个实例。
3. 仓库(Repository)
用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可以在仓库中下载下来。简而言之:仓库是用来存放镜像的地方。
补充:
docker镜像原理:
1.UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
> 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
2.docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
3.分层的镜像
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载
4.为什么 Docker 镜像要采用这种分层结构呢
最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
特点
Docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
五、docker 镜像相关命令
常用镜像仓库:
官方仓库:hub.docker.com https://hub.docker.com/search?q=&type=image
自己的私有仓库:Harbor
阿里云私有仓库:registry.cn-hangzhou.aliyuncs.com
搜索镜像:
#格式
docker search [镜像名称]
# 实例
[root@docker ~]# docker search nginx
[root@docker ~]# docker search nginx --filter=STARS=200 #搜索出来的镜像就是STARS大于200的
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15161 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2047 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 816 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 213
拉取镜像:
#格式:
docker pull [镜像名称]
#实例:
[root@docker ~]# docker pull redis
Using default tag: latest #如果不写tag.默认就是latest
latest: Pulling from library/redis
#镜像层
a076a628af6f: Already exists
f40dd07fe7be: Pull complete
ce21c8a3dbee: Pull complete
ee99c35818f8: Pull complete
56b9a72e68ff: Pull complete
3f703e7f380f: Pull complete
#镜像ID号(镜像ID号是全球唯一)
Digest: sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494 #签名
#镜像下载状态
Status: Downloaded newer image for redis:latest
#镜像的全称(镜像的tag)
docker.io/library/redis:latest
注意:
docker 拉取镜像报错:x509: certificate has expired or is not yet valid
解决办法
当docker pull镜像时出现 x509 问题,一般应该是证书问题或者系统时间问题
1.先 date 看一下时间对不对,如果时间跟实际时间对不上一般就是系统时间问题.
ntpdate time1.aliyun.com
即可
2.如果是证书的问题需要编辑 daemo.json 文件:vi /etc/docker/daemon.json
文件内添加:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
3.然后重启下 docker 服务:docker restart
查看当前系统上有哪些镜像:
#格式
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 7 days ago 133MB
redis latest 08502081bff6 2 weeks ago 105MB
mysql latest 5c62e459e087 3 weeks ago 556MB
#参数
-q : 只显示镜像ID
[root@docker ~]# docker images -q
4cdc5dd7eaad
08502081bff6
5c62e459e087
-a : 列出所有(包括临时文件)镜像文件
获取镜像的详细信息:
#格式
docker inspect [镜像名称或镜像ID]
[root@docker ~]# docker inspect redis
#参数
-f : 格式化输出
[root@docker ~]# docker inspect -f '{{.Id}}' 621ceef7494a
sha256:621ceef7494adfcbe0e523593639f6625795cc0dc91a750629367a8c7b3ccebb
[root@docker ~]# docker inspect -f '{{.ContainerConfig.Hostname}}' redis
16535cfaf84a
#‘.’相当于linux里的根===路径
登录镜像仓库:
#格式
docker login #默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接。
sudo docker login --username=yh01j**** registry.cn-hangzhou.aliyuncs.com
#实例
[root@docker ~]# docker login registry.cn-hangzhou.aliyuncs.com
Username: yh01jiang
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@docker ~]# cat ~/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "eWgwMWppYW5nOnl1YW5oYW8xOTk3MTIxMQ=="
},
"registry.cn-hangzhou.aliyuncs.com": {
"auth": "eWgwMWppYW5nOnl1YW5oYW8xOTk3MTIxMQ=="
}
}
}
# 参数
--username|-u : 指定用户名
--password|-p : 指定密码
为镜像添加标签(tag):
#镜像标签的构成
[root@docker ~]# docker pull redis=======》
docker.io/library/redis:latest
docker.io : 镜像仓库的URL
library :镜像仓库命名空间
redis : 镜像名称
latest : 镜像版本号
#打标签
#格式
docker tag [镜像ID] 镜像标签
#实例
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/alvinos/redis v1 4cdc5dd7eaad 7 days ago 133MB
registry.cn-hangzhou.aliyuncs.com/alvinos/redis v2 4cdc5dd7eaad 7 days ago 133MB
nginx latest 4cdc5dd7eaad 7 days ago 133MB
redis latest 08502081bff6 2 weeks ago 105MB
mysql latest 5c62e459e087 3 weeks ago 556MB
[root@Centos7 ~]# docker tag 08502081bff6 registry.cn-hangzhou.aliyuncs.com/alvi/redis:v5
[root@Centos7 ~]# docker images #改后查看(名字不同但是ID相同)
[root@docker ~]# docker images
registry.cn-hangzhou.aliyuncs.com/alvi/redis v5 08502081bff6 2 weeks ago 105MB
redis latest 08502081bff6 2 weeks ago 105MB
mysql latest 5c62e459e087 3 weeks ago 556MB
镜像上传:
注意:首先必须在阿里云建立镜像仓库(私有、本地)
#格式
docker push [镜像标签]
注:要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag
[root@docker ~]# docker login --username=yh01jiang registry.cn-hangzhou.aliyuncs.com
Password:
[root@Centos7 ~]# docker tag 08502081bff6 registry.cn-hangzhou.aliyuncs.com/alvi/redis:v5
#实例
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/alvi/redis:v5
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvi/redis]
9e1fddfb3a22: Pushed
a71d36a87572: Pushed
0b7b774038f0: Pushed
ebef6caacb96: Pushed
245c9d23f653: Pushed
764055ebc9a7: Pushed
v5: digest: sha256:87204a944dc825e2e17019dc438886d4d2b5de2862686c5d69cbc015fd0488d7 size: 1574
镜像的删除
#格式
docker rmi [镜像名称或者镜像ID]
#实例
[root@Centos7 ~]# docker rmi nginx
[root@Centos7 ~]# docker rmi nginx mysql redis #删除多个镜像
[root@Centos7 ~]# docker rmi -f $(docker images -aq) #删除全部的镜像
#参数
-f : 强制删除
[root@Centos7 ~]# docker rmi -f nginx
Untagged: nginx:latest
Untagged: nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
注:当有容器正在使用镜像时,强制删除镜像,只能删除镜像的所有tag, 不会删除镜像。
因此:
[root@docker ~]# docker rm -f 4cdc5dd7eaad
[root@docker ~]# docker images
[root@docker ~]# docker rmi -f 4cdc5dd7eaad
Untagged: registry.cn-hangzhou.aliyuncs.com/alvinos/redis:v2
Deleted: sha256:4cdc5dd7eaadff5080649e8d0014f2f8d36d4ddf2eff2fdf577dd13da85c5d2f
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
就可以删除所有镜像了
清空镜像
#格式
docker image prune
#实例
[root@Centos7 ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
#参数
-a : 删除所有镜像
[root@Centos7 ~]# docker image prune -a
-f :强制删除镜像,而不进行提示
[root@Centos7 ~]# docker image prune -a -f
使用 history 命令查看镜像历史(镜像的构建历史)
[root@docker ~]# docker history 08502081bff6
IMAGE CREATED CREATED BY SIZE COMMENT
08502081bff6 2 weeks ago /bin/sh -c #(nop) CMD ["redis-server"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 6379 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:df205a0ef6e6df89… 374B
<missing> 2 weeks ago /bin/sh -c #(nop) WORKDIR /data 0B
<missing> 2 weeks ago /bin/sh -c #(nop) VOLUME [/data] 0B
<missing> 2 weeks ago /bin/sh -c mkdir /data && chown redis:redis … 0B
<missing> 2 weeks ago /bin/sh -c set -eux; savedAptMark="$(apt-m… 31.7MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV REDIS_DOWNLOAD_SHA=ba… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV REDIS_DOWNLOAD_URL=ht… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV REDIS_VERSION=6.2.4 0B
<missing> 2 weeks ago /bin/sh -c set -eux; savedAptMark="$(apt-ma… 4.15MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0B
<missing> 2 weeks ago /bin/sh -c groupadd -r -g 999 redis && usera… 329kB
<missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:4903a19c327468b0e… 69.3MB
注意:有些构建信息过长,可以使用--no-trunc 选项来输出完整信息
搜索镜像
-f : 过滤输出内容:
# 搜索官方提供的带有 Redis 关键字的镜像
[root@docker ~]# docker search -f is-official=true redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 9675 [OK]
#搜索被收藏超过 8000 个的并且关键词包括 Redis 的镜像
[root@docker ~]# docker search -f stars=8000 redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 9675 [OK]
–limit: 限制输出结果:
[root@docker ~]# docker search -f stars=8 --limit 3 redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 9675 [OK]
rediscommander/redis-commander Alpine image for redis-commander - Redis man… 61 [OK]
redislabs/redisearch Redis With the RedisSearch module pre-loaded… 36
–no-trunc: 不截断输出结果:
[root@docker ~]# 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. 9675 [OK]
rediscommander/redis-commander Alpine image for redis-commander - Redis management tool. 61 [OK]
redislabs/redisearch Redis With the RedisSearch module pre-loaded. See http://redisearch.io 36
[root@docker ~]#
保存镜像(commit)
-a 作者信息
-m 提交信息
-p 提交时,暂停容器运行
#格式 (保存正在运行的容器直接为镜像)
docker commit [容器ID|容器名称]
[root@docker ~]# docker commit -h
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
#示例
[root@docker ~]# docker run -d -P nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
b496a7b708c453171d3f75b9a800dd9c644af25b8324b67f26af541ae268f883
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b496a7b708c4 nginx "/docker-entrypoint.…" 8 seconds ago Up 6 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp flamboyant_mendeleev
[root@docker ~]# docker commit -a "oldjiang" -m "这是一个docker镜像" -p b496a7b708c4 test:v1
sha256:82bc8c05499617f57cd1928ddd6984f75735b50621aed97c1b529a1bda5765c7
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 82bc8c054996 33 seconds ago 133MB
nginx latest 4cdc5dd7eaad 7 days ago 133MB
redis latest 08502081bff6 2 weeks ago 105MB
alpine latest d4ff818577bc 4 weeks ago 5.6MB
busybox latest 69593048aa3a 5 weeks ago 1.24MB
保存镜像(import/export)===重点
#保存正在运行的容器为镜像压缩包
#格式
docker export [容器的ID] > [包名称]
# 实例
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b496a7b708c4 nginx "/docker-entrypoint.…" 14 minutes ago Up 14 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp flamboyant_mendeleev
[root@docker ~]# docker export b496a7b708c4 > nginx.tar
[root@docker ~]# ll
总用量 132496
-rw-------. 1 root root 1701 3月 29 15:52 anaconda-ks.cfg
-rw-r--r-- 1 root root 135661568 7月 14 19:51 nginx.tar
##导入镜像包
#格式
docker import [包名称] [自定义镜像名称]
# 实例
[root@docker ~]# docker import nginx.tar test:v7
sha256:c054f84d88823a8e03fce210d0f15afe152a60cd47db7c6fee4876546d13518b
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SI# 保存镜像为压缩包
# 保存镜像的格式:
docker save [镜像名称|镜像ID] > [包名称]ZE
test v7 c054f84d8882 6 seconds ago 132MB
补充:容器id
保存镜像(save/load)===重点
# 保存镜像为压缩包
# 保存镜像的格式:
docker save [镜像名称|镜像ID] > [包名称]
#示例
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 7 days ago 133MB
redis latest 08502081bff6 2 weeks ago 105MB
alpine latest d4ff818577bc 4 weeks ago 5.6MB
busybox latest 69593048aa3a 5 weeks ago 1.24MB
[root@docker ~]# docker save 08502081bff6 > redis.tar
[root@docker ~]# ll
-rw-r--r-- 1 root root 108812800 7月 14 20:03 redis.tar
[root@docker ~]# docker save -o redis-two.tar 08502081bff6
[root@docker ~]# ll
-rw-r--r-- 1 root root 108812800 7月 14 20:03 redis.tar
-rw------- 1 root root 108812800 7月 14 20:03 redis-two.tar
# 导入镜像的格式:
docker load < [包名称]
[root@docker ~]# docker rmi redis:latest
Untagged: redis:latest
Untagged: redis@sha256:b6a9fc3535388a6fc04f3bdb83fb4d9d0b4ffd85e7609a6ff2f0f731427823e3
Deleted: sha256:08502081bff61084d64fc76f0f90ea39b89935cd071d9e12c5374ae191ff53c0
Deleted: sha256:ae5155f07c6cd11da80503d9eeee8f6da1733ce844ae793d0a836f87331ccfe8
Deleted: sha256:6be98c1f12093b274ce5a8a08aade2e317646a3d796f06bfbb1ceb64a3667d79
Deleted: sha256:d39ca9a7caf57ae0172f935bedc3f00eb11793e49736b36894bbdad81c48da76
Deleted: sha256:72b2f38a39460857c7f833d9fb5ae1ad23f1454c90bf85040545daab59245690
Deleted: sha256:fc6698595ab9165eb0f1e07b0930f45e925ab604b8549f225c93a6f83631ae40
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v7 c054f84d8882 15 minutes ago 132MB
test v1 82bc8c054996 33 minutes ago 133MB
nginx latest 4cdc5dd7eaad 7 days ago 133MB
alpine latest d4ff818577bc 4 weeks ago 5.6MB
busybox latest 69593048aa3a 5 weeks ago 1.24MB
[root@docker ~]# docker load < redis
redis.tar redis-two.tar
[root@docker ~]# docker load < redis.tar
245c9d23f653: Loading layer [==================================================>] 338.4kB/338.4kB
ebef6caacb96: Loading layer [==================================================>] 4.194MB/4.194MB
0b7b774038f0: Loading layer [==================================================>] 31.71MB/31.71MB
a71d36a87572: Loading layer [==================================================>] 2.048kB/2.048kB
9e1fddfb3a22: Loading layer [==================================================>] 3.584kB/3.584kB
Loaded image ID: sha256:08502081bff61084d64fc76f0f90ea39b89935cd071d9e12c5374ae191ff53c0
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v7 c054f84d8882 15 minutes ago 132MB
test v1 82bc8c054996 33 minutes ago 133MB
nginx latest 4cdc5dd7eaad 7 days ago 133MB
<none> <none> 08502081bff6 2 weeks ago 105MB
alpine latest d4ff818577bc 4 weeks ago 5.6MB
busybox latest 69593048aa3a 5 weeks ago 1.24MB
# 注:save/load保存镜像无法自定义镜像名称,save保存镜像时如果使用ID保存则load导入镜像无名称,使用名称导入时才有名称。
[root@docker ~]# docker image prune -a
.....
sha256:82bc8c05499617f57cd1928ddd6984f75735b50621aed97c1b529a1bda5765c7
deleted: sha256:09fd3f53143ca6bd4655480b010662f5a2da19f868e22faeb44ffd62b17c16ea
untagged: test:v7
deleted: sha256:c054f84d88823a8e03fce210d0f15afe152a60cd47db7c6fee4876546d13518b
deleted: sha256:0fae7b29db039023c402412d8950dafb7c2b6143770906417ba50f5c6f956682
untagged: busybox:latest
untagged: busybox@sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
deleted: sha256:69593048aa3acfee0f75f20b77acb549de2472063053f6730c4091b53f2dfb02
deleted: sha256:5b8c72934dfc08c7d2bd707e93197550f06c0751023dabb3a045b723c5e7b373
......
Total reclaimed space: 132.7MB
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 7 days ago 133MB
[root@docker ~]# docker load < busybox.tar
5b8c72934dfc: Loading layer [==================================================>] 1.455MB/1.455MB
Loaded image: busybox:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 7 days ago 133MB
busybox latest 69593048aa3a 5 weeks ago 1.24MB
验证成功
保存镜像三种方式的区别
1、export保存的镜像体积要小于save(save保存更完全,export保存会丢掉一些不必要的数据)
2、export可以重命名镜像名称而save则不行
3、save可以同时保存多个镜像而export则不行
4.是否包含镜像历史
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅
保存容器当时的快照状态),所以无法进行回滚操作。
save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer
总结:
删除镜像
docker rmi [镜像名称或者镜像ID]
清空镜像
docker image prune -a
删除容器
docker rm [容器id]
查看容器ID
docker ps
、
注意:
一般情况下,export自己使用
交给别人save
显示docker的版本信息
[root@docker ~]# docker version
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:58:10 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:56:35 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0
显示docker的系统信息(包括镜像和容器的数量)
[root@docker ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 2
Running: 1
Paused: 0
Stopped: 1
Images: 2
Server Version: 20.10.7
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
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: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.21.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 972.3MiB
Name: docker
ID: YHNI:4LVA:PYOC:XYKT:6GM5:7BEY:TMZU:KWT3:SWTC:HYYX:ED5T:K4M2
Docker Root Dir: /var/lib/docker
Debug Mode: false
Username: yh01jiang
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://vf52ltmx.mirror.aliyuncs.com/
Live Restore Enabled: false
WARNING: IPv4 forwarding is disabled
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
万能帮助命令
[root@docker ~]# docker --help
Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with
"docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit