一、 为什么要使用 Docker

1.1Docker 容器虚拟化的好处

在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;
同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序
的方式,快速分发部署,而这正是 Docker 所能够提供的最大优势。Docker 提供了一种更为聪明的方式,通过
容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,
无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风
险。

1.2 Docker 在开发和运维中的优势

对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让
应用正常运行,而 Docker 恰恰可以实现这一中级目标。具体来说,在开发和运维过程中,Docker 具有以下几
个方面的优势:

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

二、Docker 与虚拟化

Docker 以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的

supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。

Git docker Runner 运行 docker git服务_Docker


传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker 容器时在

操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

三、Docker 安装

docker官网华为云镜像站 华为云社区版docker

Git docker Runner 运行 docker git服务_Docker_02


阿里云的加速器


Git docker Runner 运行 docker git服务_docker_03

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)

用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可以在仓库中下载下来。简而言之:仓库是用来存放镜像的地方。

Git docker Runner 运行 docker git服务_Docker_04

补充:

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等等。

Git docker Runner 运行 docker git服务_docker_05

3.分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

4.为什么 Docker 镜像要采用这种分层结构呢

Git docker Runner 运行 docker git服务_docker_06


最大的一个好处就是 - 共享资源

比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

特点

Docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

五、docker 镜像相关命令

常用镜像仓库:
官方仓库:hub.docker.com https://hub.docker.com/search?q=&type=image
自己的私有仓库:Harbor
阿里云私有仓库:registry.cn-hangzhou.aliyuncs.com

官方镜像仓库

Git docker Runner 运行 docker git服务_docker_07

搜索镜像:
#格式
	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

Git docker Runner 运行 docker git服务_Docker_08

拉取镜像:
#格式:
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

Git docker Runner 运行 docker git服务_Docker_09

解决办法

当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"]
}

Git docker Runner 运行 docker git服务_文件系统_10

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 : 列出所有(包括临时文件)镜像文件

Git docker Runner 运行 docker git服务_Docker_11

获取镜像的详细信息:
#格式
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
镜像上传:

注意:首先必须在阿里云建立镜像仓库(私有、本地)

Git docker Runner 运行 docker git服务_Docker_12

#格式
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

Git docker Runner 运行 docker git服务_Docker_13

镜像的删除
#格式
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

Git docker Runner 运行 docker git服务_文件系统_14

保存镜像(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