Docker总结
1. 概述
本文介绍Docker的相关知识,重点是Docker的3大核心:镜像、容器、仓库
2. Docker的介绍
- Docker 是世界领先的软件容器平台
- Docker 使用 Google 公司推出的 Go 语言进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其他的隔离的进程,因此也称其为容器。Docke 最初实现是基于 LXC
- Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件
- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样
Docker 设计时,充分利用 Union FS 的技术,将其设计为分层存储的架构
3. Docker的思想
- 集装箱:将所有需要的内容放到不同的集装箱中,谁需要某些内容(环境)就直接拿对应的集装箱就行了
- 标准化:
- 运输的标准化:Docker有一个码头,所有上传的集装箱都放在这个码头上,当有人需要某一个环境时,就直接派 小蓝鲸 去搬运这个集装箱就行
- 命令的标准化:Docker提供了一系列命令,帮助我们去获取集装箱的相关操作
- 提供了REST的API:衍生出了很多图形化界面,如: Rancher
- 隔离性:Docker在运行集装箱里的内容时,会在Linux的内核中,单独开辟一片空间,这片空间不会影响到其他程序
- 中央仓库/注册中心:超级码头,上面放的都是集装箱
- 镜像:就是集装箱
- 容器:运行起来的镜像(就是将软件打包成标准化单元,以用于开发、交付和部署。通俗的描述就是:容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样)
4. 容器 VS 虚拟机
容器是一个应用层抽象,用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。 与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动
虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。管理程序允许多个 VM 在一台机器上运行。 每个 VM 都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且VM启动也十分缓慢
5. Docker的安装
- 安装依赖包
|
|
- 指定Docker镜像源
|
|
- 安装Docker
|
|
- 启动Docker
|
|
6. Docker中央仓库
Docker官方的中央仓库:(这个仓库的镜像是最全的,但下载速度较慢)
https://hub.docker.com/国内的镜像网站:
镜像构建完成后,可以在当前宿主机上运行,但是,如果需要在其他服务器上使用这个镜像,就需要一个集中存储、分发镜像的服务,Docker Registry 就是这样的服务
一个 Docker Registry 中可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag);每个标签对应一个镜像
通常,一个仓库会包含同一个软件的不同版本的镜像,而标签就常用于对应该软件的各个版本
-
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务
一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像
-
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务
开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 Docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能
7. 镜像
操作系统分为内核和用户空间,对于Linux而言,内核启动后,会挂载root文件系统为其提高用户空间的支持,而Docker镜像就相当于是一个root文件系统
Docker镜像除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数,如:匿名卷、环境变量、用户
镜像不包含任何动态数据,其内容在构建之后也不会改变
镜像构建时,会 一层一层构建 ,前一层是后一层的基础,每一层构建完成后就不会再发生变化,后一层的任何改变都只发生在自己这一层
- 拉取镜像(从中央仓库拉取镜像到本地)
|
|
- 查看本地全部镜像(查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小)
|
|
- 删除本地镜像(镜像会占用磁盘空间,可以直接收到删除)
|
|
- 镜像的导入导出
|
|
8. 容器
运行起来的镜像
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类和实例 一样
镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
容器的实质是进程 ,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化
所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失
- 运行容器(运行容器需要制定具体镜像,如果镜像不存在,会直接下载)
|
|
- 查看正在运行的容器
|
|
- 查看容器日志(查看容器的日志,以查看运行的信息)
|
|
- 进入容器内部(可以进入容器内部进行操作)
|
|
- 复制内容到容器(将宿主机的文件复制到内部的指定目录)
|
|
- 重启/启动/停止/删除容器(容器的启动、停止、删除等操作会经常用到)
|
|
9. Docker的应用
- Docker安装Tomcat
|
|
- Docker安装MySQL
|
|
10. 数据卷
Docker容器删除后,在容器中产生的数据也会随之销毁
Docker容器和外部机器可以直接交换文件吗?
容器之间想要进行数据交互?
数据卷:
数据卷是宿主机中的一个目录或文件
当容器目录和数据卷目录绑定后,对方的修改会立即同步
一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷
- 创建数据卷(创建数据卷后,默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data)
|
|
- 查看数据卷详情(查看数据卷的详细信息,可以查询到存放路径,创建时间等)
|
|
- 查看全部数据卷
|
|
- 删除数据卷
|
|
- 容器映射数据卷
映射有两种方式:
通过数据卷名称映射,如果数据卷不存在,Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径
通过路径映射数据卷,直接指定一个路径作为数据卷的存放位置,但是这个路径下是空的
|
|
11. Dockerfile自定义镜像
我们可以从中央仓库下载一个镜像,也可以自己手动去制作一个镜像,需要通过Dockerfile去指定自定义镜像信息
https://www.bilibili.com/video/BV1Pi4y1R7Pn/?spm_id_from=333.337.search-card.all.click
12. Docker-Compose
之前运行一个镜像,需要添加大量的参数,可以通过Docker-Compose编写这些参数
而且Docker-Compose可以帮助我们批量的管理容器这些信息只需要通过一个docker-compose.yml文件去维护即可
12.1 下载安装Docker-Compose
- 下载Docker-Compose
- 设置权限(需要将DockerCompose文件的名称修改一下,给予DockerCompose文件一个可执行权限)
|
|
- 配置环境变量(方便后期操作,配置一个环境变量)
|
|
- 测试(在任意目录下输入docker-compose命令)
12.2 Docker-Compose管理MySQL和Tomcat容器
yml文件以 key:value 方式来指定配置信息
多个配置信息以换行+缩进的方式来区分在docker-compose.yml文件中,不要使用制表符
|
|
12.3 使用docker-compose命令管理容器
使用docker-compose命令时,默认会在当前目录下找docker-compose.yml文件
|
|
12.4 docker-compose配合Dockerfile使用
使用docker-compose.yml文件以及Dockerfile文件在生成自定义的镜像的同时启动当前镜像,并且由docker-compose去管理容器
- docker-compose文件(编写docker-compose.yml文件)
|
|
- Dockerfile文件(编写Dockerfile)
|
|
- 运行(测试效果)
|
|
13. 总结
本文主要把 Docker 中的一些常见概念做了详细的阐述