一、Docker概述
1.什么是Docker
是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源;
是在Linux容器里运行应用的开源工具;
是一种轻量级的“虚拟机”;
Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker的设计宗旨:"Build Ship and Run Any App,Anywhere",即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的"一次封装,到处运行"的目的。这里的组件,既可以是一个立用,也可以是一套服务,甚至是一个完整的操作系统。
2.容器化流行的原因
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可维叠:可以垂直和即时维叠服务。
3.Docker和虚拟机的区别
容器:是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机:运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
特性 | Docker容器 | 虚拟机 |
---|---|---|
内核 | 共享宿主机内核 | 独立操作系统内核 |
启动速度 | 快(秒级) | 慢(分钟级) |
计算能力损耗 | 几乎无损耗 | 损耗20%~50% |
性能 | 接近原生 | 弱于宿主机 |
系统支持量 | 上千个 | 几十个 |
隔离性 | namespace资源隔离、cgroup限制 | 完全隔离 |
容器在内核中支持2种重要技术
(1)docker本质就是宿主机的一个进程,通过namespace实现资源隔离;通过cgroup实现资源限制。
(2)通过写时复制技术(copy-on-write)实现了高效的文件操作。(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g,只有当需要修改时才复制一份数据)
4.Docker核心概念
(1)镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
(2)容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。可以把容器看做是一个简易版的linux环境〈包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
(3)仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker
二、安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
#yum-utils:提供了 yum-config-manager 工具。
#device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
#device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable --now docker
三、镜像管理
1.搜索镜像
docker search 仓库名/镜像名
2.下载(拉取)镜像
docker pull 仓库名/镜像名:标签
可以登录阿里云,配置国内镜像源
执行以上命令
3.查看已下载镜像
docker images # -q 选项可以过滤镜像ID号
注: latest只是代表当前最新版本;如果下载了相同的镜像,ID号也会相同
4.查看镜像详细信息
docker inspect 镜像ID
5.修改镜像标签
docker tag 原仓库名/原镜像名:原标签 新仓库名/新镜像名:新标签
注:修改标签后显示的镜像,不会删除原有镜像,两个镜像文件是同一个的所以ID也相同
6.删除镜像
docker rmi 仓库名/镜像名:标签
镜像ID
针对存在相同ID的镜像,使用标签和ID删除有以下情况
删除所有镜像可以使用 docker rmi $(docker images -q)
7.导出镜像文件和拉取本地镜像文件
(1)导出镜像文件
docker save -o xxx.tar 仓库名/镜像名:标签 #默认导出到当前目录
(2)拉取本地镜像文件
docker load -i xxx.tar # -i 也可以使用 < 替换
8.上传镜像到公有仓库
首先访问hub.docker.com,登录(注册)docker官方网站
docker login #输入账户名和密码,登录官网
docker push 账户名/镜像名 #上传自用镜像
四、容器管理
1.创建容器
容器创建就是将镜像加载到容器的过程。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
docker create [选项] 镜像名
--name=容器名
-i 让容器开启标准输入接受用户输入命令
-t 让 Docker 分配一个伪终端 tty
-it 合起来实现和容器交互的作用,运行一个交互式会话 shell
2.开启容器
docker start 容器名或ID
3.关闭容器
分为优雅停止和强制停止,强制停止区别于优雅停止的是状态码不同,强制停止可能造成数据异常,在特点状况下使用。
(1)优雅停止
docker stop 容器名或ID
(2)强制停止
docker kill 容器名或ID
4.查看容器状态信息
docker ps #默认查看开启的容器
-a #查看所有存在的容器
-q #显示容器ID
创建时
开启后
优雅停止后
强制停止后
只显示ID
字段名 | 含义 |
---|---|
CONTAINER ID | 容器ID号 |
IMAGE | 镜像名 |
COMMAND | 启动容器执行的命令(镜像已经定义好,可以通过docker inspect 镜像查看到,如果在创建容器的命令后面跟上命令,会覆盖这个默认执行的命令) |
CREATED | 创建时间(相对于现在) |
STATUS | 容器状态(创键、开启、关闭) |
PORTS | 容器映射的端口 |
NAMES | 容器名称(使用--name指定的,未指定系统会自动创建) |
5.删除容器
docker rm 容器名或ID
6.进入容器
docker exec -it 容器名或ID sh
7.复制文件
(1)从容器中复制到主机
docker cp 容器名或ID:文件路径 主机文件路径
(2)从主机复制到容器
docker cp 主机文件路径 容器名或ID:文件路径
8.创建并启动容器(替代1和2)
docker run 容器名或ID [指定命令] #等同于先执行 docker create 命令,再执行 docker start 命令,之后默认执行镜像定义的命令,也可以自己指定命令,命令执行完则退出。
-d #后台运行
注意:容器是一个与其中运行的 shell 命令/进程共存亡的终端,命令/进程运行容器运行, 命令/进程结束容器退出。
docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是
- 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
- 利用镜像创建并启动一个容器;
- 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
- 分配一个地址池中的 IP 地址给容器;
- 执行用户指定的应用程序,执行完毕后容器被终止运行。
可以使用死循环使某些容器(如centos操作系统)持续运行
打开另一个终端查看,处于运行中,也能进入此包含centos操作系统的容器执行操作
但是使用死循环持续运行会占用前台,所以直接使用-d选项
9.容器的导入和导出
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为容器快照文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
(1)导出
docker export 容器ID/名称 > 文件名
docker export -o 容器ID/名称 文件名
(2)导入
注意:导入后会生成镜像,但不会创建容器
docker import 文件名 --镜像名:标签