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. 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系统调用参数隔离内容
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 部署

官方地址下载 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5款好用的监控员工电脑软件推荐 (如何监控员工上班工作情况)

在现代的商业环境中&#xff0c;管理和监控员工的工作内容是至关重要的。 为了确保员工的工作效率和质量&#xff0c;公司需要使用一些工具来监控他们的工作进程。 以下是五款实用的监控员工工作内容的软件。 域智盾软件 域智盾是一款专为企业打造的智能管理系统。 它借助人…

FPGA设计篇——波形绘制软件

FPGA设计篇——波形绘制软件 写在前面一、Visio二、TimeGen三、WaveDrom写在最后 写在前面 在FPGA设计过程中&#xff0c;经常需要编写设计文档&#xff0c;其中&#xff0c;不可缺少的就是仿真波形的绘制&#xff0c;可以直接截取Vivado或者Modelsim平台实际仿真波形&#xff…

JVM学习笔记(四)类加载与字节码技术

目录 一、类文件结构 二、字节码指令 2.3 图解方法执行流程 1&#xff09;原始 java 代码 2&#xff09;编译后的字节码文件 3&#xff09;常量池载入运行时常量池 4&#xff09;方法字节码载入方法区 5&#xff09;main 线程开始运行&#xff0c;分配栈帧内存 6&…

分布式-知识体系

分布式系统 本质就是一堆机器的协同&#xff0c;要做的就是用各种手段来让机器的运行达到预期 分布式业务场景 分布式四纵四横说 基于 MSA&#xff08;微服务架构&#xff09;的分布式知识体系 相关概念 – 【摘自网络原文】 节点与网络 节点 传统的节点也就是一台单体的物…

搞嵌入式到底属于程序员吗?

搞嵌入式到底属不属于程序员呢&#xff1f;毫无疑问&#xff0c;当然算啊&#xff01;而且我十分赞同另一位朋友所说的&#xff1a;嵌入式程序员是难得的全栈型程序员。尽管嵌入式领域方向众多且繁杂&#xff0c;但他们同样也是会写代码的程序员。 嵌入式行业主要分为硬件和软…

《从零开始的Java世界》11网络编程

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

打开IIS网站网页错误提示Argument ‘Key must not be null‘ cannot be null.解决方案 Oracle数据库监听

打开网页异常如下&#xff1a; /“应用程序中的服务器错误。 Argument Key must not be null cannot be null.参数名:Key must not be null 客户端 连接oracle 提示&#xff1a;ORA-12541:TNS:无监听程序 按组合键WindowsR&#xff0c;打开运行 输入命令&#xff1a;lsnrctl s…

周报不止是汇报进度,如何用周报轻松提升团队协作效率?

周报是工作中常见的沟通工具&#xff0c;对于项目经理来说尤其重要。写周报不仅仅是为了完成一项任务&#xff0c;它更是项目管理中不可或缺的环节&#xff0c;它不仅有助于项目经理跟踪项目进度&#xff0c;还加强了团队成员间的沟通与协作。以下是几个关键的原因&#xff1a;…

Geoserver的RESTful接口使用

概述 GeoServer提供了一个RESTful接口&#xff0c;客户端可以通过该接口获取有关实例的信息并进行配置更改。REST接口使用简单的HTTP调用&#xff0c;通过客户端就可以配置GeoServer&#xff0c;而无需使用Web管理接口。 Geoserver中的关系 工作区、数据源、图层、图层组以及…

用 LMDeploy 高效部署 Llama-3-8B,1.8倍vLLM推理效率

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

微信小程序Vue+nodejs+uniapp课堂教学辅助在线学习系统

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 后台主要实现功能&#xff1a;一、用户的管理(用户的信息管理) 二、 课程的管理&#xff08;课程发布&#xff0c;课后成绩的查看&#xff0c…

【C语言__联合和枚举__复习篇10】

目录 前言 一、联合体 1.1 联合体的概念 1.2 联合体与结构体关于声明和内存布局的比较 1.3 联合体的大小如何计算 1.4 使用联合体的2个示例 二、枚举体 2.2 枚举体的概念 2.2 枚举体的优点 前言 本篇主要讨论以下问题&#xff1a; 1. 联合体是什么&#xff0c;它有什么特点 …

每天一题crypto(1)---RSA(小明文攻击)

零.做题&#xff1a; 看到N很大&#xff0c;如果满足 就表示模过程中&#xff0c;没有丢失信息&#xff0c;所以 直接解即可&#xff0c;不要管pq等等 一.题目&#xff1a; N很大 from Crypto.Util.number import * from gmpy2 import *flag bNSSCTF{******}p getPrime(5…

【SpringBoot整合系列】SpringBoot配置多数据源

目录 背景技术选型配置多数据源思路(以两个为例)代码实现1.导入依赖2.各自的配置 3.各自的dataSourcenews数据库的smbms数据库的注意&#xff1a;Primary注解 4.各自的SqlSessionFactory等news数据库的smbms数据库的 5.去掉启动类头上的MapperScan6.各自的mapper接口7.各自的ma…

防火墙分为哪三类以及他们的优缺点

1. 包过滤防火墙&#xff08;Packet Filtering Firewall&#xff09;2. 状态检查防火墙&#xff08;Stateful Inspection Firewall&#xff09;3. 应用层防火墙&#xff08;Application Layer Firewall&#xff09;零基础入门学习路线视频配套资料&国内外网安书籍、文档网络…

Spring Cloud Alibaba Sentinel 使用

初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址&#xff1a; home | Sentinel 需要了解的概念 簇点链路 在学习 Sentinel 的使用之前&#xff0c;我们有必要首先了解一下簇点链路。当请求进入微服务时&#xff0c;首先会访Controller、Service、Ma…

C++11可变模板参数

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

百面算法工程师 | 卷积基础知识——Convolution

目录 8.1 图像卷积过程 8.2 卷积层基本参数 8.3 卷积后图像的长和宽大小的计算方式 8.4 卷积神经网络中的权重共享 8.5 上采样中的反卷积 8.6 空洞卷积 8.7 深度可分离卷积 8.8 为什么可分离卷积中Depthwise卷积后还要进行pointwise卷积 8.9 分组卷积 Group Conv 8.1…

前端导入的方便方法

直接上代码&#xff1a; 利用input的导入功能 这是相应的处理方法 是不是很简单呢

《系统架构设计师教程(第2版)》第10章-软件架构的演化和维护-01-软件架构演化概述

文章目录 1. 演化的重要性2. 架构演化示例 教材中&#xff0c;本节名为&#xff1a;“软件架构演化和定义的关系” 1. 演化的重要性 演化目的&#xff1a;维持软件架构自身的有用性 为什么说&#xff0c;软件架构是演化来的&#xff0c;而不是设计来的&#xff1f; 软件架构的…