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

前言

在软件开发和部署环境中,使用 Docker 等容器技术可以帮助团队实现快速、一致、可靠的应用程序部署,提高开发效率和应用程序的可移植性。

目录

一、虚拟化产品介绍

[1. 云服务模型](#1. 云服务模型)

[1.1 IaaS](#1.1 IaaS)

[1.2 PaaS](#1.2 PaaS)

[1.3 SaaS](#1.3 SaaS)

[1.4 DaaS](#1.4 DaaS)

[2. 产品介绍](#2. 产品介绍)

[2.1 虚拟机架构](#2.1 虚拟机架构)

[2.2 虚拟化技术分类](#2.2 虚拟化技术分类)

[3. KVM 与 ESXI](#3. KVM 与 ESXI)

[3.1 KVM](#3.1 KVM)

[3.2 ESXI](#3.2 ESXI)

[二、Docker 介绍](#二、Docker 介绍)

[1. 概述](#1. 概述)

[2. 容器的特点](#2. 容器的特点)

[3. Docker 与虚拟机的区别](#3. Docker 与虚拟机的区别)

[4. 容器技术有哪些](#4. 容器技术有哪些)

[5. 容器在内核中支持两种重要技术](#5. 容器在内核中支持两种重要技术)

[5.1 命名空间(Namespaces)](#5.1 命名空间(Namespaces))

[5.2 控制组(Cgroups)](#5.2 控制组(Cgroups))

[5.3 namespace 的六项隔离](#5.3 namespace 的六项隔离)

[6. Docker 核心概念](#6. Docker 核心概念)

[6.1 镜像](#6.1 镜像)

[6.2 容器](#6.2 容器)

[6.3 仓库](#6.3 仓库)

[三、Docker 部署](#三、Docker 部署)

[1. 安装依赖包](#1. 安装依赖包)

[2. 设置阿里云镜像源](#2. 设置阿里云镜像源)

[3. 安装 Docker-CE 并设置为开机自动启动](#3. 安装 Docker-CE 并设置为开机自动启动)

[4. 查看 docker 相关信息](#4. 查看 docker 相关信息)

[四、Docker 镜像操作](#四、Docker 镜像操作)

[1. 搜索镜像](#1. 搜索镜像)

[2. 获取镜像](#2. 获取镜像)

[3. 镜像加速下载](#3. 镜像加速下载)

[4. 查看镜像信息](#4. 查看镜像信息)

[5. 获取镜像详细信息](#5. 获取镜像详细信息)

[6. 为本地的镜像添加新的标签](#6. 为本地的镜像添加新的标签)

[7. 删除镜像](#7. 删除镜像)

[8. 存出存入镜像](#8. 存出存入镜像)

[9. 上传镜像](#9. 上传镜像)

[五、Docker 容器操作](#五、Docker 容器操作)

[1. 容器创建](#1. 容器创建)

[2. 查看容器的运行状态](#2. 查看容器的运行状态)

[3. 启动容器](#3. 启动容器)

[4. 创建并启动容器](#4. 创建并启动容器)

[5. 容器的进入](#5. 容器的进入)

[6. 宿主机与容器文件传输](#6. 宿主机与容器文件传输)

[7. 容器的导出与导入](#7. 容器的导出与导入)

[8. 删除容器](#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 | 系统调用参数 | 隔离内容 |
| 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 部署

1. 安装依赖包

bash 复制代码
[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. 设置阿里云镜像源

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

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

bash 复制代码
[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 相关信息

bash 复制代码
[root@localhost ~]# docker version   # 查看docker版本信息
Client: Docker Engine - Community
 Version:           26.0.2
......
[root@localhost ~]# docker info      # docker信息查看

四、Docker 镜像操作

1. 搜索镜像

bash 复制代码
格式:
docker search 关键字
示例:
[root@localhost ~]# docker search nginx

2. 获取镜像

bash 复制代码
格式:
docker pull 仓库名称/镜像名称[:标签]
示例:
[root@localhost ~]# docker pull nginx
Using default tag: latest              # 不指定标签,即为 latest

3. 镜像加速下载

bash 复制代码
浏览器访问 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. 查看镜像信息

bash 复制代码
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. 获取镜像详细信息

bash 复制代码
格式:
docker inspect 镜像ID号
示例:
[root@localhost ~]# docker inspect 2ac752d7aeb1
# 如果跟容器ID可以查看到容器的ip等信息

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

bash 复制代码
格式:
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. 删除镜像

bash 复制代码
格式:
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. 存出存入镜像

① 存出镜像

bash 复制代码
将镜像保存成为本地文件:
格式:
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

② 载入镜像

bash 复制代码
将镜像文件导入到镜像库中:
格式:
docker load < 存出的文件       或者:docker load -i 存出的文件
示例:
docker load < nginx           或者:docker load -i nginx 

9. 上传镜像

bash 复制代码
默认上传到 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. 容器创建

就是将镜像加载到容器的过程。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

bash 复制代码
格式: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. 查看容器的运行状态

bash 复制代码
[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. 启动容器

bash 复制代码
格式:
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 地址给容器;
  • 执行用户指定的应用程序,执行完毕后容器被终止运行。
bash 复制代码
[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 命令进入运行着的容器。进入容器前,确保容器正在运行。

bash 复制代码
格式:
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. 宿主机与容器文件传输

① 宿主机复制到容器中

bash 复制代码
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

② 从容器复制文件到主机

bash 复制代码
[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 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

① 导出

bash 复制代码
导出格式:
docker export 容器ID/名称 > 文件名
[root@localhost ~]# docker export d226e95966f3 > centos7.tar
[root@localhost ~]# scp centos7.tar 192.168.190.108:/opt

② 导入

bash 复制代码
导入格式:
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. 删除容器

bash 复制代码
格式:
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

① 批量停止容器

bash 复制代码
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

② 批量删除所有容器

bash 复制代码
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

③ 批量清理后台停止的容器

bash 复制代码
docker rm $(docker ps -a -q)
# -q:仅显示容器的 ID。
# $(docker ps -a -q):通过子命令获取所有容器的 ID

类似的镜像也可以批量删除:

bash 复制代码
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
相关推荐
雪域迷影3 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
福大大架构师每日一题4 小时前
22.1 k8s不同role级别的服务发现
容器·kubernetes·服务发现
莹雨潇潇4 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
tangdou3690986555 小时前
1分钟搞懂K8S中的NodeSelector
云原生·容器·kubernetes
tangdou3690986558 小时前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器
later_rql8 小时前
k8s-集群部署1
云原生·容器·kubernetes
漫无目的行走的月亮11 小时前
在Docker中运行微服务注册中心Eureka
docker
大G哥13 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
大道归简14 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
zeruns80215 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站