目录
一:Docker 概述
因为 Docker 轻便、快速的特性,可以使应用达到快速迭代的目的。每次小的变更,马上就可以看到效果,而不用将若干个小变更积攒到一定程度再变更。每次变更一小部分其实是一种非常安全的方式,在开发环境中能够快速提高工作效率。
Docker 容器能够帮助开发人员、系统管理员、质量管理和版本控制工程师在一个生产环节中一起协同工作。制定一套容器标准能够使系统管理员更改容器的时候,程序员不需要关心容器的变化,而更专注自己的应用程序代码。从而隔离开了开发和管理,简化了开发和部署的成本。
1.什么是Docker
如果要方便的创建运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时间地点可获取这些资源,这正是 Docker 所能提供的。Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率。
docker 是目前较为主流的容器技术。容器技术是一种轻量级的虚拟化技术,它可以让应用程序及其依赖项打包在一个独立的单元中运行,从而实现应用的隔离、可移植性和资源的高效利用。以下从概念、原理、与传统虚拟化技术的对比、优势、应用场景等方面详细介绍容器技术。
容器就像是一个独立的 “盒子”,这个 “盒子” 里装着运行某个应用所需要的所有东西,包括代码、运行时环境、系统工具、系统库等。不同的容器之间相互隔离,每个容器都有自己独立的文件系统、进程空间、网络接口等,就好像它们是在不同的机器上运行一样,但实际上它们是共享宿主机的操作系统内核。
2.Docker的优势
Docker 容器运行速度很快,启动和停止可以在秒级实现,比传统虚拟机要快很多;Docker 核心解决的问题是利用容器来实现类似虚拟机的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。因此,Docker 容器除了运行其中的应用之外,基本不消耗额外的系统资源,在保证应用性能的同时,又减小了系统开销,使得一台主机上同时运行数千个 Docker 容器成为可能。
传统虚拟化技术(如 VMware、VirtualBox 等)是通过虚拟机管理程序(Hypervisor)在物理服务器上创建多个虚拟机(VM),每个虚拟机都包含完整的操作系统。而容器技术是在操作系统层面进行虚拟化,多个容器共享宿主机的操作系统内核。
容器技术和传统虚拟化的主要区别在于:
- 资源占用:传统虚拟机需要为每个虚拟机分配独立的操作系统,这会占用大量的系统资源;而容器共享宿主机的内核,只包含应用及其依赖项,资源占用相对较少,启动速度也更快。
- 隔离性:虚拟机提供了更高程度的隔离,因为每个虚拟机都有自己独立的操作系统;容器的隔离性相对较弱,但对于大多数应用场景来说已经足够,并且可以通过合理的配置和管理来增强隔离性。
- 性能:由于虚拟机存在额外的虚拟化层,会带来一定的性能开销;容器直接运行在宿主机的内核上,性能损耗较小,更接近原生应用的性能。
Docker 操作方便,可以通过 Dockerfile 配置文件支持灵活的自动化创建和部署。
特性 | Docker 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50% 左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
容器技术的优势主要体现在以下几个方面:
- 隔离性:不同的容器之间相互隔离,一个容器的故障或异常不会影响其他容器的运行,提高了应用的稳定性和安全性。
- 可移植性:容器将应用及其依赖项打包成一个独立的单元,使得应用可以在不同的环境中(如开发环境、测试环境、生产环境)无缝迁移和运行,避免了 “在我的机器上能运行,但在你的机器上不行” 的问题。
- 资源高效利用:容器共享宿主机的操作系统内核,不需要为每个应用运行独立的操作系统,大大减少了资源的浪费,提高了服务器的利用率。
- 快速部署和扩展:容器的启动速度非常快,通常只需要几秒钟,而且可以根据需要快速创建和销毁容器,方便进行应用的快速部署和弹性扩展。
Docker 之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的。传统虚拟机需要有额外的虚拟机管理程序和虚拟机操作系统层,而 Docker 容器则是直接在操作系统层面之上实现的虚拟化。图 2 是 Docker 与传统虚拟机架构。
3.Docker 的应用场景
- 开发环境管理:开发人员可以使用容器来创建一致的开发环境,确保团队成员之间的环境一致性,提高开发效率。
- 持续集成和持续部署(CI/CD):在 CI/CD 流程中,容器可以帮助实现应用的快速打包、测试和部署,实现自动化的软件开发流程。
- 微服务架构:容器技术非常适合微服务架构,每个微服务可以打包成一个独立的容器,独立开发、测试和部署,提高系统的可伸缩性和容错性。
- 云计算:云服务提供商可以利用容器技术为用户提供更高效、灵活的计算资源,用户可以根据自己的需求快速创建和管理容器化的应用。
4.Docker 核心概念
(1)镜像
镜像、容器、仓库是 Docker 的三大核心概念。其中 Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。例如:一个镜像可以是一个完整的 CentOS 操作系统环境,称为一个 CentOS 镜像;也可以是一个安装了 MySQL 的应用程序,称之为一个 MySQL 镜像等等。
Docker 提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经创建好的镜像直接使用。
(2)容器
Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证安全性的平台。可以将容器看作是一个简易版的 Linux 环境,Docker 利用容器来运行和隔离应用。
(3)仓库
Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push 命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
仓库注册服务器(Registry)是存放仓库的地方,其中包含了多个仓库。每个仓库集中存放某一类镜像,并且使用不同的标签(tag)来区分它们。目前最大的公共仓库是 docker Hub,存放了数量庞大的镜像供用户下载使用。
二:Docker 安装
Docker 支持在主流的操作系统平台上进行使用,包括 Windows 系统、Linux 系统、以及 MacOS 系统等。目前最新的 RHEL、Cent OS 以及 Ubuntu 系统官方软件源中都已经默认自带了 Docker 包,可直接安装使用,也可以用 Docker 自己的 YUM 源进行配置。
CentOS 系统下安装 Docker 可以有两种方式:一种是使用 CURL 获得 Docker 的安装脚本进行安装,另一种是使用 YUM 仓库来安装 Docker。注意:目前 Docker 只能支持 64 位系统。
1.本次安装方式使用阿里的软件仓库
部署Docker
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
=disabled
cd /etc/yum.repos.d
#下载docker的repo文件
curl -o docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#替换仓库地址
sed -i 's/$releasever/8/g' docker-ce.repo
sed -i 's/$basearch/x86_64/g' docker-ce.repo
更新索引文件并安装docker
dnf clean all
dnf makecache
dnf -y install docker-ce
#添加国内镜像站
cd /etc/docker/
ls
vim daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com"
]
}
#开启docker服务
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
docker version
#优化内核参数
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl -p
三:Docker 镜像操作
运行 Docker 容器前需要本地存在对应的镜像。如果不存在本地镜像,Docker 就会尝试从默认镜像仓库下载。镜像仓库是由 Docker 官方维护的一个公共仓库,可以满足用户的绝大部分需求。用户也可以通过配置来使用自定义的镜像仓库。
1: 获取镜像
docker pull nginx:1.24.0
docker pull
是 Docker 里的一个关键命令,其主要功能是从 Docker 镜像仓库(默认是 Docker Hub)中拉取镜像到本地 Docker 主机
命令语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
参数说明:
- OPTIONS(可选参数)
-a, --all-tags
:拉取指定仓库中的所有标签的镜像。--disable-content-trust
:默认值为true
,该选项用于禁用镜像内容验证,也就是不验证镜像的签名。
- NAME[:TAG|@DIGEST]
- NAME:这是要拉取的镜像的名称,它可以包含仓库地址和命名空间信息。例如,在 Docker Hub 上的镜像,如果是官方镜像,通常直接写镜像名,如
nginx
;如果是用户或组织的镜像,则格式为用户名/镜像名
,像dockerlibrary/redis
。 - TAG(可选):指定要拉取的镜像的具体标签,用于区分同一镜像的不同版本。若不指定标签,默认会拉取
latest
标签的镜像。 - DIGEST(可选):通过镜像的摘要信息来精确指定要拉取的镜像版本,这能确保拉取的是特定哈希值对应的精确镜像,避免因标签可能指向不同版本而产生混淆。格式如
nginx@sha256:abcdef123456...
。
- NAME:这是要拉取的镜像的名称,它可以包含仓库地址和命名空间信息。例如,在 Docker Hub 上的镜像,如果是官方镜像,通常直接写镜像名,如
对于 Docker 镜像来说,如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest
标签,也可通过指定的标签来下载特定版本的某一镜像。这里标签(tag)就是用来区分镜像版本的。
从整个下载的过程可以看出,镜像文件是由若干层(Layer)组成,称之为 AUFS(联合文件系统),是实现增量保存与更新的基础,下载过程中会输出镜像的各层信息。镜像下载到本地之后就可以随时使用该镜像了。 用户也可以选择从其他注册服务器仓库下载,这时需要在仓库名称前指定完整的仓库注册服务器地址。
2: 查看镜像信息
docker images
docker images
是 Docker 中一个基础且常用的命令,主要用于列出本地 Docker 主机上的镜像信息。docker images
命令会列出本地 Docker 主机上所有可用的镜像,展示镜像的基本信息,帮助用户了解本地镜像的存储情况,包括镜像的仓库名、标签、镜像 ID、创建时间和大小等。
从显示的情况可以读出以下信息:
- REPOSITORY:镜像属于的仓库;
- TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
- IMAGE ID:镜像的唯一 ID 号,唯一标识一个镜像;
- CREATED:镜像创建时间;
- VIRTUAL SIZE:镜像大小;
命令语法:docker images [OPTIONS] [REPOSITORY[:TAG]]
参数说明:
- OPTIONS(可选参数)
-a, --all
:显示所有镜像(包括中间层镜像)。默认情况下,docker images
只显示顶层镜像。--digests
:显示镜像的摘要信息。-f, --filter filter
:根据指定的条件过滤输出结果。过滤条件可以是多种类型,例如dangling=true
表示只显示虚悬镜像(没有标签的镜像)。--format string
:使用 Go 模板语法自定义输出格式。--no-trunc
:不截断输出信息,完整显示镜像 ID 等较长的字段。-q, --quiet
:只显示镜像的 ID。
- REPOSITORY [:TAG](可选)
- REPOSITORY:指定要显示的镜像仓库名称。
- TAG:指定要显示的镜像标签。如果不指定标签,默认显示所有标签的镜像。
3: 查看镜像的详细信息
docker inspect c15
docker inspect
是 Docker 中一个非常实用的命令,它用于返回 Docker 对象(如容器、镜像、网络、卷等)的底层详细信息,这些信息以 JSON 格式展示,方便用户深入了解 Docker 对象的配置和状态。
命令语法:docker inspect [OPTIONS] NAME|ID [NAME|ID...]
参数说明:
- OPTIONS:可选参数,用于指定输出格式或过滤特定信息,常见的选项有:
--format, -f
:指定输出格式,使用 Go 模板语法。--size, -s
:在输出中显示容器的文件系统大小(仅适用于容器)。
- NAME|ID:要检查的 Docker 对象的名称或 ID,可以指定多个对象。
可检查的 Docker 对象:
- 容器(Container):获取容器的详细信息,如运行状态、网络配置、挂载点等。
- 镜像(Image):查看镜像的构建历史、层信息、环境变量等。
- 网络(Network):了解网络的配置,如驱动类型、子网信息等。
- 卷(Volume):获取卷的详细信息,如挂载路径、驱动类型等。
4: 修改镜像标签(老名字 + 新名字)
docker tag nginx:1.24.0 nginx:v1
docker images
在 Docker 中,docker tag
命令用于为现有的 Docker 镜像添加一个新的标签(tag)。标签本质上是镜像的一个别名,它可以让你更方便地引用和管理镜像,同时也有助于区分不同版本或用途的镜像。
命令语法:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
参数说明:
- SOURCE_IMAGE[:TAG]:指定源镜像的名称和标签。
SOURCE_IMAGE
是源镜像的名称,[:TAG]
是可选的标签,如果不指定标签,默认使用latest
。 - TARGET_IMAGE[:TAG]:指定目标镜像的名称和标签。这是你要为源镜像添加的新标签。同样,
TARGET_IMAGE
是目标镜像的名称,[:TAG]
是可选的标签,如果不指定标签,默认使用latest
。
docker tag
命令并不会创建一个新的镜像,它只是为现有的镜像添加一个额外的标签。多个标签可以指向同一个镜像,这些标签只是镜像的不同引用方式。
5: 删除镜像
(1)用镜像名删除
docker rmi nginx:v1
(2)用 ID 删除
docker rmi c15
命令语法:docker rmi [OPTIONS] IMAGE [IMAGE...]
参数说明:
- OPTIONS(可选参数)
-f, --force
:强制删除镜像。即使有容器正在使用该镜像,也会尝试删除,但不建议轻易使用,因为可能导致容器无法正常运行。--no-prune
:默认情况下,删除镜像时会同时删除该镜像相关的未使用的父镜像层(虚悬镜像),使用该选项可以禁止删除这些父镜像层。
- IMAGE
- 指定要删除的镜像,可以是镜像的名称、标签、镜像 ID,也可以同时指定多个镜像。例如:
nginx:latest
、123456789abc
等。
- 指定要删除的镜像,可以是镜像的名称、标签、镜像 ID,也可以同时指定多个镜像。例如:
注意事项:
- 在删除镜像之前,要确保没有正在运行或已停止的容器依赖该镜像。可以使用
docker ps -a
命令查看所有容器,使用docker stop
和docker rm
命令停止并删除依赖该镜像的容器后,再删除镜像。 - 镜像的删除是不可逆的操作,删除后无法恢复,所以在执行删除操作前要谨慎确认。
- 当删除一个有多个标签的镜像时,删除一个标签只是移除该标签的引用,只有当所有标签都被删除后,镜像才会真正从磁盘上删除。
可以使用 docker rmi
命令删除多余的镜像。删除镜像的操作有两种方法:使用镜像的标签删除镜像;使用镜像的 ID 删除镜像。
当一个镜像有多个标签的时候,docker rmi
命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件,相当于只删除了镜像 a0760f339193
的一个标签而已。但当该镜像只剩下一个标签的时候,再使用删除命令就会彻底删除该镜像。
当使用 docker rmi
命令后面指定了某个镜像 ID 时,必须确保该镜像当前没有被任一容器使用才能进行。删除时系统会先删除掉所有指向该镜像的所有标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
6: 存出镜像和载入镜像
(1)导出
docker save -o nginx nginx:1.24.0
docker save
命令用于将一个或多个 Docker 镜像保存为一个 tar 归档文件,这在需要将镜像传输到其他 Docker 环境(如离线环境)时非常有用。
docker save
命令的主要作用是将本地 Docker 主机上的一个或多个镜像打包成一个 tar 文件,方便在不同的 Docker 环境之间传输和共享镜像。这个过程只是将镜像的文件系统层和元数据保存下来,并不包含镜像的历史记录和构建信息。
注意事项:
- 文件大小:保存的镜像文件可能会非常大,尤其是包含多个大型镜像时。在保存和传输这些文件时,要确保有足够的磁盘空间和网络带宽。
- 镜像版本:保存的镜像文件中包含的是特定版本(标签)的镜像。在恢复镜像时,要确保使用正确的标签和版本。
- 跨平台兼容性:虽然 Docker 镜像是设计为跨平台的,但在不同的操作系统上保存和加载镜像时,可能会遇到一些兼容性问题。尽量在相同或兼容的操作系统版本之间传输和使用镜像。
- 镜像依赖:如果保存的镜像依赖于其他基础镜像,确保在目标环境中也有这些基础镜像,或者将它们一起保存和传输。
(2)删除
docker rmi nginx:1.24.0
(3)导入
docker load<nginx
当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存成为本地文件,这一过程叫做存出镜像,可以使用 docker save
命令进行存出操作,之后就可以拷贝该文件到其他机器。将存出的镜像从机器 A 拷贝到机器 B 后,需要在机器 B 上使用该镜像,就可以将该文件导入到机器 B 的镜像库中,这一过程叫做载入镜像。使用 docker load
或者 docker --input
进行载入操作。
四:Docker 容器操作
容器是 Docker 的另一个核心概念。简单说,容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell 环境等。镜像是只读模板,而容器会给这个只读模板添加一个额外的可写层。
1: 容器的创建与启动
Docker 的创建就是将镜像加载到容器的过程。Docker 的容器十分轻量级,用户可以随时创建或者删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器,这个进程是该容器的唯一进程,所以当该进程结束时,容器也会完全停止。停止的容器可以重新启动并保留原来的修改。可以使用 docker create
命令新建一个容器。
(1) 创建容器
docker create -it centos:7
docker create
是 Docker 中的一个重要命令,它的主要作用是基于指定的镜像创建一个新的容器,但并不立即启动该容器。下面将对 docker create
命令进行详细解释。
命令语法:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明:
- OPTIONS(可选参数):
docker create
支持众多可选参数,这些参数可以帮助你对创建的容器进行各种配置,以下是一些常用的参数:-i, --interactive
:保持标准输入打开,即使没有附加到容器上,常用于需要交互的应用程序。-t, --tty
:分配一个伪终端,通常与-i
一起使用,模拟一个交互式的终端环境,如docker create -it
。-p, --publish list
:将容器内的端口映射到宿主机的端口,格式为宿主机端口:容器端口
,例如-p 8080:80
表示将容器的 80 端口映射到宿主机的 8080 端口。-v, --volume list
:挂载数据卷,将宿主机的目录或文件挂载到容器内,格式为宿主机路径:容器路径
,例如-v /host/data:/container/data
。--name string
:为创建的容器指定一个自定义的名称,方便后续管理和识别。-e, --env list
:设置容器内的环境变量,格式为变量名=变量值
,例如-e DB_HOST=localhost
。--network string
:指定容器要加入的网络,例如--network my_network
。
- IMAGE
- 指定用于创建容器的镜像名称和标签,如
nginx:latest
。如果本地没有该镜像,Docker 会尝试从 Docker Hub 等镜像仓库中拉取。
- 指定用于创建容器的镜像名称和标签,如
- [COMMAND] [ARG...](可选)
- 指定容器启动时要执行的命令及其参数。如果不指定,将使用镜像的默认启动命令。
docker create
命令主要用于提前准备好容器的配置,创建一个处于停止状态的容器实例。之后可以在需要的时候使用 docker start
命令启动该容器。这种方式在一些场景下非常有用,例如:
- 批量创建多个配置好的容器,在需要时逐个启动,提高部署效率。
- 对容器进行预配置,进行多次测试或验证不同的启动参数。
注意事项:
- 创建容器时,要确保指定的镜像存在于本地或者可以从镜像仓库中拉取。
- 使用
docker create
创建的容器处于停止状态,需要使用docker start
命令启动。 - 对于复杂的容器配置,要仔细检查参数的正确性,避免出现配置错误导致容器无法正常工作。
(2) 查看所有的容器
docker ps -a
docker ps
是 Docker 中一个非常基础且常用的命令,主要用于列出 Docker 容器的相关信息。通过该命令,用户可以查看容器的运行状态、ID、名称、所使用的镜像等关键内容,方便对容器进行管理和监控。
命令语法:docker ps [OPTIONS]
参数说明:
docker ps
支持众多可选参数,这些参数可以帮助用户根据不同需求筛选和定制输出信息。下面介绍一些常用的参数:
-a, --all
:列出所有容器,包括正在运行的和已经停止的容器。默认情况下,docker ps
仅显示正在运行的容器。-q, --quiet
:只显示容器的 ID,不显示其他详细信息。该参数常用于脚本编写,方便批量操作容器,比如批量停止或删除容器。-s, --size
:在输出中显示容器所占用的文件系统大小,包括读写层大小和总大小。-f, --filter filter
:根据指定的条件过滤输出结果。过滤条件可以有多种,例如status=running
表示只显示正在运行的容器;name=my_container
表示只显示名称为my_container
的容器。--format string
:使用 Go 模板语法自定义输出格式,用户可以根据自己的需求灵活定制输出内容和样式。-n, --last int
:显示最近创建的 n 个容器(包括已停止的)。例如,docker ps -n 3
会显示最近创建的 3 个容器信息。-l, --latest
:只显示最近创建的容器(包括已停止的)。
(3) 容器的运行
docker start 5a
docker start
是 Docker 中用于启动已创建但处于停止状态容器的命令。docker start
命令的主要作用是将之前使用 docker create
创建好但处于停止状态的容器,或者之前已经停止运行的容器重新启动起来。它会重新初始化容器的运行环境,加载相关资源,让容器内的进程继续执行。
命令语法:docker start [OPTIONS] CONTAINER [CONTAINER...]
参数说明:
- OPTIONS(可选参数)
-a, --attach
:将本地标准输入、输出和错误输出附加到启动的容器上,即启动容器后进入容器的交互界面,能实时看到容器内程序的输出信息,也可以可以向容器内输入命令。-i, --interactive
:保持容器的标准输入打开,允许你与容器内的进程进行交互。通常和-a
选项一起使用,以实现交互式操作。--checkpoint string
:指定从哪个检查点恢复容器。检查点功能允许你保存容器的当前状态,之后可以从该状态恢复容器的运行。--checkpoint-dir string
:指定检查点文件所在的目录。--detach-keys string
:指定从附加模式退出的键序列。默认情况下,使用Ctrl - p Ctrl - q
组合键可以从附加模式退出容器,同时保持容器在后台运行。--publish-all, -P
:发布容器内所有暴露的端口到宿主机上,宿主机端口会随机分配。
- CONTAINER [CONTAINER...]
- 可以指定一个或多个要启动的容器,既可以使用容器的名称,也可以使用容器的 ID。
注意事项:
- 若容器启动失败,可使用
docker logs
命令查看容器的日志信息,以排查启动失败的原因。 - 使用
-a
选项附加到容器时,若要退出容器又不停止它,可使用默认的Ctrl - p Ctrl - q
组合键(可通过--detach - keys
选项修改)。 - 对于依赖外部资源(如数据库、网络服务)的容器,要确保这些资源在启动容器前已经可用,否则容器可能因无法连接到依赖资源而启动失败。
(4) 利用容器执行命令(命令执行完毕后容器会退出)
docker run centos:7 /usr/bin/bash -c "ls /root"
docker run
是 Docker 中最常用的命令之一,它的主要功能是基于指定的镜像创建并启动一个新的容器。以下将从命令语法、参数说明、使用示例和注意事项几个方面对 docker run
命令进行详细解释。
命令语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明:
- OPTIONS(可选参数):
docker run
支持众多可选参数,用于对容器的各种属性和行为进行配置,下面介绍一些常用的参数:- 容器运行模式相关
-d, --detach
:让容器在后台运行,并返回容器的 ID。使用该参数后,容器启动后不会将输出信息显示在当前终端,适用于长时间运行的服务类容器。-i, --interactive
:保持标准输入打开,允许你与容器内的进程进行交互。-t, --tty
:分配一个伪终端,通常与-i
一起使用,模拟一个交互式的终端环境,例如docker run -it
常用于创建交互式容器。
- 容器命名和资源限制相关
--name string
:为创建的容器指定一个自定义的名称,方便后续管理和识别。-m, --memory bytes
:限制容器可以使用的内存大小,例如-m 512m
表示限制容器最多使用 512MB 的内存。--cpus decimal
:限制容器可以使用的 CPU 资源,例如--cpus 0.5
表示容器最多可以使用 0.5 个 CPU 核心。
- 端口映射和数据卷相关
-p, --publish list
:将容器内的端口映射到宿主机的端口,格式为宿主机端口:容器端口
,例如-p 8080:80
表示将容器的 80 端口映射到宿主机的 8080 端口。-P, --publish-all
:发布容器内所有暴露的端口到宿主机上,宿主机端口会随机分配。-v, --volume list
:挂载数据卷,将宿主机的目录或文件挂载到容器内,格式为宿主机路径:容器路径
,例如-v /host/data:/container/data
。
- 环境变量和网络相关
-e, --env list
:设置容器内的环境变量,格式为变量名=变量值
,例如-e DB_HOST=localhost
。--network string
:指定容器要加入的网络,例如--network my_network
。
- 容器运行模式相关
- IMAGE
- 指定用于创建容器的镜像名称和标签,如
nginx:latest
。如果本地没有该镜像,Docker 会尝试从 Docker Hub 等镜像仓库中拉取。
- 指定用于创建容器的镜像名称和标签,如
- [COMMAND] [ARG...](可选)
- 指定容器启动时要执行的命令及其参数。如果不指定,将使用镜像的默认启动命令。
(5) 在启动容器时持续在后台运行
docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
或
docker run -dit centos:7 /bin/bash
注意事项:
- 容器退出问题:若容器内的主进程退出,容器也会随之停止运行。例如,若在容器内运行的脚本执行完毕后没有其他持续运行的进程,容器就会停止。因此,要确保容器内有持续运行的服务或进程。
- 日志查看:由于容器在后台运行,无法直接看到其输出信息。可以使用
docker logs
命令查看容器的日志,例如docker logs <容器 ID 或名称>
,以此来排查容器运行过程中出现的问题。 - 资源占用:在后台运行的容器会持续占用系统资源(如 CPU、内存等),要注意监控容器的资源使用情况,避免资源过度占用影响系统性能。可以使用
docker stats
命令查看容器的资源使用统计信息。
3: 容器的终止
docker stop b18
执行该命令后,Docker 会向 my_nginx
容器内的主进程发送 SIGTERM
信号,等待 10 秒(默认时间),如果进程没有自行终止,再发送 SIGKILL
信号强制终止。
docker stop
命令用于优雅地停止一个或多个正在运行的 Docker 容器。docker stop
命令的主要作用是向正在运行的容器内的主进程发送终止信号,让容器内的应用程序有机会正常关闭和清理资源,而不是像 docker kill
那样直接强制终止容器。这有助于避免数据丢失或损坏,保证应用程序的正常关闭流程。
注意事项:
- 容器响应情况:有些容器内的应用程序可能无法正确处理
SIGTERM
信号,导致无法在指定时间内正常关闭。在这种情况下,Docker 会在等待时间结束后发送SIGKILL
信号强制终止容器,可能会造成数据丢失。 - 依赖关系:在停止容器时,要考虑容器之间的依赖关系。如果一个容器依赖于另一个容器提供的服务,先停止被依赖的容器可能会导致依赖容器出现问题。
- 停止状态检查:可以使用
docker ps
命令检查容器是否已经成功停止。停止的容器不会再出现在docker ps
的输出中,但可以使用docker ps -a
查看所有容器(包括已停止的)。
4: 进入容器
docker exec -it 03f /bin/bash
退出
[root@03f062851c52 /]# exit
docker exec
命令是 Docker 中一个非常实用的工具,它允许你在一个正在运行的容器内部执行额外的命令。docker exec
命令的主要作用是在不停止容器运行的情况下,对正在运行的容器进行调试、维护或执行一些临时任务。通过该命令,你可以在容器内部执行各种操作,就像直接登录到容器内部的操作系统一样。以下是对该命令的详细解释:
命令语法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
参数说明:
- OPTIONS(可选参数)
-d, --detach
:让命令在容器后台执行,不将命令的输出信息显示在当前终端,执行后会返回命令在容器内的执行进程 ID。-i, --interactive
:保持标准输入打开,允许你与容器内执行的命令进行交互,通常用于需要输入信息的命令。-t, --tty
:分配一个伪终端,模拟一个交互式的终端环境,一般和-i
一起使用,即docker exec -it
,这样可以让你像在本地终端一样与容器内的命令进行交互。-u, --user string
:指定在容器内执行命令的用户,可以是用户名或用户 ID,例如--user root
表示以root
用户身份执行命令。-w, --workdir string
:指定命令在容器内的工作目录,即命令执行时的当前目录。
- CONTAINER
- 指定要在哪个正在运行的容器中执行命令,可以使用容器的名称或者 ID。
- COMMAND [ARG...]
- 指定要在容器内执行的命令及其参数。例如,执行
ls
命令查看容器内的文件列表,或者执行bash
进入容器的shell
环境。
- 指定要在容器内执行的命令及其参数。例如,执行
注意事项:
- 容器必须正在运行:
docker exec
只能对正在运行的容器执行命令。如果容器处于停止状态,该命令将无法执行。 - 权限问题:在容器内执行命令时,要注意用户的权限。某些操作可能需要
root
权限才能完成,如果使用普通用户身份执行可能会失败。 - 命令执行环境:容器内的环境可能与宿主机不同,例如软件安装情况、环境变量设置等。在执行命令时,要确保容器内已经安装了所需的软件,并且环境配置正确。
5: 容器导出
docker export 03f > centos7
docker export
命令用于将一个运行中的或已停止的 Docker 容器的文件系统内容导出为一个 tar
归档文件。
应用场景:
- 迁移容器:当你需要把一个容器从一个 Docker 环境迁移到另一个 Docker 环境时,可以使用
docker export
导出容器的文件系统,再在目标环境中导入使用。 - 备份容器:对容器的当前状态进行备份,以便在需要时可以恢复到该状态。
- 分析容器内容:将容器的文件系统导出后,可以在宿主机上查看和分析容器内的文件和目录结构。
注意事项:
- 与
docker save
的区别:docker save
操作的对象是镜像,保存的是镜像的所有层信息和元数据,包括镜像的历史记录和构建信息,而docker export
操作的对象是容器,只保存容器当前的文件系统状态,不包含镜像的历史和构建信息。- 使用
docker save
保存的镜像可以直接使用docker load
加载到其他 Docker 环境中,而使用docker export
导出的容器文件系统需要使用docker import
导入,导入后会生成一个新的镜像,且该镜像没有之前的历史记录。
- 容器状态:无论容器是运行中还是已停止,都可以使用
docker export
命令进行导出。不过,在导出运行中的容器时,要注意容器内的文件可能正在被修改,导出的文件系统状态可能不是一个完全一致的快照。 - 文件大小:导出的
tar
文件可能会比较大,尤其是对于包含大量文件的容器。在导出和存储时,要确保有足够的磁盘空间。 - 权限问题:导出的文件系统中的文件权限可能会受到宿主机和容器之间权限映射的影响。在导入到新环境后,要检查文件权限是否符合预期。
6: 容器导入生成镜像
docker import centos7 centos7:test
docker images
7: 容器删除
docker rm 7f
docker rm
是 Docker 中用于删除容器的基础命令。
命令语法:docker rm [OPTIONS] CONTAINER [CONTAINER...]
参数说明:
-f, --force
:强制删除正在运行的容器。默认情况下,docker rm
只能删除已停止的容器,添加该选项后,会向容器内的主进程发送SIGKILL
信号,直接终止容器并将其删除,但可能导致数据丢失或应用异常。-l, --link
:仅删除容器的网络连接,而不删除容器本身。通常用于清理容器与网络之间的关联。-v, --volumes
:在删除容器的同时,删除与该容器关联的数据卷。如果数据卷中存储着重要数据,使用该选项要谨慎。- CONTAINER [CONTAINER...]:指定要删除的容器,可以是容器的名称或者 ID,支持同时指定多个容器,用空格分隔。
使用场景:
- 资源清理:当容器不再使用时,及时删除以释放系统资源,如磁盘空间、内存和网络端口等。
- 环境重置:在开发或测试环境中,需要频繁创建和删除容器,以重置环境、测试不同的配置或重新部署应用。
- 故障排除:当容器出现无法恢复的故障时,删除容器并重新创建可能是解决问题的有效方法。
注意事项:
- 容器状态:默认只能删除已停止的容器,若要删除正在运行的容器,需使用
-f
选项,但可能会导致数据丢失或应用异常,因此尽量先使用docker stop
正常停止容器后再删除。 - 数据卷处理:使用
-v
选项删除容器关联的数据卷时要谨慎,确保数据卷中的数据不再需要,否则可能造成数据丢失。 - 依赖关系:在删除容器前,要考虑容器之间的依赖关系。如果一个容器依赖于另一个容器提供的服务,先删除被依赖的容器可能会导致依赖容器出现问题。
- 不可逆操作:容器删除后无法直接恢复,因此在执行删除操作前要确认容器确实不再需要。
- 删除所有容器(文档中未完整呈现该部分操作,若有可补充 )