[TOC]
0x00 Docker 快速入门 1.Docker 基础介绍 描述:Docker [ˈdɑ:kə(r)] 是一个基于Go语言开发实现的遵循Apache 2.0协议开源项目,目标是实现轻量级的操作系统虚拟化解决方案; ,诞生于2013年初最初发起者是dotCloud公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,后续由于docker的发展后来也改名为Docker Inc,它是仅次于OpenStack最受欢迎的云计算开源项目;Docker 从 17.03版本之后分为 CE(Community Edition) 和 EE(Enterprise Edition)
Docker 的目标是”Build,Ship and Run Any App,Anywhere
“,通过对应用组件的封装\[Packaging]-> 分发\[Distribution] -> 部署\[Deployment] -> 运行\[Runtime]
等生命周期进行管理,达到应用级别”一次封装,到处运行
“; 例如:它可以独立运行一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器;
Apache 2.0 授权 Github 项目开源 : https://github.com/docker/docker
Docker与OpenStack的区别?
部署难度:Docker非常简单;OpenStack组件多部署繁琐
启动速度:秒级;分钟级
执行性能:和物理机几乎是一致;VM会占用一些资源
镜像体积:镜像是MB级别的;虚拟机镜像是GB级别的
管理效率:关键简单;组件相互依赖且管理复杂
隔离性:隔离性高;彻底隔离
可管理性:单进程;完整的系统管理
网络连接:比较弱;借助于Neutron可以灵活组件各类网络架构
完整的Docker由以下几部分构成:
(1) 守护进程(Daemon):Docker守护进程(dockerd)侦听Docker API请求并管理Docker对象,可以与客户端在同一个节点或者运行在不同节点上
,如图像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务。
(2) REST API: 主要与Docker Daemon进行交互,比如Docker Cli或者直接调用REST API;
(3) 客户端(Docker Client): 它是与Docker交互的主要方式通过命令行接口(CLI)客户端(docker命令),客户机将命令通过REST API发送给守护进程dockerd
并执行其命令;(注意:一个客户端可以与多个守护进程通信
)
(4) Register Repository 镜像仓库: Docker注册表存储Docker镜像,可以采用Docker Hub是公共注册仓库,或者采用企业内部自建的Harbor私有仓库;
(5) Image 镜像: 映像是一个只读模板,带有创建Docker容器的指令。映像通常基于另一个映像,还需要进行一些额外的定制,你可以通过Docker Hub公共镜像仓库进行拉取对应的系统或者应用镜像;
(6) Container 容器: 容器是映像的可运行实例。您可以使用Docker API或CLI创建、启动、停止、移动或删除容器。您可以将一个容器连接到一个或多个网络,将存储附加到它,甚至根据它的当前状态创建一个新映像。
(7) Services : Docker引擎支持集群模式服务允许您跨多个Docker守护进程(一个群的每个成员都是一个Docker守护进程
)扩展管理容器,服务允许您定义所需的状态,例如在任何给定时间必须可用的服务副本的数量。默认情况下,服务在所有工作节点之间进行负载平衡。对于使用者来说Docker服务看起来是一个单独的应用程序;
weiyigeek.top-引擎图
Linux容器基础之LXC技术介绍:
描述:Docker引擎的基础是Linux容器(Linux Containers,LXC)技术,容器有效的将各个操作系统管理的资源划分到孤立的组,以便更好的在孤立的组之间平衡有冲突的资源使用需求。 容器可以在核心CPU本地运行指令,并不需要任何专门的解释机制;最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具;用户操作容器就像操作一个轻量级虚拟机那样简单,也可以将容器比作为一种沙盒(Sandbox);
Docker 优势:
1.更高效的利用系统资源:Docker容器不需要进行硬件虚拟以及运行完整操作系统等额外开销(资源远远小于虚拟机);
2.更快速的启动时间:直接运行于宿主内核无需启动完整的操作系统,可以做到秒级、甚至毫秒级的启动时间;
3.更快速的交付和部署:实现持续集成(Continuous Integration)、持续交付、自动部署(Continuous Delivery/Deployment),大量节约开发,测试,部署的时间;
4.更高效的资源利用:不需要额外的虚拟化管理程序VMM以及Hypervisor的支持;
5.更容易学习、迁移和扩展:一致的运行环境Docker 可以在很多平台上运行无论是物理机、虚拟机、公有云、私有云
6.更简单的更新管理:使用Dockerfile只需要小小的配置修改,可以快速创建和删除容器,Docker hub 提供镜像平台方便共享镜像;
7.基于 Docker 的 CI 持续集成和 CD 持续支付
8.基于 Kubernetes, Docker Swarm 的集群弹性扩容和缩容
什么是虚拟化技术? 虚拟化技术是一个通用的概念,在不同的领域有不同的理解;在计算机领域一般指的是计算机虚拟化(Computer Virtualization)或者说是服务器虚拟化;虚拟化的核心是对资源进行抽象和管理,目标往往是为了在同一个主机上运行多个系统或者应用,从而提高系统资源的利用率,同时带来降低成本,方便管理和容错和容灾等好处;
硬件虚拟化:真正意义上的基于它的技术不多见,少数网卡中的单根多IO虚拟化等技术;
软件虚拟化(Virtualization)
1.应用虚拟化
2.平台虚拟化:细分
2.1 完全虚拟化
2.2 硬件辅助虚拟化:利用硬件CPU辅助支持虚拟化技术Intel-VT和AND-V处理铭感指令来实现完全虚拟化的功能;
2.3 部分虚拟化:只对部分硬件资源进行虚拟化,客户端系统需要进行修改;
2.4 准虚拟化(Paravirtualization):如xen
2.5 操作系统级虚拟化:内核通过创建多个虚拟化的操作系统实例内核和库来隔离不同的进程,dokcer以及其他容器都在这个范畴之内;
传统虚拟机的比较:
weiyigeek.top-传统对比
传统虚拟化方式与Docker虚拟化方式
传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层,然后在该系统上运行业务所需程序;
Docker虚拟化方式是在宿主系统层面上实现虚拟化,直接复用本地主机的操作系统与内核,容器内没有自己的内核,所以容器内的应用进程实际运行于宿主机内核,因此更加轻量级;
weiyigeek.top-Docker
虚拟机是为提供系统环境而生,容器是为了提供应用环境而生的;
weiyigeek.top-VM对比
物理机-虚拟机-Docker容器容易理解的对比
一栋楼一户人家,独立地基独立花园(别墅)
一栋楼包含多套房,一套房一户人家,共享地基、共享花园、独立卫生间、厨房和宽度(二室一厅)
一套房隔成多个小隔间,每个小隔间住一位租户(胶囊式公寓)
Docker 应用场景
使用docker容器开发、测试、部署服务:自动化测试和持续集成、发布;
在服务型环境中部署与扩展Webapp以及调整数据库或其他应用;
统一、优化和加速本地开发和构建流程;创建隔离的运行环境,测试环境
构建多用户的平台即服务(PaaS)基础设施
提供软件即服务(SaaS)的应用程序
高性能、超大规模的宿主机部署,web应用的自动化打包和发布
2.Docker 架构 描述:Docker对使用者来讲是一个C/S模式(使用客户机-服务器)的架构而Docker的后端是一个非常松耦合的架构,模块各司其职并有机组合支撑Docker的运行。
具体流程:
(1) 用户使用Docker客户机与Docker守护进程通信,后者负责构建、运行和分发Docker容器等繁重的工作。
(2) Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;
(3) Docker客户端和守护进程可以运行在同一个系统上,或者您可以将一个Docker客户端连接到一个远程Docker守护进程。
(4) Docker客户机和守护进程之间通过UNIX套接字
或网络接口使用REST API进行通信
。
weiyigeek.top-架构
Docker 内部具体实现:
Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;
当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;
当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。
libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。
weiyigeek.top-组件架构图
3.Docker 资源隔离 Docker 本质是宿主机上的一个进程,docker通过namespace实现资源隔离以及轻量级虚拟化容器服务,通过cgroup实现了资源限制,通过写时复制技术(Copy-on-write)实现了高效的文件操作;
Docker通过由内核namespace提供实现的隔离,namespace的API包括clone(),sents()以及unshare()
还有在/proc下的部分文件
文件系统隔离:每个容器都有自己的 root 文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:容器间的虚拟网络接口和 IP 地址都是分开的
资源隔离和分组:使用 cgroups 将 CPU 和内存之类的资源独立分配给每个 Docker 容器
即namespace的六项隔离(内核实现 namespace 资源隔离内容 - 系统调用参数
)如下标所示:
名称
宏定义
隔离的内容
IPC
CLONE_NEWIPC
System V IPC, POSIX message queues (since Linux 2.6.19) 信号量消息队列和共享内存
NETWORK
CLONE_NEWNET
network device interfaces, IPv4 and IPv6 protocol stacks, IP routing tables, firewall rules, the /proc/net and /sys/class/net directory trees, sockets, etc (since Linux 2.6.24) 网络设备,网络栈,端口等
MOUNT
CLONE_NEWNS
Mount points (since Linux 2.4.19) 挂载点(文件系统)
PID
CLONE_NEWPID
Process IDs (since Linux 2.6.24) 进程编号
User
CLONE_NEWUSER
User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8) 用户和用户组(3.8后内核支持)
UTS
CLONE_NEWUTS
Hostname and NIS domain name (since Linux 2.6.19) 主机名与域名(自Linux 2.6.19)
Cgroup
CLONE_NEWCGROUP
Cgroup root directory (since Linux 4.6) Cgroup根目录(自Linux 4.6)
cgroup的特点与功能:
cgroup的API以一个伪文件系统来实现的,用户态的程序通过文件操作实现cgroup的组织管理;
cgroup的组织管理操作单元可以细粒度级别,另外用户可以创建和销毁cgroup,从而实现资源再分配和利用;
所有资源管理的功能都以子吸引的方式实现接口统一,子任务创建之初与其父任务处于同一cgroup的控制组;
cgroup四大功能:资源限制(资源总额进行限制),优先级分配(分配CPU时间片数量以及磁盘IO带宽大小),资源统计(CPU时长/内存用量),任务控制(执行挂起/恢复等操作);
4.Docker 容器文件系统 描述:从下面的图片可以看见出以下几点:
Docker 镜像代表了容器的文件系统里的内容,是容器的基础,镜像一般是通过 Dockerfile 生成的;
Docker 的镜像是分层的,所有的镜像(除了基础镜像)都是在之前镜像的基础上加上自己这层的内容生成的;
Docker 中每一层镜像的元数据都是存在 json 文件中的,除了静态的文件系统之外,还会包含动态的数据;
Docker 镜像生产容器后会在此基础之上加入挂载点到安装Docker宿主机文件系统之中,并提供一个读写层(Read-Write Layer),所以容器进程的所有操作都在读写层进行;
weiyigeek.top-容器文件系统
总结:
Docker通过为Linux容器技术提供更简洁的使用和管理方案、更高效的版本控制,Docker 让容器技术一下子变得灵活易用,随着云计算(Cloud Computing)的发展,它在Virtualization中的地位越来越重要.
四大核心概念:镜像 [image] / 容器 [Container] / 仓库 [Repository] / Dockerfile
参考书籍:Docker技术入门与实战
0x01 Docker 安装实践 1.Linux 系统安装 系统环境:Docker最低支持CentOS7且在64位平台上并且内核版本在3.10以上的Linux操作系统。 官方安装文档:https://docs.docker.com/install/linux/docker-ce/centos/# 镜像开源安装站点:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
Docker Engine改为Docker CE(社区版): 它包含了CLI客户端、后台进程/服务以及API。用户像以前以同样的方式获取。
Docker Data Center改为Docker EE(企业版): 在Docker三个定价层增加了额外的支付产品和支持。
官方一键安装脚本 补充时间:[2020年4月22日 11:00:59]
一键安装Docker-ce以及Docker-compose:
[TOC]
0x00 Docker 快速入门 1.Docker 基础介绍 描述:Docker [ˈdɑ:kə(r)] 是一个基于Go语言开发实现的遵循Apache 2.0协议开源项目,目标是实现轻量级的操作系统虚拟化解决方案; ,诞生于2013年初最初发起者是dotCloud公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,后续由于docker的发展后来也改名为Docker Inc,它是仅次于OpenStack最受欢迎的云计算开源项目;Docker 从 17.03版本之后分为 CE(Community Edition) 和 EE(Enterprise Edition)
Docker 的目标是”Build,Ship and Run Any App,Anywhere
“,通过对应用组件的封装\[Packaging]-> 分发\[Distribution] -> 部署\[Deployment] -> 运行\[Runtime]
等生命周期进行管理,达到应用级别”一次封装,到处运行
“; 例如:它可以独立运行一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器;
Apache 2.0 授权 Github 项目开源 : https://github.com/docker/docker
Docker与OpenStack的区别?
部署难度:Docker非常简单;OpenStack组件多部署繁琐
启动速度:秒级;分钟级
执行性能:和物理机几乎是一致;VM会占用一些资源
镜像体积:镜像是MB级别的;虚拟机镜像是GB级别的
管理效率:关键简单;组件相互依赖且管理复杂
隔离性:隔离性高;彻底隔离
可管理性:单进程;完整的系统管理
网络连接:比较弱;借助于Neutron可以灵活组件各类网络架构
完整的Docker由以下几部分构成:
(1) 守护进程(Daemon):Docker守护进程(dockerd)侦听Docker API请求并管理Docker对象,可以与客户端在同一个节点或者运行在不同节点上
,如图像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务。
(2) REST API: 主要与Docker Daemon进行交互,比如Docker Cli或者直接调用REST API;
(3) 客户端(Docker Client): 它是与Docker交互的主要方式通过命令行接口(CLI)客户端(docker命令),客户机将命令通过REST API发送给守护进程dockerd
并执行其命令;(注意:一个客户端可以与多个守护进程通信
)
(4) Register Repository 镜像仓库: Docker注册表存储Docker镜像,可以采用Docker Hub是公共注册仓库,或者采用企业内部自建的Harbor私有仓库;
(5) Image 镜像: 映像是一个只读模板,带有创建Docker容器的指令。映像通常基于另一个映像,还需要进行一些额外的定制,你可以通过Docker Hub公共镜像仓库进行拉取对应的系统或者应用镜像;
(6) Container 容器: 容器是映像的可运行实例。您可以使用Docker API或CLI创建、启动、停止、移动或删除容器。您可以将一个容器连接到一个或多个网络,将存储附加到它,甚至根据它的当前状态创建一个新映像。
(7) Services : Docker引擎支持集群模式服务允许您跨多个Docker守护进程(一个群的每个成员都是一个Docker守护进程
)扩展管理容器,服务允许您定义所需的状态,例如在任何给定时间必须可用的服务副本的数量。默认情况下,服务在所有工作节点之间进行负载平衡。对于使用者来说Docker服务看起来是一个单独的应用程序;
weiyigeek.top-引擎图
Linux容器基础之LXC技术介绍:
描述:Docker引擎的基础是Linux容器(Linux Containers,LXC)技术,容器有效的将各个操作系统管理的资源划分到孤立的组,以便更好的在孤立的组之间平衡有冲突的资源使用需求。 容器可以在核心CPU本地运行指令,并不需要任何专门的解释机制;最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具;用户操作容器就像操作一个轻量级虚拟机那样简单,也可以将容器比作为一种沙盒(Sandbox);
Docker 优势:
1.更高效的利用系统资源:Docker容器不需要进行硬件虚拟以及运行完整操作系统等额外开销(资源远远小于虚拟机);
2.更快速的启动时间:直接运行于宿主内核无需启动完整的操作系统,可以做到秒级、甚至毫秒级的启动时间;
3.更快速的交付和部署:实现持续集成(Continuous Integration)、持续交付、自动部署(Continuous Delivery/Deployment),大量节约开发,测试,部署的时间;
4.更高效的资源利用:不需要额外的虚拟化管理程序VMM以及Hypervisor的支持;
5.更容易学习、迁移和扩展:一致的运行环境Docker 可以在很多平台上运行无论是物理机、虚拟机、公有云、私有云
6.更简单的更新管理:使用Dockerfile只需要小小的配置修改,可以快速创建和删除容器,Docker hub 提供镜像平台方便共享镜像;
7.基于 Docker 的 CI 持续集成和 CD 持续支付
8.基于 Kubernetes, Docker Swarm 的集群弹性扩容和缩容
什么是虚拟化技术? 虚拟化技术是一个通用的概念,在不同的领域有不同的理解;在计算机领域一般指的是计算机虚拟化(Computer Virtualization)或者说是服务器虚拟化;虚拟化的核心是对资源进行抽象和管理,目标往往是为了在同一个主机上运行多个系统或者应用,从而提高系统资源的利用率,同时带来降低成本,方便管理和容错和容灾等好处;
硬件虚拟化:真正意义上的基于它的技术不多见,少数网卡中的单根多IO虚拟化等技术;
软件虚拟化(Virtualization)
1.应用虚拟化
2.平台虚拟化:细分
2.1 完全虚拟化
2.2 硬件辅助虚拟化:利用硬件CPU辅助支持虚拟化技术Intel-VT和AND-V处理铭感指令来实现完全虚拟化的功能;
2.3 部分虚拟化:只对部分硬件资源进行虚拟化,客户端系统需要进行修改;
2.4 准虚拟化(Paravirtualization):如xen
2.5 操作系统级虚拟化:内核通过创建多个虚拟化的操作系统实例内核和库来隔离不同的进程,dokcer以及其他容器都在这个范畴之内;
传统虚拟机的比较:
weiyigeek.top-传统对比
传统虚拟化方式与Docker虚拟化方式
传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层,然后在该系统上运行业务所需程序;
Docker虚拟化方式是在宿主系统层面上实现虚拟化,直接复用本地主机的操作系统与内核,容器内没有自己的内核,所以容器内的应用进程实际运行于宿主机内核,因此更加轻量级;
weiyigeek.top-Docker
虚拟机是为提供系统环境而生,容器是为了提供应用环境而生的;
weiyigeek.top-VM对比
物理机-虚拟机-Docker容器容易理解的对比
一栋楼一户人家,独立地基独立花园(别墅)
一栋楼包含多套房,一套房一户人家,共享地基、共享花园、独立卫生间、厨房和宽度(二室一厅)
一套房隔成多个小隔间,每个小隔间住一位租户(胶囊式公寓)
Docker 应用场景
使用docker容器开发、测试、部署服务:自动化测试和持续集成、发布;
在服务型环境中部署与扩展Webapp以及调整数据库或其他应用;
统一、优化和加速本地开发和构建流程;创建隔离的运行环境,测试环境
构建多用户的平台即服务(PaaS)基础设施
提供软件即服务(SaaS)的应用程序
高性能、超大规模的宿主机部署,web应用的自动化打包和发布
2.Docker 架构 描述:Docker对使用者来讲是一个C/S模式(使用客户机-服务器)的架构而Docker的后端是一个非常松耦合的架构,模块各司其职并有机组合支撑Docker的运行。
具体流程:
(1) 用户使用Docker客户机与Docker守护进程通信,后者负责构建、运行和分发Docker容器等繁重的工作。
(2) Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;
(3) Docker客户端和守护进程可以运行在同一个系统上,或者您可以将一个Docker客户端连接到一个远程Docker守护进程。
(4) Docker客户机和守护进程之间通过UNIX套接字
或网络接口使用REST API进行通信
。
weiyigeek.top-架构
Docker 内部具体实现:
Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;
当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;
当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。
libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。
weiyigeek.top-组件架构图
3.Docker 资源隔离 Docker 本质是宿主机上的一个进程,docker通过namespace实现资源隔离以及轻量级虚拟化容器服务,通过cgroup实现了资源限制,通过写时复制技术(Copy-on-write)实现了高效的文件操作;
Docker通过由内核namespace提供实现的隔离,namespace的API包括clone(),sents()以及unshare()
还有在/proc下的部分文件
文件系统隔离:每个容器都有自己的 root 文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:容器间的虚拟网络接口和 IP 地址都是分开的
资源隔离和分组:使用 cgroups 将 CPU 和内存之类的资源独立分配给每个 Docker 容器
即namespace的六项隔离(内核实现 namespace 资源隔离内容 - 系统调用参数
)如下标所示:
名称
宏定义
隔离的内容
IPC
CLONE_NEWIPC
System V IPC, POSIX message queues (since Linux 2.6.19) 信号量消息队列和共享内存
NETWORK
CLONE_NEWNET
network device interfaces, IPv4 and IPv6 protocol stacks, IP routing tables, firewall rules, the /proc/net and /sys/class/net directory trees, sockets, etc (since Linux 2.6.24) 网络设备,网络栈,端口等
MOUNT
CLONE_NEWNS
Mount points (since Linux 2.4.19) 挂载点(文件系统)
PID
CLONE_NEWPID
Process IDs (since Linux 2.6.24) 进程编号
User
CLONE_NEWUSER
User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8) 用户和用户组(3.8后内核支持)
UTS
CLONE_NEWUTS
Hostname and NIS domain name (since Linux 2.6.19) 主机名与域名(自Linux 2.6.19)
Cgroup
CLONE_NEWCGROUP
Cgroup root directory (since Linux 4.6) Cgroup根目录(自Linux 4.6)
cgroup的特点与功能:
cgroup的API以一个伪文件系统来实现的,用户态的程序通过文件操作实现cgroup的组织管理;
cgroup的组织管理操作单元可以细粒度级别,另外用户可以创建和销毁cgroup,从而实现资源再分配和利用;
所有资源管理的功能都以子吸引的方式实现接口统一,子任务创建之初与其父任务处于同一cgroup的控制组;
cgroup四大功能:资源限制(资源总额进行限制),优先级分配(分配CPU时间片数量以及磁盘IO带宽大小),资源统计(CPU时长/内存用量),任务控制(执行挂起/恢复等操作);
4.Docker 容器文件系统 描述:从下面的图片可以看见出以下几点:
Docker 镜像代表了容器的文件系统里的内容,是容器的基础,镜像一般是通过 Dockerfile 生成的;
Docker 的镜像是分层的,所有的镜像(除了基础镜像)都是在之前镜像的基础上加上自己这层的内容生成的;
Docker 中每一层镜像的元数据都是存在 json 文件中的,除了静态的文件系统之外,还会包含动态的数据;
Docker 镜像生产容器后会在此基础之上加入挂载点到安装Docker宿主机文件系统之中,并提供一个读写层(Read-Write Layer),所以容器进程的所有操作都在读写层进行;
weiyigeek.top-容器文件系统
总结:
Docker通过为Linux容器技术提供更简洁的使用和管理方案、更高效的版本控制,Docker 让容器技术一下子变得灵活易用,随着云计算(Cloud Computing)的发展,它在Virtualization中的地位越来越重要.
四大核心概念:镜像 [image] / 容器 [Container] / 仓库 [Repository] / Dockerfile
参考书籍:Docker技术入门与实战
0x01 Docker 安装实践 1.Linux 系统安装 系统环境:Docker最低支持CentOS7且在64位平台上并且内核版本在3.10以上的Linux操作系统。 官方安装文档:https://docs.docker.com/install/linux/docker-ce/centos/# 镜像开源安装站点:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
Docker Engine改为Docker CE(社区版): 它包含了CLI客户端、后台进程/服务以及API。用户像以前以同样的方式获取。
Docker Data Center改为Docker EE(企业版): 在Docker三个定价层增加了额外的支付产品和支持。
官方一键安装脚本 补充时间:[2020年4月22日 11:00:59]
一键安装Docker-ce以及Docker-compose:1 2 3 4 5 6 7 8 9 10 11 12 13 curl -fsSL https://get.docker.com | bash -s docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun curl -fsSL https://get.docker.com -o get-docker.sh && chmod +x get-docker.sh && ./get-docker.sh docker-info sudo curl -L "https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s) -$(uname -m) " -o /usr/local /bin/docker-compose && chmod +x /usr/local /bin/docker-compose docker-compose version
CentOS 中利用 yum 安装 Docker / Docker-compose 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 yum remove -y docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io docker-compose yum list docker-ce --showduplicates | sort -r sudo yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io docker-compose yum -y upgrade docker-ce systemctl start/status docker docker version Client: Version: 18.09.5 API version: 1.39 Go version: go1.10.8 Git commit: e8ff056 Built: Thu Apr 11 04:43:34 2019 OS/Arch: linux/amd64 $ sudo yum remove docker-ce $ sudo rm -rf /var/lib/docker docker pull hello-world docker images docker run hello-world
weiyigeek.top-DockerCentosOK
Ubuntu 中利用 apt 安装 Docker / Docker-compose
Ubuntu安装Docker参考: https://docs.docker.com/install/linux/docker-ce/ubuntu/ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common sudo curl https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" sudo apt-get update && sudo apt-get install -y docker-ce=5:20.10.7~3-0~ubuntu-focal docker-ce-cli=5:20.10.7~3-0~ubuntu-focal containerd.io docker-compose apt-cache madison docker-ce sudo gpasswd -a ${USER} docker mkdir -vp /etc/docker/ sudo tee /etc/docker/daemon.json <<-'EOF' { "data-root" :"/var/lib/docker" , "registry-mirrors" : ["https://xlx9erfu.mirror.aliyuncs.com" ], "exec-opts" : ["native.cgroupdriver=systemd" ], "storage-driver" : "overlay2" , "log-driver" : "json-file" , "log-level" : "warn" , "log-opts" : { "max-size" : "100m" , "max-file" : "10" }, "live-restore" : true , "dns" : ["223.6.6.6" ], "insecure-registries" : ["harbor.weiyigeek.top" ] } EOF sudo systemctl daemon-reload sudo systemctl enable docker sudo systemctl restart docker
docker-compose的安装补充时间:[2020年1月22日 10:54:55]
,可能随着时间推移最新版本与下述版本不同,请安装最新的docker-compose版本即可。
1 2 3 4 $ curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s) -$(uname -m) " > /usr/local /bin/docker-compose $ chmod +x /usr/local /bin/docker-compose
方式2:安装Docker-Compose1 2 3 4 5 6 7 $yum install -y python3$pip3 install pip --upgrade[root@vm-1575613390 ~] pip 19.3.1 from /usr/local /lib/python3.6/site-packages/pip (python 3.6) $pip3 install docker-compose
补充说明:[2020年4月22日 10:58:21]
目前最新版本的 docker 默认优先采用 overlay2 的存储驱动,对于已支持该驱动的 Linux 发行版,不需要任何进行任何额外的配置
2.Windows 系统安装 Windows 下安装 Docker:https://www.docker.com/products/docker-desktop 使用CPU虚拟化检测工具(LeoMoon CPU-V)检测环境:
weiyigeek.top-cpu-v
window 7 - 已经不适用 Step 1.下载 docker Tool box 进行全安装FULL Installation Step 2.安装成功后会在桌面出现virtual VM,docker,Kitematic(Alpha)等等
Kitematic(Alpha):是一个Docker GUi工具.用户可能运行命令(docker run hello-world)在Docker客户端启动一个容器,在Kitematic中能观察结果. 用GitHub账号登陆.就可以看到自己创建的镜像,或是在GitHub上down下来的镜像. Oracle VM VirtualBox:虚拟机管理器,可以创建虚拟机;也可对当前正在运行的虚拟机进行管理.
Step 3.点击 Docker Quickstart Terminal进行下载boot2docker.iso 运气好不报错的话可以说明安装完成 Step 4.而我win7启动 Docker Quickstart Terminal报错,解决方法也是很简单
weiyigeek.top-报错
下载后放在C:\Users\WeiyiGeek.docker\machine\cache\boot2docker.iso即可
weiyigeek.top-下载boot2docker
解决上述问题后,验证安装:1 2 3 docker pull hello-world docker images docker run hello-world
weiyigeek.top-安装成功
Step 5.安装后的docker是可以通过ssh连接的,boot2docker用户和密码1 2 docker tcuser ssh root command :sudo -i (docker用户下执行)
weiyigeek.top-dockerssh
window 10 - 官方提供的 Docker Desktop for Windows 描述: 现在在Windows 10 Pro, Enterprise, and Education
等系统版本中可以进行下载安装Docker Desktop for Windows
下载地址-当前版本2.3.0.3 ,它可以进行使用的界面来操作查看docker中的容器,以此来简化了学习成本; Step 1.设置docker进行安装,加入到PATH之中 Step 2.安装成功,关闭窗口 Step 3.安装后利用powershell进行查看docker版本1 2 > docker version > docker run hello-world
Step 4.查看docker pull下来得镜像,并且运行1 2 > docker images > docker run -it hello-world
weiyigeek.top-desktop for windows
Tips: 如果在VMware中安装的虚拟机需要开启VT-X,如果Desktop无法启动则尝试以下解决方法:1 2 3 4 5 6 Get-VM Get-VMProcessor -VMName Server2019 | fl Set-VMProcessor -ExposeVirtualizationExtensions $true -VMName Server2019
Tips: 利用Docker Desktop部署blog1 2 3 4 PS C:\> mkdir github; cd .\github\ PS C:\github> Invoke-WebRequest -Uri https://github.com/WeiyiGeek/WeiyiGeek/archive/refs/heads/master.zip -OutFile blog.zip PS C:\github> Expand-Archive -Path .\blog.zip -DestinationPath . PS C:\github> mv .\WeiyiGeek-master\ blog
weiyigeek.top-Docker Desktop
3.Mac 系统安装 描述: Mac安装请参考Docker官方文档,由于企业中服务器一般是采用Linux操作系统作为基础环境,Mac 多用于开发测试电脑,所以此处不再进行安装实践讲解。
weiyigeek.top-mac
4.镜像加速器配置 Q: Docker 镜像站(加速器配置)是什么,我需要使用吗? 描述: 使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此为你的Docker服务配置Docker镜像站(加速)是非常必要的,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,如果您是在国内的网络环境使用 Docker,那么 Docker 镜像站一定能帮助到您。
方式1:使用DaoCloud加速器 简介:DaoCloud 加速器 是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。 DaoCloud官网:https://www.daocloud.io/mirror#accelerator-doc
配置方式:1 2 3 4 5 6 7 8 9 10 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors" : ["http://f1361db2.m.daocloud.io" ,"https://xlx9erfu.mirror.aliyuncs.com" ] } EOF
方式2:使用阿里云容器镜像服务加速器 推荐安装1.10.0以上版本的Docker客户端,您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors" : ["https://xlx9erfu.mirror.aliyuncs.com" ] } EOF ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --registry-mirrors=https://xlx9erfu.mirror.aliyuncs.com vi /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --registry-mirror=https://xlx9erfu.mirror.aliyuncs.com sudo systemctl daemon-reload sudo systemctl restart docker sudo ps -ef | grep dockerd root 5346 1 0 19:03 ? 00:00:00 /usr/bin/dockerd --registry-mirror=https://jxus37ad.mirror.aliyuncs.com
weiyigeek.top-
补充一键配置:1 2 3 4 5 6 7 8 9 10 11 12 export REGISTRY_MIRROR=https://xlx9erfu.mirror.aliyuncs.comcurl -sSL https://kuboard.cn/install-script/set_mirror.sh | sh -s ${REGISTRY_MIRROR}
0x02 Docker 核心概念 描述:Docker的三大核心概念镜像/容器和仓库, 通过三大对象核心概念所构建的高效工作流程;
1.镜像 [image] 描述:images 类似于虚拟机镜像,借鉴了Git利用分成分层优点,通过文件系统分层的概念实现了分层复用,极大的节约了磁盘空间;简单的您可以将它理解成为一个面向Docker引擎的只读模板包含文件系统;
镜像是创建Docker容器的基础,然后通过版本管理和增量的文件系统;
用户基于镜像来运行自己的容器,镜像是基于 Union 文件系统的层式结构;
Docker运行容器前本地必须存在对应的镜像,如果不指定镜像名将会默认自动采用Docker Hub公共注册服务器仓库中该名称的镜像; Docker 镜像使用帮助:https://lug.ustc.edu.cn/wiki/mirrors/help/docker
基础知识:
1.镜像名称格式:Repository address/Namespace/ImageName:tag
即hub.weiyigeek.top/Test/alpine-apps:1.0
2.典型Linux启动需要运行两个FS即:Kernel > Bootfs > Rootfs
3.镜像的分层结构: 新镜像是从Base镜像一层一层叠加的,每安装一个软件就在现有镜像基础上增加一层;
镜像操作常用命令:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 docker search --no-trunc=false [镜像名称] docker pull name/[repository[:tag]] docker push DockerHubUser用户/test :latest docker images docker tag 原仓库[:标签] 新仓库名[:标签] docker tag <image id> username/name:devel docker inspect [image id] docker inspect -f {{".Architecture" }} 550(images Id 前面3位) docker rmi [<image id>|<repository> ] docker rmi -f <images id> docker save -o 保存文件名.tar [repository[:tag]] docker save [repository[:tag]] > 保存文件名 docker load --input 保存文件名.tar docker load < 保存文件名.tar
运行案例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 $ sudo docker pull ubuntu:16.04 Using default tag: latest latest: Pulling from library/ubuntu f476d66f5408: Pulling fs layer 8882c27f669e: Pulling fs layer d9af21273955: Pulling fs layer f5029279ec12: Waiting $ sudo docker pull registry.hub.docker.com:5000/ubuntu $ sudo docker run -t -i Ubuntu /bin/bash root@634e7ed26d76:/ USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT 03:34:47 up 1:59, 0 users, load average: 0.00, 0.05, 0.06 root@634e7ed26d76:/ NAME="Ubuntu" VERSION="18.04.2 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.2 LTS" $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest d131e0fa2585 9 days ago 102MB centos latest 9f38484d220f 7 weeks ago 202MB $ sudo docker tag ubuntu:latest ubuntu18.04:latest $ sudo docker tag d131e0fa2585 ubuntutls:latest $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntutls latest d131e0fa2585 9 days ago 102MB ubuntu18.04 latest d131e0fa2585 9 days ago 102MB $ sudo docker inspect d131e0fa2585 $ sudo docker inspect -f {{".Architecture" }} d131 amd64
weiyigeek.top-inspect
当该镜像在容器运行存在的时候,镜像文件默认是无法被删除的;必须停止/删除容器ID才能删除镜像文件;1 2 3 4 5 6 7 8 9 10 11 12 $ sudo docker rmi ubuntu18.04 Untagged: ubuntu18.04:latest $ sudo docker rmi ubuntu ubuntutls Untagged: ubuntu:latest Untagged: ubuntu@sha256:d26d529daa4d8567167181d9d569f2a85da3c5ecaf539cace2c6223355d69981 $ sudo docker rmi -f ubuntutls Untagged: ubuntutls:latest Deleted: sha256:d131e0fa2585a7efbfb187f70d648aa50e251d9d3b7031edf4730ca6154e221e
创建镜像有三种办法:
1.从已有镜像的容器创建
2.基于本地模板导入:使用操作系统模板导入一个镜像文件;这里推荐使用OpenVZ提供的模板来常见
3.基于Dockerfile导入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $sudo docker commit [option-选项] ContainerId [Repository[:Tag]]$sudo docker commit -m "xx" -a "oo" ContainerID(被修改过的ID) [Repository[:Tag]] $sudo docker run -it centos:latest /bin/bash[root@32a481e170c6 ~]$ touch {1..10}.txt $sudo docker container ls -a $sudo docker commit -m "Zabbix base in Centos7" -a "Weiyigeek" 32a481e170c6 centoszabbix:latestsha256:680ddb57c4b80c625ef68e113f553ee932a06f25d4685d25a0b6464cf5d60982 $sudo cat ubuntu-14.04.tar.gz | docker import - ubuntu:14.04
存出和载人镜像并上传镜像到DockerHub中实例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 $docker save -o zabbixcentos.tar centoszabbix:latestls -alh zabbixcentos.tar -rw------- 1 root root 200M 5月 6 13:16 zabbixcentos.tar $docker load --input zabbixcentos.tarLoaded image: centoszabbix:latest $docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE centoszabbix (上面从已有镜像文件中创建) latest 622b7661c06b 13 minutes ago 202MB $docker login Login Succeeded $docker push weiyigeek/czabbix:latestThe push refers to repository [docker.io/weiyigeek/czabbix] 484404f26982: Pushed d69483a6face: Mounted from library/centos latest: digest: sha256:c1d891c2d56a0677ff28639189fa7252790d3b8ef417816570fb3a7654bc4e05 size: 736
weiyigeek.top-hub镜像上传成功
镜像的F&Q相关问题
Q:Docker 镜像是怎么实现增量的修改和维护的? 答:每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。 通常 Union FS 有两个用途:(Docker 在 AUFS 上构建的容器也是利用了类似的原理)
一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下
就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作
Q: 什么是虚悬镜像? 答: 虚悬镜像(dangling image),在使用docker images 查看镜像既没有仓库名,也没有标签只是显示一个<none>
的镜像 产生原因:由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 的镜像。1 2 3 $ docker images -f dangling=true $ docker rmi $(docker images -q -f dangling=true )
Q: 什么是镜像写时复制? 答: 比如典型的Linux启动首先会将rootfs置为readonly再进行一系列检查后将其切换为readwrite供用户使用,当在Docker中起初也是将rootfs置为readonly,然后利用union mount将一个readwrite文件系统挂载只读的rootfs之上,并且运行再次将下层的文件系统设置为readonly并且向上叠加,我们把这样一组readonly和一个writeable的结构构成一个容器的运行目录,每一个被称为一个Layer;1 2 3 4 5 6 Writable : Container (可以向上叠加同时它变成一层Image) add Apache : Image (Reference parent-引用父) add Emacs : Image (Reference parent-引用父) Debian : Base Image > Bootfs lxc,aufs,brtfs : Kernel
Q: Docker 中 save 和 export 命令的区别? 答: 我们先简单的说一下其区别,在随后的的例子中使您更快的理解;
1.save 与 load 命令对应即导出与导入镜像,而export与import命令对应即导出导入容器;
2.save 保存后 load 加载的镜像没有丢失历史和层(Layer),而容器export导出然后import导入时所有的提交历史将会丢失,这意味着您无法回滚到之前的层;
3.补充:通过import导入的方式镜像只有一层,而通过commit的方式生成的镜像实际是在原有的Base Image(即复写层)上又生成了一层;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 docker exec -it test1 mkdir /tmp/demo docker commit -a "WeiyiGeek" -m "create /tmp/demo directory" test1 test :1.2 sha256:30a048249000dd36561bffaa9fecc7690a45ef12096849c77afd4543b0d2d9b0 docker save -o save.tar 30a048 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 25d2d645bfc9 test1 "top -b -d 2" 2 weeks ago Up 3 days test1 docker export test1 > export.tar docker load -i save.tar Loaded image ID: sha256:30a048249000dd36561bffaa9fecc7690a45ef12096849c77afd4543b0d2d9b0 cat export.tar | docker import - test1:1.0 sha256:cdd65e7054be9e1928fe8133380817e81ff12b8493b40e2f9106efedac5ee572 docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 30a048249000 2 minutes ago 7.37MB test1 1.0 cdd65e7054be 3 minutes ago 7.35MB [root@master-01 ~]$ docker history 30a [root@master-01 ~]$ docker history cdd
2.容器 [Container] 描述:Docker容器Container类似于一个轻量级的沙箱,也可以看做一个简易版的Linux系统环境;因为容器是运行应用程序的,所以必须得先有一个操作系统为基础
Docker利用容器来运行和隔离应用;
容器是从镜像创建的应用独立运行的实例;
可以进行启动/开始/停止/删除容器,而这些容器都是相互隔离,互不可见的;
镜像自身只读的,容器从镜像启动的时候会在镜像的最上层创建一个可写层,镜像本身将保持不变;
创建容器、启动容器、终止容器、进入容器、删除容器、导入导出容器实现容器迁移;
当创建并运行容器时候Docker在后台运行的标准操作包括:
检查本地是否存在指定镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一个可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个IP地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
启动容器有两种方式:
一种是基于镜像新建一个容器并启动
另外一个是将在终止状态(stopped)的容器重新启动。
容器操作常用命令::1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 docker create -it repository[:tag] docker start -a -i <container id> docker run -t -i repository[:tag] /bin/bash docker run -d repository[:tag] /bin/sh -C "echo hello word" docker logs <Container-id> docker attach [names] docker exec -it <Container-id> /bin/bash docker ps -aq docker restart <container id> docker stop <container id> docker kill <cantainer id> docker rm <container id> docker export <container id> >导出文件.tar docker import - repository[:tag]
weiyigeek.top-run与start的区别
命令实践:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 $sudo docker create -it weiyigeek/czabbix 2b72a3410be576aeb9023ef2c41488e7b2630cf2282b8a0b1dddce771f22231f $sudo docker start -i 2b7 $sudo docker ps -a $docker run -t -i centos /bin/bash $ddocker run -d centoszabbix /bin/sh -c "echo Hello World,Docker Container" 4e62768b1d9196fc79fd740c103df79c8e3bb09d9c6810aa43976abeda036a26 $ddocker logs 4e62 Hello World,Docker Container $docker attach priceless_chaplygin $docker exec -ti b72 /bin/echo "whoami" $sudo docker stop 634e7ed26d76 $sudo docker rm 634 $sudo docker rmi -f d131e0fa2585 $sudo docker export 092 > czabbix.tar$cat czabbix.tar | docker import - test :latestsha256:bbb9dbcaa5fff9c5b1b99c978df4dcaeeca3d2200d82fc466f5064931bd3bba2 [root@zabbix ~] REPOSITORY TAG IMAGE ID CREATED SIZE test latest bbb9dbcaa5ff 14 seconds ago 202MB
补充:使用nsenter工具进入Docker容器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $PID =$(docker inspect --format "{{ .State.Pid}}" <container id>)$nsenter --target $PID --mount --uts --ipc --net --pid[root@zabbix ~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED 092d1b82c6a0 weiyigeek/czabbix "/bin/bash" 17 minutes ago ck [root@zabbix ~]$ docker inspect --format "{{ .State.Pid}}" 092 9030 [root@zabbix ~]$ nsenter --target 9030 --mount --uts --ipc --net --pid [root@092d1b82c6a0 /]$ cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)
Docker load 与 Docker import 的比较 描述:导入容器和导入镜像是差不多的但是实际上又是有所区别的
load:导入镜像存储文件到本地镜像库 而 import:导入一个容器快照到本地镜像库
容器快照:文件将丢失所有的历史记录和元数据信息(即保留容器当时的快照状态),导入的时候还需要重新制定标签等元数据信息;
镜像存储:文件将保存完整的记录,并且体积也要大;
总结:
容器的名称是唯一性的如果不指定名称,将会自动生成一个容器名称;
容器是直接提供应用服务的组件,也是Docker实现快速启停和高效服务器性能的基础
在生产环境中因为容器自身的轻量性,建议在容器前段引入HA(高可靠性)机制,当出现错误的时候能快速切换到其他容器之中,还能自动重启故障容器;
3.仓库 [Repository] 描述:Docker 仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所;该概念的引入为Docker镜像文件的分发和管理提供了便捷的途径。 仓库注册地址:https://hub.docker.com/ 安装帮助文档:http://www.widuu.com/docker/installation/ubuntu.html
注册服务器是存放仓库的地方,其上往往存放着多个仓库,每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签[TAG]来进行区分;
目前最大的公开仓库是 Docker Hub 存放了数量庞大的镜像提供用户下载
国内的公开仓库包括Docker Pool等等可以提供稳定的国内访问。
例如:对于仓库地址dl.dockerpool.com/ubuntu来说,dl.dockerpool.com是注册服务器,ubuntu是仓库名;
weiyigeek.top-仓库注册服务器
Docker 仓库分类:
公开仓库(Public)
私有仓库(Private)
官方与用户提供的镜像比较:
官方:centos 由Docker维护的基础或根镜像;
个人:user/centos 表示由user用户维护的centos基础镜像;
镜像仓库操作常用命令:1 2 3 4 5 6 7 8 9 docker login docker pull [repository] docker push [imges] $docker pull dl.dockerpool.com:5000/ubuntu:12.04 $docker images$docker tag dl.dockerpool.com:5000/ubuntu:12.04 ubuntu:12.04 $docker push dl.dockerpool.com:5000/ubuntu:12.04
(1)创建和使用私有仓库: 最快捷还是搭建本地的仓库服务器(注意:配置不当会导致漏洞)1 2 3 4 5 6 $ docker run -d -p 5000:5000 registry $ docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
此时会在本地启动一个私有仓库服务,监听端口为5000; 更新标签本地仓库地址并上传到私有仓库之中:
1 2 3 4 5 $docker tag ubuntu:14.04 10.0.2.2:5000/test $docker pull 10.0.2.2:5000/test $ curl http://10.0.2.2:5000/v1/search
(2)自动创建[Automated Builds] 该功能是对于需要经常升级镜像内程序来说十分的方便,用户创建镜像发生更改的时候进行手动更新镜像,并能通过自动创建功能跟踪目标网络,一旦项目发现新的提交则自动执行创建;配置自动创建步骤如下:
创建登录Docker Hub 绑定Github;
在Docker Hub中配置一个自动创建
选取一个目标网站中的项目(需要Dockerfile和分支)
指定Dockerfile的位置并提交创建,可以在”自动创建页面”跟踪每次创建的状态;
总结:
仓库管理镜像的设计理论与Git差不多,工作流程为文件分发和合作带来的众多优势。