linux12 - docker容器01 --> 介绍、安装、镜像的使用
一、docker介绍
# docker 历史
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目,一开始是做一些pass的云计算服务,它LXC有关的容器技术,基于 Google公司推出的 Go 语言实现。
# 他们将自己的技术(容器化技术)命名就是Docker!
项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。
Docker 的基础是 Linux 容LXC)等技术,实现了开源! #开源就是开放源代码
2014年4月9日,Docker1.0发布! #开源s
在 LXC 的基础上 Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低.
# Docker
容器,将应用程序打包到一个环境中,隔离运行,解决异构环境下应用部署问题。
生命周期:
docker生命周期很短暂,就是一个容器起来到结束,就是其生命周期。
docker的思想来之集装箱!
# 隔离: Docker核心思想!
打包装箱,每个箱子是互相隔离的,Docker是通过隔离机制,可以将服务器利用到极致
# docker文档 # https://docs.docker.com/get-docker/
# docker官网 # https://www.docker.com/
# docker仓库 # https://hub.docker.com/
0.为什么使用容器
# 1、上线流程繁琐
开发 -> 测试-> 申请资源-> 部署 -> 测试等环节
# 2、资源利用率低
# 3、扩容、缩容不及时
# 4、服务器缓解臃肿
# 4、环境不一致性
1.Docker 容器虚拟化的好处
在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发部署,而这正是 Docker 所能够提供的最大优势。
Docker 提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。
# 容器与虚拟机之间区别?
- 进程级别的隔离 :
- 操作系统级别的隔离:
# 优势:
- 容器启动时秒级,操作系统时分钟级,docker是轻量级的
虚拟机:在windows装一个VMware,通过这个软件开源虚拟处理一台(多台),笨重
虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术
VM: linux centos原生镜像(一台电脑)。隔离,需要开启多个虚拟机 几个G 几分钟
docker: 隔离 镜像(宿主机的内核 4m +mysql + nginx) 十分的小巧,几个M kb 秒级启动
2.Docker 在开发和运维中的优势
对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让
应用正常运行,而 Docker 恰恰可以实现这一中级目标。具体来说,在开发和运维过程中,Docker 具有以下几个方面的优势:
# 1、更快的交付和部署:
使用 Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker 可以快速创建和删除容器,实现快速迭代,节约开发、测试及部署的时间。
# 2、更高效的利用资源:
运行 Docker 容器不需要额外的虚拟化管理程序的支持,Docker 是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,与传统的虚拟机方式相比,Docker 的性能要提高 1 ~ 2 个数量级
# 3、更轻松的迁移和扩展:
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑等等,同时支持主流的操作系统发行版本。这种兼容性能让用户可以在不同的平台之间轻松的迁移应用。
# 4、更轻松的管理和更新:
使用 Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。
虚拟机技术缺点
资源占用十分多
冗余步骤多
启动很慢
# 容器化技术不是模拟的一个完整的操作系统
3.Docker 与虚拟机的比较
作为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机的方式相比具有如下显著优势:
# Docker 容器启动很快,启动和停止可以实现秒级,相比传统的虚拟机方式(分钟级)要快速很多。
# Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器。
# Docker 通过类似 git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。
# Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。
docker是利用宿主机的内核,vm需要centos ,docker不需要虚拟机一样重新加载一个操作系统,启动是秒级的
# docker和虚拟机技术的不同:
1、传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
2、容器内的应用之间运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
3、每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度快 | 秒级 | 分钟级 |
性能 | 接近原生 | 较好 |
内存 | MB级 | GB级 |
硬盘适应 | MB级 | GB级 |
运行密度 | 单台主机支持上千个 | 单台主机支持几个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移 | 优秀 | 一般 |
4、 DevOPs (开发、运维)
DevOPs #dan v one ps
# 1、应用 更快速的交付和部署
传统: 一堆帮助文档,安装程序
DOcker: 打包镜像发布测试,一键运行
# 2、更便捷的升级和扩缩容
使用Docker之后,我们部署应用和搭积木一样
项目打包一个镜像,扩展 服务器A 服务器B
# 3、更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的
# 4、更高效的计算资源利用
Docker 内核级别的虚拟化,可以在一个物理机上运行多个服务
# 5、CICD
#持续集成,持续部署
# 查看系统版本
[root@docter ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
[root@docter ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core
二、Docker 概念和使用
Docker 中有三个核心概念
# 1、镜像
镜像就是启动一个容器的模板,可以通过这个模块来创建容器(就是一个独立的软件包)
# 2、容器
容器就是对外提供服务的进程,或者容器就是镜像启动起来的一个实例(启动一下nginx,那么nginx就是容器) 就是一个简易的linux系统
# 3、仓库
仓库是用来存放镜像的地方 (公有仓库、私有仓库)
Docker hub 国外仓库
阿里云、华为云 国内仓库
# 阿里云 --- 配置镜像加速(容器服务器)
因此,准确把握这三大概念对于掌握 Docker 技术尤为重要
#1.镜像(Image)
Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统
#2.容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
#3.仓库(Repository)
用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可以在仓库中下载下来。
0.window安装docker
windows: 其实docker是无法安装到Windows,之所以能安装,是因为Windows版的dockers内核集成虚拟机
# https://www.docker.com/products/docker-desktop
根据docker安装的位置鼠标点点点
1.docker 安装
# docker.com官网安装
https://docs.docker.com/engine/install/centos/
# 1、卸载旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、安装需要的安装包
[root@docter yum.repos.d]# sudo yum install -y yum-utils
# 3、设置镜像的仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认是国外的
https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo #华为
# 4、清空缓存
[root@docter yum.repos.d]# yum clean all && yum makecache
# 5、安装docker
[root@docter yum.repos.d]# yum install docker-ce docker-ce-cli containerd.io
# 6、阿里云加速器
打开阿里云官网 产品 --> 容器与中间件 --> 容器与镜像服务ACR --> 管理控制台 --> 镜像加速器 --> CentOS
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://k7eoap03.mirror.aliyuncs.com"]
}
EOF
# 6、启动
[root@docter yum.repos.d]# systemctl daemon-reload
[root@docter yum.repos.d]# systemctl enable --now docker.service
国内安装docker 01 – 阿里云
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
sudo yum -y install docker-ce-[VERSION]
国内安装docker02 – 华为云
# 进入华为镜像站 docker源下载
#1.如果之前安装过docker,需要自行卸载 #华为镜像源
[root@docter yum.repos.d]# sudo yum remove docker docker-common docker-selinux docker-engine -y
#2.初始化系统环境
[root@docter yum.repos.d]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#3.安装yum源
[root@docter yum.repos.d]# wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
#4.docter 源管理
sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#5.清空缓存
[root@docter yum.repos.d]# yum clean all && yum makecache
#6.安装docker
[root@docter yum.repos.d]# yum install docker-ce -y #ce社区版 #ee企业版
#7.docker优化
打开阿里云官网 产品 --> 容器与中间件 --> 容器与镜像服务ACR --> 管理控制台 --> 镜像加速器 --> CentOS
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://k7eoap03.mirror.aliyuncs.com"]
}
EOF
#8.启动并设置开机自启
[root@docter yum.repos.d]# systemctl daemon-reload
[root@docter yum.repos.d]# systemctl enable --now docker.service
#9.检查docker
1)第一种方式
[root@docter ~]# docker version #版本信息
1)第二种方式
[root@docter yum.repos.d]# docker info #推荐第一种方式 显示docker的系统信息
2)第三种方式
[root@docter yum.repos.d]# docker run -d -P nginx
[root@docter yum.repos.d]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2cf9d0e88a05 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:49153->80/tcp, :::49153->80/tcp stoic_shirley
# 访问 192.168.15.30:49153
扩展:docker卸载
#1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2.删除目录
rm -rf /var/lib/docker #docker默认的工作路径
#3.镜像加速器(docker优化)
- 登录阿里云找到容器镜像服务
- 找到镜像加速地址
- 配置使用
三、docker镜像相关命令
Docker run运行原理图
Docker镜像加载原理
底层原理
# 1.docker是怎么工作的?
docker是一个CS结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问!
docker-server接收到docker-client的指令,就会执行这个命令!
1、常用镜像仓库
# 1.官方仓库:hub.docker.com
# 2.自己的私有仓库:Harbor
# 3.阿里云私有仓库:registry.cn-hangzhou.aliyuncs.com
2、搜索镜像
#格式:
docker search [镜像名称]
#实例:
[root@docker ~]# docker search mysql
#参数
[root@docter ~]# docker search --filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的
"docker search" requires exactly 1 argument.
See 'docker search --help'.
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
[root@docter ~]# docker search --filter=STARS=3000 nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15051 [OK]
-f:筛选
[root@docter ~]# docker search -f stars=2000 nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15034 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2038 [OK]
[root@docter ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
# 镜像名称 # 描述信息 #收藏个数 #是否官方镜像 #自构建镜像
mysql Redis is an open source key-value store that… 9586 [OK]
bitnami/redis Bitnami Redis Docker Image 185 [OK]
# 自构建镜像 是依赖于其他镜像构建的
参数 --no-trunc 显示所有的简介
[root@docter ~]# docker search nginx --no-trunc
3、拉取镜像(下载镜像)
#格式:
docker pull [镜像名称]
# 获取镜像
格式:docker pull [仓库URL]/[仓库命名空间]/[仓库名称]:[版本号]
docker pull redis
默认的仓库URL:index.docker.io
默认的命名空间:library
index.docker.io/library/redis
#实例:
[root@docker ~]# docker pull redis
Using default tag: latest #如果不写tag.默认就是latest(版本号)
latest: Pulling from library/redis
#镜像层 #分层下载:docker image的核心 联合文件系统 UnionFS 联合文件系统
69692152171a: Already exists
a4a46f2fd7e0: Pull complete
bcdf6fddc3bd: Pull complete
2902e41faefa: Pull complete
df3e1d63cdb1: Pull complete
fa57f005a60d: Pull complete
#镜像ID号(镜像ID号是全球唯一)
Digest: sha256:7e2c6181ad5c425443b56c7c73a9cd6df24a122345847d1ea9bb86a5afc76325 #签名
#镜像下载状态
Status: Downloaded newer image for redis:latest
#镜像的全称(镜像的tag)
docker.io/library/redis:latest
#指定版本下载
docker pull mysql:5.7
联合文件系统(UFS)
# UnionFS
# 联合文件系统(docker安装l两个相同的nginx 就不需要2个nginx文件系统,只需要一个就ok)
# Docker镜像加载原理
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了,由此课件对于不同的linux发行版,bootfs是一致的,rootfs会有差异,因此不同的发行版可以用公用的bootfs。
虚拟机是分钟级别,容器是秒级。
# 谁白了,原来的os可能是全量 现在docker镜像就是把全量中多余的都删除,只留下最精的,最需要的
# bootfs是启动引导的加载
# rootfs 不同的版本
# 分层原理
Docker镜像是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部
这一层就是我们通常所说的容器层,容器之下都叫镜像层 #所有操作都是在容器层
[root@docker ~]# docker pull redis
Using default tag: latest #如果不写tag.默认就是latest(版本号)
latest: Pulling from library/redis
#镜像层 #分层下载:docker image的核心 联合文件系统 UnionFS 联合文件系统
69692152171a: Already exists
a4a46f2fd7e0: Pull complete
bcdf6fddc3bd: Pull complete
2902e41faefa: Pull complete
df3e1d63cdb1: Pull complete
fa57f005a60d: Pull complete
#镜像ID号(镜像ID号是全球唯一)
Digest: sha256:7e2c6181ad5c425443b56c7c73a9cd6df24a122345847d1ea9bb86a5afc76325 #签名
#镜像下载状态
Status: Downloaded newer image for redis:latest
#镜像的全称(镜像的tag)
docker.io/library/redis:latest
4、查看当前系统上有哪些镜像
#格式
docker images 或者 docker image ls docker images -a
# 方式一
[root@docter ~]# docker image ls
# 方式二
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 镜像名称 #镜像版本号 #镜像ID(缩写) #镜像生成时间距离现在时长 #镜像大小
redis latest fad0ee7e917a 2 weeks ago 105MB
nginx latest d1a364dc548d 3 weeks ago 133MB
#参数
-a, --all: 显示全部镜像
-q : 只显示镜像ID
[root@docker ~]# docker images -q
fad0ee7e917a
d1a364dc548d
--digests=true|false:列出镜像的数字摘要值
[root@docter ~]# docker images --digests=true
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
redis latest sha256:7e2c6181ad5c425443b56c7c73a9cd6df24a122345847d1ea9bb86a5afc76325 fad0ee7e917a 2 weeks ago 105MB
nginx latest sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750 d1a364dc548d 3 weeks ago 133MB
5、获取镜像的详细信息
#格式
docker inspect [镜像名称或镜像ID]
[root@docter ~]# docker inspect redis
#参数
-f : 格式化输出
[root@docter ~]# docker inspect -f '{{.Id}}' fad0ee7e917a
sha256:fad0ee7e917aeec77f15d0a106b8e415f4c0499d341b88c841b9a9f78c3c3ca5
[root@docker ~]# docker inspect -f '{{.ContainerConfig.Hostname}}' redis
ab0fc1cc2522
#‘.’相当于linux里的根===路径
6、登录镜像仓库
#格式
docker login
[root@docter ~]# docker login
# 默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接。
#实例
[root@docter ~]# docker login registry.cn-hangzhou.aliyuncs.com
Username: yangyang091022
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@docter ~]# cat ~/.docker/config.json #保存的登录信息
{
"auths": {
"registry.cn-hangzhou.aliyuncs.com": {
"auth": "eWFuZ3lhbmcwOTEwMjI6Y2hlbjE4NzkwMDcwODMw"
}
}
}
# 参数
[root@docter ~]# docker login -h # 帮助信息
--username|-u : 指定用户名
--password|-p : 指定密码
7、为镜像添加标签
#镜像标签的构成
docker.io/library/redis:latest
docker.io : 镜像仓库的URL
library :镜像仓库命名空间
redis : 镜像名称
latest : 镜像版本号
#打标签
#格式
docker tag [镜像ID] 镜像标签
#实例
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest fad0ee7e917a 2 weeks ago 105MB
nginx latest 08b152afcfae 3 days ago 133MB
[root@docter ~]# docker tag 08b152afcfae nginx:v1
[root@docter ~]# docker tag 621ceef7494a registry.cn-hangzhou.aliyuncs.com/alvinos/redis:v2
[root@docter ~]# docker images #改后查看(名字不同但是ID相同)
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/alvinos/redis v2 621ceef7494a 2 months ago 104MB
redis latest fad0ee7e917a 2 weeks ago 105MB
nginx latest d1a364dc548d 3 weeks ago 133MB
nginx v1 08b152afcfae 3 days ago 133MB
8、镜像上传
#格式
docker push [镜像标签]
注:要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag
#实例
[root@docter ~]# docker push registry.cn-hangzhou.aliyuncs.com/alvinos/redis:v2
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvinos/redis]
3480f9cdd491: Pushed
a24a292d0184: Pushed
f927192cc30c: Pushed
1450b8f0019c: Pushed
8e14cb7841fa: Pushed
cb42413394c4: Pushed
v2: digest: sha256:7ef832c720188ac7898dbd8d1e237b0738e94f94fc7e981cb7b8efe84555e892 size: 1572
[root@docker ~]# docker images
lnmp-php v1 303b103360fa About an hour ago 1.28GB
[root@docker ~]# docker tag lnmp-php:v1 registry.cn-shanghai.aliyuncs.com/aliyun_mm/docker_lnmp_mm:v1
[root@docker ~]# docker push registry.cn-shanghai.aliyuncs.com/aliyun_mm/docker_lnmp_mm:v1
9、镜像的删除
#格式
docker rmi [镜像名称或者镜像ID]
# 注:正在运行的镜像的删除不了,强制删除只能删除镜像名字
#实例
[root@docter ~]# docker rmi nginx
[root@docter ~]# docker rmi nginx mysql redis #删除多个镜像
[root@docter ~]# docker rmi -f $(docker images -aq) #删除全部的镜像
#参数
-f : 强制删除
[root@docter ~]# docker rmi -f mysql
Untagged: mysql:latest
Untagged: mysql@sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Deleted: sha256:c0cdc95609f1fc1daf2c7cae05ebd6adcf7b5c614b4f424949554a24012e3c09
# 注:当有容器正在使用镜像时,强制删除镜像,只能删除镜像的所有tag, 不会删除镜像。
[root@docter ~]# docker images #默认镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> d1a364dc548d 3 weeks ago 133MB
[root@docter ~]# docker rmi d1a364dc548d # 删除不掉
Error response from daemon: conflict: unable to delete d1a364dc548d (cannot be forced) - image is being used by running container 2cf9d0e88a05
[root@docter ~]# docker ps # 查看镜像
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2cf9d0e88a05 d1a364dc548d "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:49153->80/tcp, :::49153->80/tcp stoic_shirley
[root@docter ~]# docker rm -f 2cf9d0e88a05 #删除镜像的号
2cf9d0e88a05
[root@docter ~]# docker rmi d1a364dc548d #重新删除成功
Deleted: sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdee
Deleted: sha256:fcc8faba78fe8a1f75025781c8fa1841079b75b54fce8408d039f73a48b7a81b
Deleted: sha256:a476b265974ace4c857e3d88b358e848f126297a8249840c72d5f5ea1954a4bf
Deleted: sha256:56722ee1ee7e73a5c6f96ea2959fa442fb4db9f044399bcd939bb0a6eb7919dc
Deleted: sha256:c657df997c75f6c1a9c5cc683e8e34c6f29e5b4c1dee60b632d3477fd5fdd644
Deleted: sha256:e9e1f772d2a8dbbeb6a4a4dcb4f0d07ff1c432bf94fac7a2db2216837bf9ec5b
[root@docter ~]# docker image ls #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
10、清空镜像
#格式
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@docter ~]# docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: redis:latest
untagged: redis@sha256:7e2c6181ad5c425443b56c7c73a9cd6df24a122345847d1ea9bb86a5afc76325
deleted: sha256:fad0ee7e917aeec77f15d0a106b8e415f4c0499d341b88c841b9a9f78c3c3ca5
deleted: sha256:1fcc1c8f8d93df014639e7770125951e2a4014bb6ba113f654d95b5217e1639f
deleted: sha256:e1e32b76f9e2da08414af17e8413c768e26f0c1b9555df187214b25991421b16
deleted: sha256:9efc75a0d640ce670e852cdea02a0fd559c5933269feba3fa16a2a405674d2ba
deleted: sha256:d6f89a74ae79d19535904575f2ee6d08881742af9f33d1f78e2a000b0d3fa26b
deleted: sha256:ac98421641e727deccd15eed0f50bbe33f32689311fd387ad452d33731ba1f9f
11、查看镜像历史(镜像的构建历史)
#格式
docker history [镜像ID或镜像名称]
[root@docter ~]# docker pull alpine #生成镜像
[root@docter ~]# docker pull nginx #生成镜像
#实例
[root@docter ~]# docker history alpine
IMAGE CREATED CREATED BY SIZE COMMENT
d4ff818577bc 3 days ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 3 days ago /bin/sh -c #(nop) ADD file:f278386b0cef68136… 5.6MB
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest d4ff818577bc 3 days ago 5.6MB
nginx latest d1a364dc548d 3 weeks ago 133MB
12、保存镜像的三种方式
# 保存镜像(commit)
保存正在运行的容器直接为镜像
# 保存镜像(import/export)
保存容器为镜像,保存正在运行的容器为镜像压缩包
# 保存镜像(save/load)
保存镜像为压缩包
13、保存镜像(commit)
#1.docker commit 提交容器成为一个新的副本
#命令和get原理类似
docker commit -m="提交的描述信息" -a="作者" [容器ID] 目标镜像名:[TAG]
#实战测试
- 启动一个默认的tomcat
- 发现这个默认的tomcat,是没有webapps应用,镜像的原因,官方的镜像默认web apps下面是没有文件的
- 我自己拷贝进去了进本的文件
- 将我们操作过的容器通过commit提交为一个镜像,我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像。
# 保存正在运行的容器直接为镜像
#格式
docker commit [容器ID|容器名称]
docker commit -a "作者" -m "描述信息" -p 容器ID 目标镜像名:t[TAG]
#实例
[root@docter ~]# docker ps 查看docter运行信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c89471939880 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:49158->80/tcp, :::49158->80/tcp stoic_mcnulty
[root@docter ~]# docker commit -a "mm" -m "这是一个docter镜像" -p c89471939880 test:v1
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 ad763deaccb4 19 seconds ago 133MB
alpine latest d4ff818577bc 3 days ago 5.6MB
nginx latest d1a364dc548d 3 weeks ago 133MB
#参数
-a:作者信息
-m:提交信息
-p:提交时,暂停容器运行
14、保存镜像(import/export)
# 保存容器为镜像,保存正在运行的容器为镜像压缩包
#格式
docker export [容器的ID] > [包名称]
# 实例
[root@docter[root@docter ~]# docker ps # 查看docter运行信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c89471939880 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:49158->80/tcp, :::49158->80/tcp stoic_mcnulty
方式一:
[root@docter ~]# docker export c89471939880 > nginx.tar #保存镜像(打包)
方式二:
[root@docter ~]# docker export -o nginx.tar.gz c89471939880
[root@docter ~]# ll |grep nginx
-rw-r--r-- 1 root root 135603712 Jun 19 22:05 nginx.tar
[root@docter ~]# gzip nginx.tar
-rw-r--r-- 1 root root 51542981 Jun 19 22:05 nginx.tar.gz #给镜像压缩
===========================================================================================
## 导入镜像包
#格式
docker import [包名称] [自定义镜像名称]
# 实例
[root@docter ~]# docker import nginx.tar.gz test:v3
sha256:fa817d20d563315ce78553cc7832235be1ae3eee75606edd2b56071651890df0
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v3 fa817d20d563 14 seconds ago 131MB
test v1 ad763deaccb4 8 minutes ago 133MB
alpine latest d4ff818577bc 3 days ago 5.6MB
nginx latest d1a364dc548d 3 weeks ago 133MB
15、保存镜像(save/load)
保存镜像为压缩包
# 保存镜像的格式:
docker save [镜像名称|镜像ID] > [包名称]
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v3 fa817d20d563 4 minutes ago 131MB
test v1 ad763deaccb4 12 minutes ago 133MB
alpine latest d4ff818577bc 3 days ago 5.6MB
nginx latest d1a364dc548d 3 weeks ago 133MB
方式一:
[root@docter ~]# docker save d1a364dc548d > alpine.tar
total 184508
-rw-r--r-- 1 root root 137382400 Jun 19 22:14 alpine.tar
方式二:
[root@docter ~]# docker save -o alpine1.tar.gz d4ff818577bc
[root@docter ~]# ll
total 190244
-rw------- 1 root root 5873664 Jun 19 22:16 alpine1.tar.gz
-rw-r--r-- 1 root root 137382400 Jun 19 22:14 alpine.tar
====================================================================================================
# 导入镜像的格式:
docker load < [包名称]
[root@docter ~]# docker load < alpine2.tar
Loaded image ID: sha256:d4ff818577bc193b309b355b02ebc9220427090057b54a59e73b79bdfe139b83
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 7731472c3f2a 2 months ago 5.61MB
# 注:save/load保存镜像无法自定义镜像名称,save保存镜像时如果使用ID保存则load导入镜像无名称,使用名称导入时才有名称。
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 ad763deaccb4 25 minutes ago 133MB
busybox latest 69593048aa3a 11 days ago 1.24MB
nginx latest d1a364dc548d 3 weeks ago 133MB
[root@docter ~]# docker save busybox:latest >bustbox.tar
[root@docter ~]# ll
total 51776
-rw-r--r-- 1 root root 1463808 Jun 19 22:27 bustbox.tar
[root@docter ~]# docker save busybox:latest >bustbox.tar
[root@docter ~]# docker rmi 69593048aa3a
Untagged: busybox:latest
Untagged: busybox@sha256:930490f97e5b921535c153e0e7110d251134cc4b72bbb8133c6a5065cc68580d
Deleted: sha256:69593048aa3acfee0f75f20b77acb549de2472063053f6730c4091b53f2dfb02
Deleted: sha256:5b8c72934dfc08c7d2bd707e93197550f06c0751023dabb3a045b723c5e7b373
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 ad763deaccb4 26 minutes ago 133MB
nginx latest d1a364dc548d 3 weeks ago 133MB
[root@docter ~]# docker load < bustbox.tar
5b8c72934dfc: Loading layer [==================================================>] 1.455MB/1.455MB
Loaded image: busybox:latest
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 ad763deaccb4 26 minutes ago 133MB
busybox latest 69593048aa3a 11 days ago 1.24MB
nginx latest d1a364dc548d 3 weeks ago 133MB
16、保存镜像三种方式的区别
1、export保存的镜像体积要小于save(save保存更完全,export保存会丢掉一些不必要的数据)
2、export可以重命名镜像名称而save则不行
3、save可以同时保存多个镜像而export则不行
4、save一般情况下使用的场景是项目迁移,import是作为基础镜像使用
# export/inport
适用于持久化容器(不是镜像),是导出容器当前的操作系统,不包含分层系统,仅包含当前系统中的状态,相当于虚拟机的快照
保存的镜像体积要小于save(但save保存更完全,export保存会丢掉一些不必要的数据)
export可以重命名镜像名称而save则不行
# save/load
可以同时保存多个镜像而export则不行
适用于持久化镜像(不是容器),是保存一个完整的镜像,包含分层系统统一打包,相当于虚拟机的完整模板机
# docter rmi 删除镜像
# docter rm -f 删除容器
17、显示docker的版本信息
[root@docter ~]# 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
...
18、显示docker的系统信息(包括镜像和容器的数量)
[root@docter ~]# 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)
...
19、万能帮助命令
# docker帮助文档 https://docs.docker.com/reference/
[root@docter ~]# docker --help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
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