一、Linux容器 概述
1.1、什么是 linux容器
Linux 容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。
容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
1.2、容器是虚拟化吗?
是,也不全是
虚拟化可以使许多操作系统可同时在单个系统上运行
容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开
Linux 容器可从单个操作系统运行,在所有容器中共享该操作系统,因此应用和服务能够保持轻量级,并行快速运行。
1.3、容器为什么受欢迎?
- 灵活:即使是最复杂的应用也可以集装箱化
- 轻量级:容器利用并共享主机内核
- 可互换:可以即时部署更新和升级
- 便捷式:可以在本地构建,部署到云,并在任何地方运行
- 可扩展:可以增加并自动分发容器副本
- 可堆叠:可以垂直和即时堆叠服务
二、Docker 概述
2.1、什么是 Docker
Docker 是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源,用于支持创建和使用 Linux 容器。
Docker是在linux容器里运行应用的开源工具,是一种轻量级的"虚拟机"
Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器
Docker通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的"一次封装,到处运行"的目的。这里的组件可以一个应用,也可以是一套服务,甚至是一个完整的操作系统
2.2、Docker 如何工作?
Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用程序,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。
容器工具(包括 Docker)可提供基于镜像的部署模式。这使得它能够轻松跨多种环境,与其依赖程序共享应用或服务组。Docker 还可在这一容器环境中自动部署应用程序(或者合并多种流程,以构建单个应用程序)。
此外,由于这些工具基于 Linux 容器构建,使得 Docker 既易于使用,又别具一格 —— 它可为用户提供前所未有的高度应用程访问权限、快速部署以及版本控制和分发能力。
2.3、namespace 的六项隔离
Docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作
| namespace | 系统调用参数 | 隔离内容 |
|---|---|---|
| UTS | CLONE_NEWUTS | 主机名与域名 |
| IPC | CLONE_NEWWWIPC | 信号量、消息队列和共享内存 |
| PID | CLONE_NEWPID | 进程编号 |
| NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 |
| MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
| USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
2.4、Docker 三大核心概念
Docker的三大核心概念:
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
Docker 的大部分操作都围绕着它的三大核心概念——镜像、容器和仓库而展开。因此,准确把握这三大核心概念对于掌握 Docker 技术尤为重要。
只有理解了这三个核心概念,才能顺利地理解 Docker 容器的整个生命周期。
2.4.1、镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可理解为一个面向Docker 容器引擎的只读模板
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容:包括代码、运行时间、库、环境变量和配置文件
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,他还包含了完整的操作系统。
2.4.2、容器
Docker 的容器是从镜像创建的运行实例。它可以被启动,停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
可以把容器看作是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序
2.4.3、仓库
Docker 仓库类似于代码仓库,它是 Docker 集中存放镜像文件的场所。当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(public)或私有仓库(private),当下次要在另外一台机器上使用这个镜像时,只需要从仓库提取就可以了
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker
三、Docker容器与传统虚拟机的区别
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
| 特性 | Docker容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 计算能力损耗 | 几乎无 | 损耗50%左右 |
| 性能 | 接近原生 | 弱于 |
| 系统支持量(单机) | 上千个 | 几十个 |
| 隔离性 | 资源隔离/限制 | 完全隔离 |
四、安装Docker (linux系统中)
4.1、关闭防火墙和selinux
systemctl stop firewalld.service
setenforce 0
4.2、安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
tips:
yum-utils:提供了 yum-config-manager 工具
device mapper:是linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2
4.3、设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.4、安装 Docker-ce 并设置为开机自动启动
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
五、Docker 镜像操作命令
5.1、镜像管理命令
5.1.1、搜索镜像
docker search 关键字(镜像名、仓库名)
docker search nginx
5.1.2、拉取(下载)镜像
docker pull 仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择为 latest 标签
docker pull nginx
5.1.3、查看本地镜像
docker images
5.1.4、查看某个镜像详细信息
docker inspect [镜像id号]
5.1.5、增加修改镜像名或标签
docker tag 原镜像名:原镜像标签 新镜像名:新镜像标签
5.1.6、删除镜像
docker rmi 镜像名:标签/镜像id号
5.1.6.1、批量删除镜像
5.1.7、导出镜像
docker save -o [导出文件名以.tar结尾] [镜像名:标签] ##### 导出镜像
5.1.8、导入镜像文件
docker load -i [镜像文件名]
docker load < [镜像文件名]
5.1.9、上传本地镜像到官方公有仓库
六、官方镜像加速(下载)
如上图:阿里云官网,按顺序点击"容器镜像服务ACR"
cd /etc/docker/
vim daemon.json
{
"registry-mirrors": ["https://2inm2ipl.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
6.1、Docker 相关的本地资源存放路径
6.1.1、本地容器资源存放路径
存放在 /var/lib/docker/ 下
6.1.2、存放容器相关信息的路径
/var/lib/docker/containers/
6.1.3、存放镜像相关信息的路径
/var/lib/docker/image/
6.1.4、存放镜像底层文件的路径
/var/lib/docker/overlay2/
七、Docker 容器操作命令
7.1、容器管理命令
7.1.1、创建容器
创建容器:就是将镜像加载到容器的过程
新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器
格式:docker create [选项] [--name=容器名称]镜像名
常用选项:
- -i 让容器开启标准输入
- -t 让Docker 分配一个伪终端 tty
- -it 合起来实现和容器交互的作用,运行一个交互式会话 shell
- --name 指定容器的名称
例如:docker create -it nginx:latest /bin/bash
7.1.2、启动容器
docker start 容器id/容器名称
7.1.3、退出容器
docker stop 容器id/容器名称
7.1.4、删除容器
docker rm 容器id/容器名称 [-f]
-f:对于正在运行的容器,进行强删
7.1.4.1、批量删除容器
7.1.5、查看容器
7.1.5.1、查看当前运行的容器
docker ps 容器id/名称
7.1.5.2、查看当前运行的所有容器
docker ps -a
7.1.5.3、查看当前所有容器的id号
docker ps -aq