当前位置:   article > 正文

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

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 安装依赖包

  1. [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
  2. # yum-utils: 是一组用于增强和扩展Yum功能的实用程序集合,包含了一些高级的包管理工具,如下载镜像、创建repo文件等
  3. # device-mapper-persistent-data: 是Device Mapper持久化数据存储支持包,常用于LVM(Logical Volume Manager)和DM(Device Mapper)相关的存储管理
  4. # 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 并设置为开机自动启动

  1. [root@localhost ~]# yum install -y docker-ce docker-ce-cli containerd.io
  2. # docker-ce:这是Docker的核心组件,包含Docker引擎,用于运行容器
  3. # docker-ce-cli:这是Docker命令行工具,用于与Docker守护进程交互,进行容器的管理操作
  4. # containerd.io:这是一个更底层的容器运行时,是Docker的重要依赖,负责容器的生命周期管理,如容器的启动、停止、资源隔离等
  5. [root@localhost ~]# systemctl start docker.service
  6. [root@localhost ~]# systemctl enable docker.service

1.4 查看 docker 相关信息

  1. [root@localhost ~]# docker version # 查看docker版本信息
  2. Client: Docker Engine - Community
  3. Version: 26.0.2
  4. ……
  5. [root@localhost ~]# docker info # docker信息查看

2. 二进制安装 

2.1 下载 tar 包

  1. wget https://download.docker.com/linux/static/stable/x86_64/docker-26.0.2.tgz
  2. tar xzvf docker-26.0.2.tgz # 解压安装包
  3. cp docker/* /usr/bin/ # 将二进制文件移动到可执行路径上的目录
  4. dockerd & # 启动

2.2 systemd 管理

  1. vim /usr/lib/systemd/system/docker.service
  2. [Unit]
  3. Description=Docker Application Container Engine
  4. Documentation=https://docs.docker.com
  5. After=network-online.target firewalld.service
  6. Wants=network-online.target
  7. [Service]
  8. Type=notify
  9. ExecStart=/usr/bin/dockerd
  10. ExecReload=/bin/kill -s HUP $MAINPID
  11. LimitNOFILE=infinity
  12. LimitNPROC=infinity
  13. TimeoutStartSec=0
  14. Delegate=yes
  15. KillMode=process
  16. Restart=on-failure
  17. StartLimitBurst=3
  18. StartLimitInterval=60s
  19. [Install]
  20. WantedBy=multi-user.target
  21. systemctl daemon-reload
  22. systemctl start docker.service

2.3 镜像加速

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://xxxxxxxx.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

四、Docker 镜像操作

1. 搜索镜像

  1. 格式:
  2. docker search 关键字
  3. 示例:
  4. [root@localhost ~]# docker search nginx

2. 获取镜像

  1. 格式:
  2. docker pull 仓库名称/镜像名称[:标签]
  3. 示例:
  4. [root@localhost ~]# docker pull nginx
  5. Using default tag: latest # 不指定标签,即为 latest

3. 镜像加速下载

  1. 浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录获取镜像加速器配置
  2. [root@localhost ~]# mkdir -p /etc/docker
  3. 使用指定的镜像仓库地址作为Docker Registry的镜像加速器:
  4. tee /etc/docker/daemon.json <<-'EOF'
  5. # /etc/docker/daemon.json是Docker的守护进程(daemon)的配置文件。在Docker中,守护进程负责管理 Docker服务,并接受来自Docker客户端的请求,执行相应的操作
  6. {
  7. "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
  8. # 指定了一个阿里云的镜像加速地址
  9. }
  10. EOF
  11. [root@localhost ~]# systemctl daemon-reload # 重新加载Systemd守护进程的配置文件
  12. [root@localhost ~]# systemctl restart docker

4. 查看镜像信息

  1. Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件:
  2. [root@localhost ~]# cd /var/lib/docker/
  3. [root@localhost docker]# ls
  4. buildkit containers engine-id image network overlay2 plugins runtimes swarm tmp volumes
  5. # buildkit:存储与 Docker BuildKit 构建工具相关的数据和配置信息,用于支持 Docker 镜像的构建过程
  6. # containers:存储 Docker 容器的相关信息,包括容器的元数据、配置信息等
  7. # engine-id:存储 Docker 引擎的唯一标识符,用于标识不同的 Docker 引擎实例
  8. # image:存储 Docker 镜像的相关信息,包括已下载的镜像、镜像层等
  9. # network:存储 Docker 网络的相关信息,包括网络配置、网络状态等
  10. # overlay2:存储 Docker 存储驱动 Overlay2 的数据,用于存储容器的文件系统层
  11. # plugins:存储 Docker 插件的相关信息,用于扩展 Docker 功能的插件
  12. # runtimes:存储 Docker 容器运行时的相关信息,包括容器运行时的配置、状态等
  13. # swarm:存储 Docker Swarm 的相关信息,用于支持 Docker 集群管理功能
  14. # tmp:临时目录,用于存储临时文件和数据
  15. # volumes:存储 Docker 卷的相关信息,包括卷的配置、数据等
  16. [root@localhost ~]# cat /var/lib/docker/image/overlay2/repositories.json
  17. # 查看下载的镜像文件信息
  18. {"Repositories":{"nginx":{"nginx:latest":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580","nginx@sha256:0463a96ac74b84a8a1b27f3d1f4ae5d1a70ea823219394e131f5bf3536674419":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580"}}}
  19. [root@localhost ~]# docker images # 查看下载到本地的所有镜像
  20. REPOSITORY TAG IMAGE ID CREATED SIZE
  21. nginx latest 2ac752d7aeb1 5 days ago 188MB
  22. # REPOSITORY:镜像属于的仓库;
  23. # TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
  24. # IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
  25. # CREATED:镜像创建时间;
  26. # VIRTUAL SIZE:镜像大小;

5. 获取镜像详细信息

  1. 格式:
  2. docker inspect 镜像ID号
  3. 示例:
  4. [root@localhost ~]# docker inspect 2ac752d7aeb1
  5. # 如果跟容器ID可以查看到容器的ip等信息

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

  1. 格式:
  2. docker tag 源仓库名/源镜像名:[标签] 新仓库名/新镜像名:[新标签]
  3. 示例:
  4. [root@localhost ~]# docker tag nginx:latest nginx:web
  5. [root@localhost ~]# docker images | grep nginx
  6. REPOSITORY TAG IMAGE ID CREATED SIZE
  7. nginx latest 2ac752d7aeb1 5 days ago 188MB
  8. nginx web 2ac752d7aeb1 5 days ago 188MB
  9. # 在Docker中,docker tag 命令不是用来修改镜像的实际内容,而是给现有的镜像创建一个新的标签(tag)。

7. 删除镜像

  1. 格式:
  2. docker rmi 仓库名称/镜像名称:标签 # 当一个镜像有多个标签时,只是删除其中指定的标签
  3. 或者
  4. docker rmi 镜像ID号 # 会彻底删除该镜像
  5. # 注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像
  6. 示例:
  7. [root@localhost ~]# docker rmi nginx:web
  8. Untagged: nginx:web
  9. [root@localhost ~]# docker images | grep nginx
  10. nginx latest 2ac752d7aeb1 5 days ago 188MB

8. 存出存入镜像

① 存出镜像

  1. 将镜像保存成为本地文件:
  2. 格式:
  3. docker save -o 存储文件名(也可以写成xxx.tar) 仓库名/镜像名:标签
  4. 示例:
  5. [root@localhost ~]# docker save -o nginx nginx:latest
  6. [root@localhost ~]# ll -h | grep nginx
  7. -rw-------. 1 root root 183M 4月 22 23:41 nginx

② 载入镜像

  1. 将镜像文件导入到镜像库中:
  2. 格式:
  3. docker load < 存出的文件 或者:docker load -i 存出的文件
  4. 示例:
  5. docker load < nginx 或者:docker load -i nginx

9. 上传镜像

  1. 默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
  2. 可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
  3. 在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
  4. [root@localhost ~]# docker tag nginx:latest fangqianling/nginx:web
  5. # 添加新的标签时必须在前面加上自己的dockerhub的username
  6. docker login # 登录公共仓库
  7. Username:用户名
  8. password:密码
  9. 或者:
  10. login {-u 仓库用户名 -p 密码}
  11. [root@localhost ~]# docker push fangqianling/nginx:web # 上传镜像
  12. 访问https://hub.docker.com/查看Tags # 需要科学上网

​​​​​​​​​​​​​​

五、Docker 容器操作

1. 容器创建

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

  1. 格式:docker create [选项] 镜像
  2. 常用选项:
  3. -i:让容器开启标准输入
  4. -t:让 Docker 分配一个伪终端 tty
  5. -it :合起来实现和容器交互的作用,运行一个交互式会话 shell # 一般直接合起来用
  6. [root@localhost ~]# docker create -it nginx:latest /bin/bash
  7. # /bin/bash: 这是容器启动后执行的命令。这里指定的是启动一个Bash shell,这意味着当你启动这个容器时,你会进入一个Bash Shell环境,而不是直接启动Nginx服务

2. 查看容器的运行状态

  1. [root@localhost ~]# docker ps -a # -a 选项可以显示所有的容器
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 1867e92522e6 nginx:latest "/docker-entrypoint.…" About a minute ago Created admiring_sammet
  4. 容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称

3. 启动容器

  1. 格式:
  2. docker start 容器的ID/名称
  3. [root@localhost ~]# docker start 1867e92522e6
  4. 1867e92522e6
  5. [root@localhost ~]# docker ps
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. 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 容器中应该运行一个守护进程或者类似的长期运行的进程,以确保容器保持运行状态。

举例说明:

  1. [root@localhost ~]# docker run -d --name t1 nginx:latest /bin/bash
  2. d15f2192a21e812c7cad0f255ef98ae902477eae7bf09c14ca01467f2dd52521
  3. [root@localhost ~]# docker run -d --name t2 -p 10000:80 nginx
  4. 149613f7406b12de516c5a81a5c5cb5564501ffc71d5a1a5d4648f745747ec4b
  5. [root@localhost ~]# docker run -itd --name t3 centos:7 /bin/bash
  6. 76bdc79e0e95272859174cfe68edcea2b24675ed549b43a901a20852c868dd86
  7. [root@localhost ~]# docker ps -a
  8. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  9. 76bdc79e0e95 centos:7 "/bin/bash" 8 seconds ago Up 7 seconds t3
  10. 149613f7406b nginx "/docker-entrypoint.…" 30 seconds ago Up 30 seconds 0.0.0.0:10000->80/tcp, :::10000->80/tcp t2
  11. d15f2192a21e nginx:latest "/docker-entrypoint.…" 38 seconds ago Exited (0) 38 seconds ago t1
  12. # 容器t1在启动时执行了/bin/bash命令,当这个命令执行完毕后,容器就会自动退出,因为在Docker中,容器的主进程(PID=1,守护进程)结束后,容器就会停止

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:

  • 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
  • 利用镜像创建并启动一个容器;
  • 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
  • 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
  • 分配一个地址池中的 IP 地址给容器;
  • 执行用户指定的应用程序,执行完毕后容器被终止运行。

  1. [root@localhost ~]# docker run centos:7 /usr/bin/bash -c ls /
  2. # docker run:在docker中运行一个容器
  3. # centos:7 名称:标签,是一个镜像
  4. # /usr/bin/bash:启动的shell
  5. # -c:后面的字符串作为命令
  6. [root@localhost ~]# docker ps -a
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. 8a226e89f007 centos:7 "/usr/bin/bash -c ls…" 2 minutes ago Exited (0) 2 minutes ago quirky_pare
  9. 1867e92522e6 nginx:latest "/docker-entrypoint.…" 12 minutes ago Up 8 minutes 80/tcp admiring_sammet
  10. # 此时会发现创建了一个新容器并启动执行一条shell命令,之后就停止了
  11. 在后台持续运行 docker run 创建的容器:
  12. [root@localhost ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
  13. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  14. 49656 root 20 0 11692 1112 932 R 97.7 0.1 0:52.62 bash
  15. # 写了死循环可以看到cpu升高
  16. [root@localhost ~]# docker ps
  17. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  18. 4c25551aaf88 centos:7 "/usr/bin/bash -c 'w…" About a minute ago Up About a minute wonderful_elbakyan
  19. 创建容器并持续运行容器:
  20. [root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash
  21. # --name test1:给容器指定一个名称为 test1
  22. d226e95966f3e3f8e429c049efa8385f08109ce735e64b105d0508522b74f40c
  23. [root@localhost ~]# docker ps -a
  24. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  25. d226e95966f3 centos:7 "/bin/bash" 5 seconds ago Up 4 seconds test1
  26. 8a226e89f007 centos:7 "/usr/bin/bash -c ls…" 7 minutes ago Exited (0) 7 minutes ago quirky_pare
  27. 1867e92522e6 nginx:latest "/docker-entrypoint.…" 17 minutes ago Up 13 minutes 80/tcp admiring_sammet
  28. 终止容器运行:
  29. 格式:docker stop 容器的ID/名称
  30. [root@localhost ~]# docker stop 4c25551aaf88

5. 容器的进入

需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。进入容器前,确保容器正在运行。

  1. 格式:
  2. docker exec -it 容器ID/名称 /bin/bash
  3. [root@localhost ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. d226e95966f3 centos:7 "/bin/bash" 11 minutes ago Up 11 minutes test1
  6. 1867e92522e6 nginx:latest "/docker-entrypoint.…" 28 minutes ago Up 25 minutes 80/tcp admiring_sammet
  7. [root@localhost ~]# docker exec -it test1 /bin/bash
  8. [root@d226e95966f3 /]# ls
  9. anaconda-post.log dev home lib64 mnt proc run srv tmp var
  10. bin etc lib media opt root sbin sys usr
  11. [root@d226e95966f3 /]# exit
  12. exit

6. 容器的生命周期 

① created:已创建,还未运行的容器

② running:正在运行的容器

③ restarting:容器正在重启中

④ removeing:容器正在迁移中

⑤ paused:已暂停状态的容器,挂起

⑥ exited:停止状态的容器

⑦ dead:死亡,主要是操作系统出现异常或断电关机等有可能引发dead状态,不常见

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

① 宿主机复制到容器中

  1. echo abc123 > ~/test.txt
  2. [root@localhost ~]# docker cp ~/test.txt d226e95966f3:/opt/
  3. Successfully copied 2.05kB to d226e95966f3:/opt/
  4. [root@localhost ~]# docker exec -it test1 /bin/bash
  5. [root@d226e95966f3 /]# cat /opt/test.txt
  6. abc123

② 从容器复制文件到主机

  1. [root@localhost ~]# docker cp d226e95966f3:/opt/test.txt ~/newtest.txt
  2. Successfully copied 2.05kB to /root/newtest.txt
  3. [root@localhost ~]# cat newtest.txt
  4. abc123

8. 容器的导出与导入

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

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

① 导出

  1. 导出格式:
  2. docker export 容器ID/名称 > 文件名
  3. [root@localhost ~]# docker export d226e95966f3 > centos7.tar
  4. [root@localhost ~]# scp centos7.tar 192.168.190.108:/opt

② 导入

  1. 导入格式:
  2. cat 文件名 | docker import – 镜像名称:标签
  3. [root@localhost ~]# cd /opt
  4. [root@localhost opt]# cat centos7.tar | docker import - centos7:test
  5. sha256:7d96c1a4df3aa8393fc6a6be522bc594d7d92d6997af1aa39b2095710ee72e63
  6. [root@localhost opt]# docker images
  7. REPOSITORY TAG IMAGE ID CREATED SIZE
  8. centos7 test 7d96c1a4df3a 22 seconds ago 204MB
  9. # 导入后会生成镜像,但不会创建容器
  10. 创建并启动容器,进入容器查看是否存在迁移的数据:
  11. [root@localhost opt]# docker run -itd centos7:test /bin/bash
  12. 3ddbcad05908a18d4e46e143db7b488d2670af35706cd29db282db37ae6cc5e6
  13. [root@localhost opt]# docker ps -a
  14. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  15. 3ddbcad05908 centos7:test "/bin/bash" 2 seconds ago Up 1 second naughty_williamson
  16. [root@localhost opt]# docker exec -it 3ddbcad05908 /bin/bash
  17. [root@3ddbcad05908 /]# cat /opt/test.txt
  18. abc123

9. 删除容器

  1. 格式:
  2. docker rm [-f] 容器ID/名称
  3. docker stop 容器ID/名称
  4. docker rm 容器ID/名称 #删除已经终止状态的容器
  5. docker rm -f 容器ID/名称 #强制删除正在运行的容器
  6. 示例:
  7. [root@localhost ~]# docker ps -a
  8. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  9. 4c25551aaf88 centos:7 "/usr/bin/bash -c 'w…" 51 minutes ago Exited (137) 49 minutes ago wonderful_elbakyan
  10. d226e95966f3 centos:7 "/bin/bash" 53 minutes ago Up 53 minutes test1
  11. 8a226e89f007 centos:7 "/usr/bin/bash -c ls…" About an hour ago Exited (0) About an hour ago quirky_pare
  12. 1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet
  13. [root@localhost ~]# docker rm 4c25551aaf88
  14. 4c25551aaf88
  15. [root@localhost ~]# docker rm 8a226e89f007
  16. 8a226e89f007
  17. [root@localhost ~]# docker ps -a
  18. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  19. d226e95966f3 centos:7 "/bin/bash" 59 minutes ago Up 59 minutes test1
  20. 1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet

① 批量停止容器

  1. docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
  2. # docker stop后面加空格是为了确保在拼接命令时,docker stop和容器的ID之间有一个空格
  3. docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
  4. 示例:
  5. [root@localhost ~]# docker run -itd --name test2 centos:7 /bin/bash
  6. f7bcc1a52b45c0f35da8f15645d099ccd1d9bcbfe15515784bb4b189a144cb0e
  7. [root@localhost ~]# docker ps
  8. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  9. f7bcc1a52b45 centos:7 "/bin/bash" 3 seconds ago Up 2 seconds test2
  10. d226e95966f3 centos:7 "/bin/bash" About an hour ago Up About an hour test1
  11. 1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet
  12. [root@localhost ~]# docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
  13. f7bcc1a52b45
  14. d226e95966f3
  15. 1867e92522e6
  16. # NR>=2 表示从第二行开始处理
  17. [root@localhost ~]# docker ps -a
  18. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  19. f7bcc1a52b45 centos:7 "/bin/bash" 3 minutes ago Exited (137) About a minute ago test2
  20. d226e95966f3 centos:7 "/bin/bash" About an hour ago Exited (137) About a minute ago test1
  21. 1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Exited (137) About a minute ago admiring_sammet

② 批量删除所有容器

  1. docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
  2. # docker rm后面加空格是为了确保在拼接命令时,docker rm和容器的ID之间有一个空格
  3. docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
  4. 示例:
  5. [root@localhost ~]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
  6. f7bcc1a52b45
  7. d226e95966f3
  8. 1867e92522e6
  9. [root@localhost ~]# docker ps -a
  10. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

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

  1. docker rm [-f] $(docker ps -a -q)
  2. docker rm [-f] `docker ps -a -q`
  3. # -q:仅显示容器的 ID。
  4. # $(docker ps -a -q):通过子命令获取所有容器的 ID

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

  1. docker images | awk 'NR>=2{print "docker rmi "$3}'| bash #批量删除镜像
  2. docker images | grep none | awk '{print $3}' | xargs docker rmi #删除none镜像
  3. 示例:比如从第三行开始批量删除
  4. 先下载一个apache的镜像
  5. [root@localhost ~]# docker search apache # 搜索关键字
  6. [root@localhost ~]# docker pull httpd # 获取镜像
  7. [root@localhost ~]# docker images
  8. REPOSITORY TAG IMAGE ID CREATED SIZE
  9. nginx latest 2ac752d7aeb1 7 days ago 188MB
  10. httpd latest dabbfbe0c57b 2 years ago 144MB
  11. centos 7 eeb6ee3f44bd 2 years ago 204MB
  12. [root@localhost ~]# docker images | awk 'NR>=2{print "docker rmi "$3}'| bash
  13. [root@localhost ~]# docker images
  14. REPOSITORY TAG IMAGE ID CREATED SIZE
  15. nginx latest 605c77e624dd 2 years ago 141MB
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/486896
推荐阅读
相关标签
  

闽ICP备14008679号