前言
在软件开发和部署环境中,使用 Docker 等容器技术可以帮助团队实现快速、一致、可靠的应用程序部署,提高开发效率和应用程序的可移植性。
目录
一、虚拟化产品介绍
1. 云服务模型
1.1 IaaS
1.2 PaaS
1.3 SaaS
1.4 DaaS
2. 产品介绍
2.1 虚拟机架构
2.2 虚拟化技术分类
3. KVM 与 ESXI
3.1 KVM
3.2 ESXI
二、Docker 介绍
1. 概述
2. 容器的特点
3. Docker 与虚拟机的区别
4. 容器技术有哪些
5. 容器在内核中支持两种重要技术
5.1 命名空间(Namespaces)
5.2 控制组(Cgroups)
5.3 namespace 的六项隔离
6. Docker 核心概念
6.1 镜像
6.2 容器
6.3 仓库
三、Docker 部署
1. yum 安装
1.1 安装依赖包
1.2 设置阿里云镜像源
1.3 安装 Docker-CE 并设置为开机自动启动
1.4 查看 docker 相关信息
2. 二进制安装
2.1 下载 tar 包
2.2 systemd 管理
2.3 镜像加速
四、Docker 镜像操作
1. 搜索镜像
2. 获取镜像
3. 镜像加速下载
4. 查看镜像信息
5. 获取镜像详细信息
6. 为本地的镜像添加新的标签
7. 删除镜像
8. 存出存入镜像
9. 上传镜像
五、Docker 容器操作
1. 容器创建
2. 查看容器的运行状态
3. 启动容器
4. 创建并启动容器
5. 容器的进入
6. 容器的生命周期
7. 宿主机与容器文件传输
8. 容器的导出与导入
9. 删除容器
一、虚拟化产品介绍
1. 云服务模型
1.1 IaaS
基础设施即服务。提供基础的计算机资源,如虚拟机、存储和网络等,用户可以通过云服务提供商的平台管理这些基础设施。
1.2 PaaS
平台即服务。提供完整的开发环境,包括开发工具、数据库、中间件等,使开发人员可以快速构建、部署和管理应用程序,减少了对基础设施的管理负担。
1.3 SaaS
软件即服务。提供基于互联网的软件应用程序,用户可以通过 Web 浏览器访问和使用这些应用程序,而无需安装和维护软件。SaaS 提供商通常负责应用程序的运行、维护和安全性,用户只需按照订阅模式付费即可使用。
1.4 DaaS
数据即服务。用户可以通过云服务提供商的平台访问和处理数据。DaaS可以帮助组织更好地管理和利用数据资源,支持数据的存储、备份、分析和共享等功能。
2. 产品介绍
2.1 虚拟机架构
① 寄居架构
本机(真实的操作系统)——> 虚拟化产品 ——> 虚拟化操作系统或软件
② 源生架构
拿一台服务器(裸金属服务器),直接装虚拟化产品
2.2 虚拟化技术分类
① 仿真虚拟化:对系统硬件没有要求,性能最低
VMware 客户端
- VMware workstation:个人在 Windows 安装的虚拟机
- VMware Fusion:个人在苹果系统安装的虚拟机
② 半虚拟化:虚拟机,可以使用真机(物理机)
RHEL 5 作为操作系统可以在这些虚拟化平台上运行,自带 xen 虚拟机监视器,并通过半虚拟化驱动优化性能。
微软 Microsoft Hyper-V:
- 是微软推出的一种虚拟化平台,可在 Windows Server 操作系统上安装并运行多个虚拟机实例。
VirtualBox:
- 是由 Oracle 开发的开源虚拟化软件,可在多个操作系统上运行,包括 Windows、Linux、macOS 等。
Citrix Hypervisor:
- 是由Citrix Systems开发的虚拟化平台,可用于服务器虚拟化和云计算环境。 Hypervisor 层直接调用虚拟机产品调用资源。
③ 全虚拟化:直接使用物理硬件,性能高
KVM、openstack
KVM是一种虚拟化技术,而OpenStack是一个云计算平台,二者可以结合使用,通过KVM提供虚拟化基础设施,然后在OpenStack上部署和管理虚拟化资源。
- KVM(Kernel-based Virtual Machine)是一种基于Linux内核的开源虚拟化技术,允许将Linux内核转变为一个类型 1 的虚拟机监视器
- OpenStack 是一个私有云环境,是一个开源的云计算平台,提供各种云计算服务,包括计算、存储、网络等,以及管理这些服务的工具和接口
VMware 服务器,ESXI 企业级虚拟化产品,全称 VMware vsphere 裸金属服务器;全虚拟化,直接使用物理硬件,性能高。
- 以前可以用客户端连接
- 现企业使用网页端连接——VMware vsphere
3. KVM 与 ESXI
3.1 KVM
KVM 是一个开源的虚拟化解决方案,集成在内核中,性能受宿主操作系统影响。调用 Linux 内核来完成的功能和性能,运行在 Linux 环境中。
KVM 基于内核,通过控制器统筹管理调用软件层 hypervisor 虚拟机,软件层类似于一个抽象层,再调用 QEMU 组件(可以理解为 I/O 控制模块,调用硬件设备,来完成CPU、内存、硬盘的逻辑划分)生成一个 VM 虚拟机,完成 KVM 的逻辑分割。
3.2 ESXI
ESXI 是由 VMware 开发的一种虚拟化平台,是 VMware vSphere 产品套件的一部分,通过 VMware vSphere 客户端或者网页端连接。VMware vSphere 提供了管理功能和可视化界面,虚拟机直接访问硬件资源,性能更换,运行在企业级环境。
ESXI 是裸金属之上安装的虚拟化产品,首先需要在服务器上安装 ESXI 操作系统,然后使用客户端或网页端连接登录该 ESXI 操作系统,系统层会调用硬件服务器中的配置来创建虚拟机。一旦虚拟机创建完成,ESXI 负责将物理服务器的资源(CPU、内存、存储、网络)划分和分配给虚拟机。
总之:
KVM 和 ESXI 都是虚拟化技术,用于创建和管理虚拟机;提供虚拟环境,允许单个物理服务器上运行多个虚拟机示例。KVM 是一个开源的虚拟化解决方案,集成在 Linux 内核中,适合需要灵活性和定制化的场景;而 ESXi 是 VMware 的专有虚拟化产品,适合企业级应用和虚拟化环境。
二、Docker 介绍
1. 概述
Docker 是一个开源的应用容器引擎,是在 Linux 容器里运行应用的开源工具,是一种轻量级的“虚拟机”。Docker 是一种容器化技术,将应用及其依赖项打包成一个镜像包打包到一个容器中,在任何环境中运行应用程序;与虚拟机不同:容器共享主机操作系统的内核,更加轻量和灵活。
Docker 容器可以被看做运行在宿主机上的一个进程,容器共享宿主机内核。通过 namespace(命名空间、名称)资源隔离,通过 cgroup (资源配额)去限制资源。
2. 容器的特点
① 灵活:即使是最复杂的应用也可以集装箱化。
② 轻量级:容器利用并共享主机内核。
③ 可互换:可以即时部署更新和升级。
④ 便携式:可以在本地构建,部署到云,并在任何地方运行。
⑤ 可扩展:可以增加并自动分发容器副本。
⑥ 可堆叠:可以垂直和即时堆叠服务。
3. Docker 与虚拟机的区别
特性 | Docker容器 | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
4. 容器技术有哪些
① Docker
Docker 是一种流行的容器化平台,允许开发人员打包应用程序及其依赖项到轻量级容器中,实现跨平台部署和运行。
② Podman
Podman 是一个与 Docker 兼容的容器引擎,由Red Hat开发,旨在提供更安全、更轻量级的容器解决方案;Podman 不需要守护进程,使用普通用户权限即可运行容器。
③ Kubernetes(K8s)
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
④ LXC
LXC 是一种基于Linux内核的容器化技术,允许在单个Linux系统上运行多个隔离的用户空间环境。
⑤ CRI-O
CRI-O 是一个轻量级的容器运行时,专门为 Kubernetes 设计。
⑥ Apache Mesos
Apache Mesos 是一个开源的分布式系统内核,用于实现资源管理和任务调度,支持容器化应用程序的部署和扩展。是一个容器编排平台。
5. 容器在内核中支持两种重要技术
5.1 命名空间(Namespaces)
命名空间是 Linux 内核提供的一种机制,用于隔离系统资源,使得每个容器拥有自己独立的命名空间。通过命名空间,容器可以拥有自己的进程树、网络、文件系统等资源,实现资源的隔离和独立性。
5.2 控制组(Cgroups)
控制组是 Linux 内核提供的另一种机制,用于限制和管理系统资源的使用。通过控制组,可以对容器的资源使用进行限制,如 CPU、内存、磁盘等,确保容器在共享主机资源的情况下能够按需分配和管理资源。
Docker 本质就是宿主机的一个进程,docker 是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作。
5.3 namespace 的六项隔离
这些命名空间的隔离机制使得容器可以在共享主机资源的情况下实现隔离和独立性,确保容器之间互不干扰,提高系统的安全性和稳定性。
namespace | 系统调用参数 | 隔离内容 |
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
6. Docker 核心概念
6.1 镜像
Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。Docker 镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。
6.2 容器
Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。可以把容器看做是一个简易版的 linux 环境(包括 root 用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
6.3 仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker。
三、Docker 部署
官方地址下载 rpm 包
Index of linux/centos/7/x86_64/stable/Packages/ (docker.com)
阿里云地址下载
docker-ce-linux-centos-7-x86_64-stable-Packages安装包下载_开源镜像站-阿里云 (aliyun.com)
1. yum 安装
1.1 安装依赖包
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-utils: 是一组用于增强和扩展Yum功能的实用程序集合,包含了一些高级的包管理工具,如下载镜像、创建repo文件等
# device-mapper-persistent-data: 是Device Mapper持久化数据存储支持包,常用于LVM(Logical Volume Manager)和DM(Device Mapper)相关的存储管理
# lvm2: 是第二代逻辑卷管理器(Logical Volume Manager version 2)的软件包,用于提供灵活的磁盘存储管理,可以在多个物理硬盘之间动态创建、调整和删除逻辑卷
1.2 设置阿里云镜像源
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.3 安装 Docker-CE 并设置为开机自动启动
[root@localhost ~]# yum install -y docker-ce docker-ce-cli containerd.io
# docker-ce:这是Docker的核心组件,包含Docker引擎,用于运行容器
# docker-ce-cli:这是Docker命令行工具,用于与Docker守护进程交互,进行容器的管理操作
# containerd.io:这是一个更底层的容器运行时,是Docker的重要依赖,负责容器的生命周期管理,如容器的启动、停止、资源隔离等
[root@localhost ~]# systemctl start docker.service
[root@localhost ~]# systemctl enable docker.service
1.4 查看 docker 相关信息
[root@localhost ~]# docker version # 查看docker版本信息
Client: Docker Engine - Community
Version: 26.0.2
……
[root@localhost ~]# docker info # docker信息查看
2. 二进制安装
2.1 下载 tar 包
wget https://download.docker.com/linux/static/stable/x86_64/docker-26.0.2.tgz
tar xzvf docker-26.0.2.tgz # 解压安装包
cp docker/* /usr/bin/ # 将二进制文件移动到可执行路径上的目录
dockerd & # 启动
2.2 systemd 管理
vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start docker.service
2.3 镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
四、Docker 镜像操作
1. 搜索镜像
格式:
docker search 关键字
示例:
[root@localhost ~]# docker search nginx
2. 获取镜像
格式:
docker pull 仓库名称/镜像名称[:标签]
示例:
[root@localhost ~]# docker pull nginx
Using default tag: latest # 不指定标签,即为 latest
3. 镜像加速下载
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录获取镜像加速器配置
[root@localhost ~]# mkdir -p /etc/docker
使用指定的镜像仓库地址作为Docker Registry的镜像加速器:
tee /etc/docker/daemon.json <<-'EOF'
# /etc/docker/daemon.json是Docker的守护进程(daemon)的配置文件。在Docker中,守护进程负责管理 Docker服务,并接受来自Docker客户端的请求,执行相应的操作
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
# 指定了一个阿里云的镜像加速地址
}
EOF
[root@localhost ~]# systemctl daemon-reload # 重新加载Systemd守护进程的配置文件
[root@localhost ~]# systemctl restart docker
4. 查看镜像信息
Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件:
[root@localhost ~]# cd /var/lib/docker/
[root@localhost docker]# ls
buildkit containers engine-id image network overlay2 plugins runtimes swarm tmp volumes
# buildkit:存储与 Docker BuildKit 构建工具相关的数据和配置信息,用于支持 Docker 镜像的构建过程
# containers:存储 Docker 容器的相关信息,包括容器的元数据、配置信息等
# engine-id:存储 Docker 引擎的唯一标识符,用于标识不同的 Docker 引擎实例
# image:存储 Docker 镜像的相关信息,包括已下载的镜像、镜像层等
# network:存储 Docker 网络的相关信息,包括网络配置、网络状态等
# overlay2:存储 Docker 存储驱动 Overlay2 的数据,用于存储容器的文件系统层
# plugins:存储 Docker 插件的相关信息,用于扩展 Docker 功能的插件
# runtimes:存储 Docker 容器运行时的相关信息,包括容器运行时的配置、状态等
# swarm:存储 Docker Swarm 的相关信息,用于支持 Docker 集群管理功能
# tmp:临时目录,用于存储临时文件和数据
# volumes:存储 Docker 卷的相关信息,包括卷的配置、数据等
[root@localhost ~]# cat /var/lib/docker/image/overlay2/repositories.json
# 查看下载的镜像文件信息
{"Repositories":{"nginx":{"nginx:latest":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580","nginx@sha256:0463a96ac74b84a8a1b27f3d1f4ae5d1a70ea823219394e131f5bf3536674419":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580"}}}
[root@localhost ~]# docker images # 查看下载到本地的所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 5 days ago 188MB
# REPOSITORY:镜像属于的仓库;
# TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
# IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
# CREATED:镜像创建时间;
# VIRTUAL SIZE:镜像大小;
5. 获取镜像详细信息
格式:
docker inspect 镜像ID号
示例:
[root@localhost ~]# docker inspect 2ac752d7aeb1
# 如果跟容器ID可以查看到容器的ip等信息
6. 为本地的镜像添加新的标签
格式:
docker tag 源仓库名/源镜像名:[标签] 新仓库名/新镜像名:[新标签]
示例:
[root@localhost ~]# docker tag nginx:latest nginx:web
[root@localhost ~]# docker images | grep nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 5 days ago 188MB
nginx web 2ac752d7aeb1 5 days ago 188MB
# 在Docker中,docker tag 命令不是用来修改镜像的实际内容,而是给现有的镜像创建一个新的标签(tag)。
7. 删除镜像
格式:
docker rmi 仓库名称/镜像名称:标签 # 当一个镜像有多个标签时,只是删除其中指定的标签
或者
docker rmi 镜像ID号 # 会彻底删除该镜像
# 注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像
示例:
[root@localhost ~]# docker rmi nginx:web
Untagged: nginx:web
[root@localhost ~]# docker images | grep nginx
nginx latest 2ac752d7aeb1 5 days ago 188MB
8. 存出存入镜像
① 存出镜像
将镜像保存成为本地文件:
格式:
docker save -o 存储文件名(也可以写成xxx.tar) 仓库名/镜像名:标签
示例:
[root@localhost ~]# docker save -o nginx nginx:latest
[root@localhost ~]# ll -h | grep nginx
-rw-------. 1 root root 183M 4月 22 23:41 nginx
② 载入镜像
将镜像文件导入到镜像库中:
格式:
docker load < 存出的文件 或者:docker load -i 存出的文件
示例:
docker load < nginx 或者:docker load -i nginx
9. 上传镜像
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
[root@localhost ~]# docker tag nginx:latest fangqianling/nginx:web
# 添加新的标签时必须在前面加上自己的dockerhub的username
docker login # 登录公共仓库
Username:用户名
password:密码
或者:
login {-u 仓库用户名 -p 密码}
[root@localhost ~]# docker push fangqianling/nginx:web # 上传镜像
访问https://hub.docker.com/查看Tags # 需要科学上网
五、Docker 容器操作
1. 容器创建
就是将镜像加载到容器的过程。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
格式:docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell # 一般直接合起来用
[root@localhost ~]# docker create -it nginx:latest /bin/bash
# /bin/bash: 这是容器启动后执行的命令。这里指定的是启动一个Bash shell,这意味着当你启动这个容器时,你会进入一个Bash Shell环境,而不是直接启动Nginx服务
2. 查看容器的运行状态
[root@localhost ~]# docker ps -a # -a 选项可以显示所有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1867e92522e6 nginx:latest "/docker-entrypoint.…" About a minute ago Created admiring_sammet
容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称
3. 启动容器
格式:
docker start 容器的ID/名称
[root@localhost ~]# docker start 1867e92522e6
1867e92522e6
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1867e92522e6 nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 22 seconds 80/tcp admiring_sammet
4. 创建并启动容器
可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。
在 Docker 中,容器中的第一个进程(PID=1)通常被视为容器的主进程。如果这个主进程退出,Docker 容器会认为其主进程已经停止运行,从而导致容器退出。这也意味着在 Docker 容器中应该运行一个守护进程或者类似的长期运行的进程,以确保容器保持运行状态。
举例说明:
[root@localhost ~]# docker run -d --name t1 nginx:latest /bin/bash
d15f2192a21e812c7cad0f255ef98ae902477eae7bf09c14ca01467f2dd52521
[root@localhost ~]# docker run -d --name t2 -p 10000:80 nginx
149613f7406b12de516c5a81a5c5cb5564501ffc71d5a1a5d4648f745747ec4b
[root@localhost ~]# docker run -itd --name t3 centos:7 /bin/bash
76bdc79e0e95272859174cfe68edcea2b24675ed549b43a901a20852c868dd86
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76bdc79e0e95 centos:7 "/bin/bash" 8 seconds ago Up 7 seconds t3
149613f7406b nginx "/docker-entrypoint.…" 30 seconds ago Up 30 seconds 0.0.0.0:10000->80/tcp, :::10000->80/tcp t2
d15f2192a21e nginx:latest "/docker-entrypoint.…" 38 seconds ago Exited (0) 38 seconds ago t1
# 容器t1在启动时执行了/bin/bash命令,当这个命令执行完毕后,容器就会自动退出,因为在Docker中,容器的主进程(PID=1,守护进程)结束后,容器就会停止
当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
- 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
- 利用镜像创建并启动一个容器;
- 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
- 分配一个地址池中的 IP 地址给容器;
- 执行用户指定的应用程序,执行完毕后容器被终止运行。
[root@localhost ~]# docker run centos:7 /usr/bin/bash -c ls /
# docker run:在docker中运行一个容器
# centos:7 名称:标签,是一个镜像
# /usr/bin/bash:启动的shell
# -c:后面的字符串作为命令
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a226e89f007 centos:7 "/usr/bin/bash -c ls…" 2 minutes ago Exited (0) 2 minutes ago quirky_pare
1867e92522e6 nginx:latest "/docker-entrypoint.…" 12 minutes ago Up 8 minutes 80/tcp admiring_sammet
# 此时会发现创建了一个新容器并启动执行一条shell命令,之后就停止了
在后台持续运行 docker run 创建的容器:
[root@localhost ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
49656 root 20 0 11692 1112 932 R 97.7 0.1 0:52.62 bash
# 写了死循环可以看到cpu升高
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c25551aaf88 centos:7 "/usr/bin/bash -c 'w…" About a minute ago Up About a minute wonderful_elbakyan
创建容器并持续运行容器:
[root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash
# --name test1:给容器指定一个名称为 test1
d226e95966f3e3f8e429c049efa8385f08109ce735e64b105d0508522b74f40c
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d226e95966f3 centos:7 "/bin/bash" 5 seconds ago Up 4 seconds test1
8a226e89f007 centos:7 "/usr/bin/bash -c ls…" 7 minutes ago Exited (0) 7 minutes ago quirky_pare
1867e92522e6 nginx:latest "/docker-entrypoint.…" 17 minutes ago Up 13 minutes 80/tcp admiring_sammet
终止容器运行:
格式:docker stop 容器的ID/名称
[root@localhost ~]# docker stop 4c25551aaf88
5. 容器的进入
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。进入容器前,确保容器正在运行。
格式:
docker exec -it 容器ID/名称 /bin/bash
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d226e95966f3 centos:7 "/bin/bash" 11 minutes ago Up 11 minutes test1
1867e92522e6 nginx:latest "/docker-entrypoint.…" 28 minutes ago Up 25 minutes 80/tcp admiring_sammet
[root@localhost ~]# docker exec -it test1 /bin/bash
[root@d226e95966f3 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@d226e95966f3 /]# exit
exit
6. 容器的生命周期
① created:已创建,还未运行的容器
② running:正在运行的容器
③ restarting:容器正在重启中
④ removeing:容器正在迁移中
⑤ paused:已暂停状态的容器,挂起
⑥ exited:停止状态的容器
⑦ dead:死亡,主要是操作系统出现异常或断电关机等有可能引发dead状态,不常见
7. 宿主机与容器文件传输
① 宿主机复制到容器中
echo abc123 > ~/test.txt
[root@localhost ~]# docker cp ~/test.txt d226e95966f3:/opt/
Successfully copied 2.05kB to d226e95966f3:/opt/
[root@localhost ~]# docker exec -it test1 /bin/bash
[root@d226e95966f3 /]# cat /opt/test.txt
abc123
② 从容器复制文件到主机
[root@localhost ~]# docker cp d226e95966f3:/opt/test.txt ~/newtest.txt
Successfully copied 2.05kB to /root/newtest.txt
[root@localhost ~]# cat newtest.txt
abc123
8. 容器的导出与导入
导出与导入操作是对整个容器文件系统的打包和解压,不包含容器的元数据,适合用于简单的文件系统导出和导入。导出相当于迁移,容器内的数据可以保存到镜像中。
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
① 导出
导出格式:
docker export 容器ID/名称 > 文件名
[root@localhost ~]# docker export d226e95966f3 > centos7.tar
[root@localhost ~]# scp centos7.tar 192.168.190.108:/opt
② 导入
导入格式:
cat 文件名 | docker import – 镜像名称:标签
[root@localhost ~]# cd /opt
[root@localhost opt]# cat centos7.tar | docker import - centos7:test
sha256:7d96c1a4df3aa8393fc6a6be522bc594d7d92d6997af1aa39b2095710ee72e63
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 test 7d96c1a4df3a 22 seconds ago 204MB
# 导入后会生成镜像,但不会创建容器
创建并启动容器,进入容器查看是否存在迁移的数据:
[root@localhost opt]# docker run -itd centos7:test /bin/bash
3ddbcad05908a18d4e46e143db7b488d2670af35706cd29db282db37ae6cc5e6
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ddbcad05908 centos7:test "/bin/bash" 2 seconds ago Up 1 second naughty_williamson
[root@localhost opt]# docker exec -it 3ddbcad05908 /bin/bash
[root@3ddbcad05908 /]# cat /opt/test.txt
abc123
9. 删除容器
格式:
docker rm [-f] 容器ID/名称
docker stop 容器ID/名称
docker rm 容器ID/名称 #删除已经终止状态的容器
docker rm -f 容器ID/名称 #强制删除正在运行的容器
示例:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c25551aaf88 centos:7 "/usr/bin/bash -c 'w…" 51 minutes ago Exited (137) 49 minutes ago wonderful_elbakyan
d226e95966f3 centos:7 "/bin/bash" 53 minutes ago Up 53 minutes test1
8a226e89f007 centos:7 "/usr/bin/bash -c ls…" About an hour ago Exited (0) About an hour ago quirky_pare
1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet
[root@localhost ~]# docker rm 4c25551aaf88
4c25551aaf88
[root@localhost ~]# docker rm 8a226e89f007
8a226e89f007
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d226e95966f3 centos:7 "/bin/bash" 59 minutes ago Up 59 minutes test1
1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet
① 批量停止容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
# docker stop后面加空格是为了确保在拼接命令时,docker stop和容器的ID之间有一个空格
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
示例:
[root@localhost ~]# docker run -itd --name test2 centos:7 /bin/bash
f7bcc1a52b45c0f35da8f15645d099ccd1d9bcbfe15515784bb4b189a144cb0e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7bcc1a52b45 centos:7 "/bin/bash" 3 seconds ago Up 2 seconds test2
d226e95966f3 centos:7 "/bin/bash" About an hour ago Up About an hour test1
1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet
[root@localhost ~]# docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
f7bcc1a52b45
d226e95966f3
1867e92522e6
# NR>=2 表示从第二行开始处理
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7bcc1a52b45 centos:7 "/bin/bash" 3 minutes ago Exited (137) About a minute ago test2
d226e95966f3 centos:7 "/bin/bash" About an hour ago Exited (137) About a minute ago test1
1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Exited (137) About a minute ago admiring_sammet
② 批量删除所有容器
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
# docker rm后面加空格是为了确保在拼接命令时,docker rm和容器的ID之间有一个空格
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
示例:
[root@localhost ~]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
f7bcc1a52b45
d226e95966f3
1867e92522e6
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
③ 批量清理后台停止的容器
docker rm [-f] $(docker ps -a -q)
docker rm [-f] `docker ps -a -q`
# -q:仅显示容器的 ID。
# $(docker ps -a -q):通过子命令获取所有容器的 ID
类似的镜像也可以批量删除:
docker images | awk 'NR>=2{print "docker rmi "$3}'| bash #批量删除镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi #删除none镜像
示例:比如从第三行开始批量删除
先下载一个apache的镜像
[root@localhost ~]# docker search apache # 搜索关键字
[root@localhost ~]# docker pull httpd # 获取镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 7 days ago 188MB
httpd latest dabbfbe0c57b 2 years ago 144MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
[root@localhost ~]# docker images | awk 'NR>=2{print "docker rmi "$3}'| bash
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB