Docker容器概念介绍与基本管理

前言

在软件开发和部署环境中,使用 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. 安装依赖包

2. 设置阿里云镜像源

3. 安装 Docker-CE 并设置为开机自动启动

4. 查看 docker 相关信息

四、Docker 镜像操作

1. 搜索镜像

2. 获取镜像

3. 镜像加速下载

4. 查看镜像信息

5. 获取镜像详细信息

6. 为本地的镜像添加新的标签

7. 删除镜像

8. 存出存入镜像

9. 上传镜像

五、Docker 容器操作

1. 容器创建

2. 查看容器的运行状态

3. 启动容器

4. 创建并启动容器

5. 容器的进入

6. 宿主机与容器文件传输

7. 容器的导出与导入

8. 删除容器


一、虚拟化产品介绍

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系统调用参数隔离内容
UTSCLONE_NEWUTS主机名与域名
IPCCLONE_NEWWIPC信号量、消息队列和共享内存
PIDCLONE_NEWPID进程编号
NETWORKCLONE_NEWNET网络设备、网络栈、端口等
MOUNTCLONE_NEWNS挂载点(文件系统)
USERCLONE_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 部署

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)的软件包,用于提供灵活的磁盘存储管理,可以在多个物理硬盘之间动态创建、调整和删除逻辑卷

2. 设置阿里云镜像源

[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

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

4. 查看 docker 相关信息

[root@localhost ~]# docker version   # 查看docker版本信息
Client: Docker Engine - CommunityVersion:           26.0.2
……
[root@localhost ~]# docker info      # 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://ae3f5qei.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 命令进行上传。docker tag nginx:latest soscscs/nginx:web	#添加新的标签时必须在前面加上自己的dockerhub的username
docker login								#登录公共仓库
Username:soscscs
password:abc123456
docker push soscscs/nginx:web				#上传镜像
或者:
login  {-u 仓库用户名 -p 密码}

五、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 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. 宿主机与容器文件传输

① 宿主机复制到容器中

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

7. 容器的导出与导入

导出与导入操作是对整个容器文件系统的打包和解压,不包含容器的元数据,适合用于简单的文件系统导出和导入。导出相当于迁移,容器内的数据可以保存到镜像中。

用户可以将任何一个 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

8. 删除容器

格式:
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 $(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2981216.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF---[SWPU2019]神奇的二维码

1、下载附件是一张二维码&#xff0c;拿去扫描得到了flag 2、拿去提交是错的&#xff08;不会这么简单哈哈哈&#xff09;&#xff0c;常规操作在kali中分析 3、分离发现图片里面有东西 4、查看txt&#xff0c;发现里面有一串字符&#xff0c;解码后为 5、查看文档&#xff0c…

「ChatGPT」掀起新一轮AI热潮!超越GPT-4 Turbo,商汤日日新大升级!

目录 拳打 GPT-4 Turbo &#xff0c;脚踢 DALLE 3 端侧大模型&#xff0c;唯快不破 AI 应用落地需要一个即插即用的大模型超市 并不存在 AI 这个行业&#xff0c;只有 AI行业&#xff0c;强调 AI 需要与传统产业合作&#xff0c;这种关系是结合与赋能&#xff0c;而不是颠覆…

【提示学习论文】BlackVIP: Black-Box Visual Prompting for Robust Transfer Learning论文原理

BlackVIP: Black-Box Visual Prompting for Robust Transfer Learning BlackVIP:稳健迁移学习的黑盒视觉提示 问题 黑盒白盒&#xff1f; 黑盒和白盒的概念与对预训练模型内部参数的了解程度相关。黑盒指的是对预训练模型的参数和结构缺乏详细了解&#xff0c;通常只能通过使…

Python自学之路--001:Python + PyCharm安装图文详解教程

目录 1、概述 2、Python解释器 2.1、下载 2.2、Python安装 2.3、Python环境变量配置&#xff0c;必选项 3、PyCharm安装 3.1、PyCharm下载 3.2、PyCharm安装 4、建一个Hello World 5、Phcarm设置 5.1、Phcarm汉化 5.2、Phcarm工具栏显示在顶部 5.3、Phcarm通过pip安…

[2021年最新]国产时序性数据TDenige入门

一、TDenige简介 TDengine&#xff1a;是涛思数据面对高速增长的物联网大数据市场和技术挑战推出的创新性的大数据处理产品&#xff0c;它不依赖任何第三方软件&#xff0c;也不是优化或包装了一个开源的数据库或流式计算产品&#xff0c;而是在吸取众多传统关系型数据库、NoS…

25计算机考研院校数据分析 | 复旦大学

复旦大学(fudan University)&#xff0c;简称"复旦”&#xff0c;位于中国上海&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列985工程、211工程、双一流A类&#xff0c;入选“珠峰计划"、"111计划""2011计划…

zabbix自动发现和自动注册

一、zabbix自动发现 1.1 确保客户端上的zabbix-agent2服务器状态正常 1.2 在web页面删除原有的客户端主机 1.3 在服务端和客户端上配置hosts 1.4 web端配置自动发现 二、zabbix自动注册 2.1 环境配置 2.2 修改zabbix-agent2配置文件 过滤非#或非&#xffe5;开头的内容 2.3 we…

应用实战|只需几步,即可享有外卖订餐小程序

本示例是一个简单的外卖查看店铺点菜的外卖微信小程序&#xff0c;小程序后端服务使用了MemFire Cloud&#xff0c;其中使用到的MemFire Cloud功能包括&#xff1a; 其中使用到的MemFire Cloud功能包括&#xff1a; 云数据库&#xff1a;存储外卖微信小程序所有数据表的信息。…

解决Linux CentOS 7安装了vim编辑器却vim编辑器不起作用、无任何反应

文章目录 前言一、解决vim不起作用&#xff08;卸载重新安装&#xff09;1.重新安装vim2.测试vim是否能正常使用 二、解决vim: error while loading shared libraries: /lib64/libgpm.so.2: file too short报错三、解决vim编辑器不能使用方向键和退格键问题 remove vim-common …

【S32DS RTD实战】-1.5-S32DS使用Post-Build调用第三方插件-自动对生成的s19,Hex,Bin文件二次编辑

<--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景&#xff1a; 在《【S32DS RTD实战】-1.3-S32K3工程生成S19&#xff0c;BIN&#xff0c;Hex文件&#xff0c;以及Post-build steps的妙用_s32ds如何生成s19或hex文件-CSDN博客https://blog.csdn.net/qfmzhu/articl…

C++“流”风格日志系统实战-课程简介

一个能快速提升C复杂代码设计的学习项目&#xff0c;一个能迅速让C面试官会心一笑的简历项目&#xff0c;一个能在实际项目中使用的项目……学习什么是流&#xff1f;如何利用抽象层面的流编写适用面更广的代码&#xff1f; 每天在用的cout和cin 它们是什么类型&#xff1f;最后…

HDMI的识别过程

HDMI可分为发送设备和接收设备&#xff0c;具体的识别过程见下&#xff1a; (1).HDMI发送设备给HDMI接收设备提供5V的电源&#xff0c;其电流应小于50mA; (2).HDMI检测到5V电源后&#xff0c;HDMI接收设备给HDMI发送设备提供HPD信号&#xff0c;其电压为5V&#xff1b; (3).HDM…

Java | Leetcode Java题解之第45题跳跃游戏II

题目&#xff1a; 题解&#xff1a; class Solution {public int jump(int[] nums) {int length nums.length;int end 0;int maxPosition 0; int steps 0;for (int i 0; i < length - 1; i) {maxPosition Math.max(maxPosition, i nums[i]); if (i end) {end maxP…

将本地项目推送至gitlab仓库

1. gitlab上新建一个空白项目 gitlab上点击new project按钮&#xff0c;新建一个项目 新建空白项目 项目名称与本地新建项目名称相同&#xff0c;其余根据具体需要选择 2. 初始化本地仓库并commit项目 进入本地项目根目录下&#xff0c;右击 git bash here打开命令窗口 初始化…

场景 - 分库分表

分什么 数据量大分表&#xff0c;并发大分库 分表字段如何选择 如果对交易订单进行分表&#xff0c;可以选择的东西很多&#xff0c;比如说商户id&#xff0c;用户id&#xff0c;地区等等 分表的时候要考虑到数据倾斜问题 数据倾斜 比如说按商户号进行分表&#xff0c;一共…

Java基础入门1-2

跟着韩顺平老师的30天入门java课程学习&#xff0c;整理一下自己的笔记&#xff0c;方便回顾知识点和复习。 另附上视频链接&#xff1a;0034_韩顺平Java_变量原理_哔哩哔哩_bilibili 第一章&#xff1a;学习前的了解 第二章&#xff1a;Java概述 2.1什么是程序&#xff1f…

KPI与OKR的区别:深入解析与案例应用

一、KPI&#xff1a;量化与结果的导向 KPI是一种基于量化指标的绩效管理方法&#xff0c;强调对关键业务成果的衡量和评估。它通常关注那些可以直接影响企业战略目标达成的具体指标&#xff0c;如销售额、客户满意度等。KPI的优点在于其明确性和可衡量性&#xff0c;有助于企业…

简化图卷积 笔记

1 Title Simplifying Graph Convolutional Networks&#xff08;Felix Wu、Tianyi Zhang、Amauri Holanda de、 Souza Jr、Christopher Fifty、Tao Yu、Kilian Q. Weinberger&#xff09;【ICML 2019】 2 Conclusion This paper proposes a simplified graph convolutional m…

Oracle 第二章

1- 排序查询 select * from 表名 order by 字段; desc &#xff1a;从大到小排序 默认是从小到大排序 2- 基于伪列的查询 ROWID 和 ROWNUM rowid &#xff1a; 唯一的编号 select rowid,表名.* from 表名 where ROWID AAAStKAANAAAAC/AAC; &#xff08;rowid号&#…

ROS 话题订阅模型之自定义消息类型 C++实现

ROS 话题订阅模型之自定义消息类型 1.自定义消息类型好处 ROS提供了许多标准的消息类型&#xff0c;如 std_msgs/String、sensor_msgs/Image 等&#xff0c;涵盖了很多常见的数据类型和传感器数据。但是&#xff0c;在实际的开发中&#xff0c;我们经常会遇到需要传输的数据类…