Docker概述及Docker镜像

今日内容概述

1.Docker介绍
2.Docker安装
3.Docker镜像命令

今日内容详细

1.Docker介绍

什么是容器?

容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出。隔离的环境拥有自己的文件系统,ip地址,主机名等。
容器直接运行在操作系统内核空间之上的用户空间,因此容器虚拟化也称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上。

什么是Docker?

Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在GitHub上进行维护。Docker自开源后受到广泛的关注和讨论,以至于dotCloud公司后来都改名为DockerInc。Redhat已经在其RHEL6.5中集中支持Docker;Google也在其PaaS产品中广泛应用。Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。

为什么要使用docker?

1.)Docker容器虚拟化的好处

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

2.)Docker在开发和运维中的优势

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

Docker容器与传统虚拟化的区别

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

img

特性 Docker VM
启动速度 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 原生
系统支持量 单机可支持上千个容器 一般为几十个
隔离性 进程级隔离 完全隔离

Docker的优势

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机的方式相比,具有的优势有:
1.Docker容器启动更快,启动与停止可以实现秒级,相比传统的虚拟机方式(分钟级)可要快很多。

2.Docker容器对系统资源需求很少,单台机器可以同时运行上千个Docker容器。

3.Docker通过类似git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新

4.Docker通过Dockerfile支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。

Docker的核心概念

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

1.)镜像(Image)

Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
# 用来启动Docker的模板,镜像一般存放在镜像仓库中

2.)容器(Container)

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

3)仓库(Repository)

仓库就很好理解了,就是保存镜像的仓库,当我们构建好镜像后,需要存放在仓库中,当我们需要启动一个镜像时,可以从仓库中下载下来。
镜像仓库地址:https://hub.docker.com/search?type=image

# 镜像仓库分类:
官方仓库:hub.docker.com
阿里云私有仓库:https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
自建仓库:Harbor

2.Docker安装

Docker分为企业版与社区办,我们学习使用安装社区版

企业版 : Docker
社区版 : Docker-ce

https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

1.如果之前安装过docker,卸载
yum remove docker docker-common docker-selinux docker-engine -y
# 我们要考虑到的之后与kubernetes的兼容性问题,不会报莫名其妙的错误,我们选择安装docker-ce-19.03.9

2.安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

3.安装yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

4.配置阿里云镜像加速
登录自己的阿里云账号,找到容器镜像服务 ACR,点击管理控制台,在“镜像工具处”找到镜像加速器,复制加速器地址	# 每个人的不一样
mkdir -p /etc/docker
cat >> /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://gfctbouf.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload

5.安装Docker
yum install docker-ce-19.03.9 -y

6.启动并设置开机自启
systemctl enable --now docker

7.检查Docker是否启动成功
docker info
docker version

3.Docker镜像命令

Docker镜像常用命令

1、docker search [镜像名称]                   # 搜索镜像, 优先选官方,stars数量多
 
2、docker pull [镜像名称]                     # 拉取镜像(下载镜像),注意版本
 
3、docker push [镜像标签]                     # 推送镜像(上传镜像)
 
4、docker load < [包名称]                      # 将包导入镜像
   例子: docker load  -i  docker_nginx.tar.gz
 
5、docker save [镜像名称|镜像ID] > [包名称]    # 将包导出镜像导出镜像
   例子:docker save centos:7 -o docker_centos7.tar.gz
 
6、docker image  ls                          # 查看镜像列表
 
7、docker rmi [镜像名称或者镜像ID]            # 删除镜像
 
8、docker tag [镜像ID]  镜像标签              # 给镜像打标签

Docker镜像命令使用及进阶

搜索镜像search

搜索镜像search
docker serrch [镜像命令]
# 参数
-f 筛选
# 搜索星标大于等于600的MySQL镜像
docker search mysql -f stars=600

# 搜索官方镜像
docker search -f is-official=true mysql

img

拉取镜像pull

docker pull [镜像名称]

# 案例:
docker pull redis
Using default tag: latest
latest: Pulling from library/redis
 
# 镜像层:
a076a628af6f: Pull complete 
f40dd07fe7be: Pull complete 
ce21c8a3dbee: Pull complete 
ee99c35818f8: Pull complete 
56b9a72e68ff: Pull complete 
3f703e7f380f: Pull complete 
 
# 镜像ID号,全球唯一
Digest: sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
 
# 镜像下载状态
Status: Downloaded newer image for redis:latest
 
# 镜像的全称(镜像的tag)
docker.io/library/redis:latest

查看当前镜像列表images

docker images 或者 docker image ls

# 参数
-q: 只显示镜像ID

img

获取镜像详细信息

# 格式
docker inspect [镜像名称或镜像ID]

# 参数
-f: 格式化输出

# 案例:
docker inspect -f '{{.id}}' 621ceef7494a

登录镜像仓库login

docker login
# 默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接

# 参数
--username|-u : 指定用户名
--password|-p : 指定密码

docker login --username=jerrylty98 registry.cn-hangzhou.aliyuncs.com

# 登录阿里云Docker Registry
docker login --username=jerryl**** registry.cn-hangzhou.aliyuncs.com
# 登录名为阿里云账号全名,密码为开通服务时设置的密码

镜像标签tag

# 镜像标签的构成
docker.io/library/redis:latest
docker.io  : 镜像仓库的URL
library    :镜像仓库命名空间
redis      : 镜像名称
latest     : 镜像版本号

# 打标签
docker tag [镜像ID] URL:镜像标签	# 自定义

docker tag ad4c705f24d3  registry.cn-hangzhou.aliyuncs.com/jerrytest98/test:thelast

镜像上传push

# 格式
docker push [镜像标签] 
# 注意,要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag

docker push registry.cn-hangzhou.aliyuncs.com/jerrytest98/test:thelast
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/jerrytest98/test]
fac15b2caa0c: Pushed 
f8bf5746ac5a: Pushed 
d11eedadbd34: Pushed 
797e583d8c50: Pushed 
bf9ce92e8516: Pushed 
d000633a5681: Pushed 
thelast: digest: sha256:6fe11397c34b973f3c957f0da22b09b7f11a4802e1db47aef54c29e2813cc125 size: 1570

镜像删除rmi

# 格式
    docker rmi [镜像名称或者镜像ID]
# 实例
    [root@docker01 ~]# docker rmi redis
    Untagged: redis:latest
    Untagged: redis@sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
# 参数
    -f  : 强制删除
 
# 实例
    [root@docker01 ~]# docker rmi -f 621ceef7494a

清空镜像image prune

docker image prune命令用于删除未使用的镜像,如果指定了-a,还将删除所有未被容器引用的镜像
# 格式
    docker image prune
 
 # 参数
 -a : 删除所有镜像
 
# 实例
[root@docker01 ~]# docker image prune 
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
 
docker rmi -f $( docker images -q )
 
oot@docker01 ~]# 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: nginx:latest
untagged: nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
deleted: sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74
deleted: sha256:4dfe71c4470c5920135f00af483556b09911b72547113512d36dc29bfc5f7445
deleted: sha256:3c90a0917c79b758d74b7040f62d17a7680cd14077f734330b1994a2985283b8
deleted: sha256:a1c538085c6f891424160d8db120ea093d4dda393e94cd4713e3fff3c82299b5
deleted: sha256:a3ee2510dcf02c980d7aff635909612006fd1662084d6225e52e769b984abeb5
untagged: redis:latest
untagged: redis@sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
deleted: sha256:621ceef7494adfcbe0e523593639f6625795cc0dc91a750629367a8c7b3ccebb
deleted: sha256:de66cfbf4712b8ba9ef292e08ef7487be26d9d21b350548e400ae351405d820e
deleted: sha256:79b2381e35429e8fc04d31b3445f069c22d288bf5c4cba7b7c10004ff78ae201
deleted: sha256:1d047d19be363b00139990d4d7f392dabdb0809dbc9d0fbe67c1f15b8caed27a
deleted: sha256:8c41f4e708c37059df28ae1cabc200a6db2fee45bd3a2cadcf70f2765bb68730
deleted: sha256:b51317bef36fe1900be48402c8a41fcd9cdb6b8950c10209f764473cb8323371
deleted: sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864
 
Total reclaimed space: 168MB