文章目录
- 一、Docker引言
- 二、容器和虚拟机
- 三、Docker的基本组成
- 镜像:一个特殊的文件系统
- 容器:镜像运行时的实体
- 仓库:镜像运行时的实体
- 小结
- 四、docker平台架构
- 五、docker简单命令
一、Docker引言
Docker是基于Go语言实现的云开源项目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现就解决了这样一个问题,而Docker就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
用一句话来说,docker是为了解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
Docker 是世界领先的软件容器平台,所以想要搞懂 Docker 的概念我们必须先从容器开始说起。
什么是容器?一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
如果需要通俗地描述容器的话,容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。
二、容器和虚拟机
面试题:容器与虚拟机有什么不同
简单来说:容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响有。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件卫者之间的逻辑不变。
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如:VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。
因此虚拟机存在以下问题:
- 资源占用多:虚拟机需要为每个实例运行完整的操作系统,这意味着它们会占用更多的CPU、内存和存储资源。而Docker容器与宿主机共享操作系统内核,不需要为每个容器都运行一个完整的操作系统,从而更加轻量级。
- 启动慢:虚拟机启动需要经历操作系统的完整启动过程,这通常需要较长时间。而Docker容器可以在几秒钟内启动,因为它们不需要启动操作系统内核。
- 可移植性差:虚拟机镜像文件通常很大,这使得它们在网络上传输和迁移较为困难。而Docker容器通过镜像分层和联合文件系统,可以实现轻量级和快速的分发。
- 性能开销:虚拟化技术虽然已经很成熟,但仍然存在一定的性能开销。Docker容器由于共享宿主机操作系统,性能更接近物理机。
- 管理复杂性:虚拟机需要专门的虚拟化管理软件,如VMware或Hyper-V,这些软件可能较为复杂且难以管理。Docker容器可以通过简单的命令行工具进行管理。
由于前面虚拟机存在某些缺点,Linux发展出了另一种容器虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。
比较了Docker和传统虚拟化方式的不同之处,我们可以发现:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。
- 容器是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
- 虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。管理程序允许多个 VM 在一台机器上运行。每个 VM 都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此 占用大量空间 。而且 VM 启动也十分缓慢 。
虚拟机技术和容器技术,两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而 Docker 通常用于隔离不同的应用 ,例如前端,后端以及数据库。
Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。因此Docker必须部署在Linux内核的系统上。如果其他系统想部署Docker就必须安装一个虚拟Linux环境。在Windows上部署Docker的方法都是先安装一个虚拟机,并在安装Linux系统的的虚拟机中运行Docker。
—–
三、Docker的基本组成
Docker 中有非常重要的三个基本概念:镜像(Image)、容器(Container)和仓库(Repository)。
镜像:一个特殊的文件系统
Docker镜像(Image)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统。比如官方镜像centos:7就包含了完整的一套centos:7最小系统的root文件系统。相当于容器的“源代码”,docker镜像文件类似于C++的类模板,而docker容器实例类似于C++中new出来的实例对象。
操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构 。镜像实际是由多层文件系统联合组成。
UnionFS:联合文件系统。
Uion文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a singlevirtual filesystem)。
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
镜像分层的最大的一个好处就是共享资源,方便复制迁移,就是为了复用。比如说有多个镜像都是从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;、
同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一次都可以被共享。
Docker镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统(引导内核),在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系统的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
Docker镜像包含的实际上是 rootfs
,也就是典型Linux文件系统中的用户空间文件(如 /bin
, /lib
, /etc
等)。Docker运行时,rootfs
会直接与宿主机的内核交互。
Docker镜像并不实际加载或使用bootfs。宿主机的内核和bootloader在宿主机启动时已完成引导工作,Docker镜像中并不会包含这些内容。Docker镜像直接依赖宿主机已加载的Linux内核,而不需要引导层。
为什么使用docker
pull
一个Linux操作系统,非常小,但是安装虚拟机都是好几个G
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。也就是说,Docker容器与宿主机共享操作系统内核,因此镜像不需要包含内核本身。这显著减小了镜像的体积。
Docker镜像采用分层文件系统,每个镜像由多个只读层组成。只有必要的核心文件和依赖会被包含,而不需要整个操作系统的所有内容。比如,可以基于一个精简的Linux发行版(如ubuntu,仅72.8MB)创建镜像,只包含运行应用所需的最小环境。
Docker容器利用宿主机的内核运行,只需要一小部分操作系统组件作为用户空间的支持。而虚拟机则完全模拟一个独立的硬件环境,包括CPU、内存、硬盘等资源,因此需要加载完整的操作系统。
⚠️Docker镜像层都是只读的,容器层是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常称为“容器层”,“容器层”之下的都叫“镜像层”。
面对镜像的改动,无论是添加、删除还是修改文件都只会发生在容器层中。只有容器层是可写的,容器下面的所有镜像层都是只读的。
Docker中的镜像分层,支持通过扩展现有的镜像,创建一个新的镜像。类似继承于一个父类,自己按需扩展。新景象是从基类中一层一层叠加生成的。每次安装一个镜像,就是在原有的镜像的基础上增加一层。
容器:镜像运行时的实体
Docker利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是C++中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
- 也可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。
仓库:镜像运行时的实体
仓库(Repository)是集中存放镜像文件的场所。类似于Maven仓库,存放各种jar包的地方;github仓库,存放各种git项目的地方;Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
- 最大的公开仓库是Docker Hub(https://hub.docker.com),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等
小结
Docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例。
image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
镜像文件 :image文件生成的容器实例,本身也是一个文件,称为镜像文件。
容器实例 :一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
仓库:就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了
下面这一张图很形象地展示了 Image、Container、Repository 和 Registry/Hub 这四者的关系:
- Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于定义如何构建一个 Docker 镜像。运行
docker build
命令并指定一个 Dockerfile 时,Docker 会读取 Dockerfile 中的指令,逐步构建一个新的镜像,并将其保存在本地。 docker pull
命令可以从指定的 Registry/Hub 下载一个镜像到本地,默认使用 Docker Hub。docker run
命令可以从本地镜像创建一个新的容器并启动它。如果本地没有镜像,Docker 会先尝试从 Registry/Hub 拉取镜像。docker push
命令可以将本地的 Docker 镜像上传到指定的 Registry/Hub。
四、docker平台架构
Docker 使用客户端-服务器(C/S)架构。 Docker 客户端与 Docker 守护进程通信,后者负责构建、运行和分发 Docker 容器的繁重工作。 Docker 客户端和守护进程可以在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。 Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。
Docker 守护进程 ( dockerd
) 侦听 Docker API 请求并管理 Docker 对象,例如映像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理 Docker 服务。
Docker 客户端 ( docker
) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用docker run
等命令时,客户端会将这些命令发送到dockerd
,由 dockerd 执行这些命令。 docker
命令使用 Docker API。 Docker 客户端可以与多个守护进程通信。
Docker的后端是一个松散耦合的架构,由多个模块组成,每个模块负责不同的功能。
Docker的运行基本流程如下:
- 用户通过Docker客户端(Docker Client)与Docker守护进程(Docker Daemon)建立通信,并向后者发送请求。
- Docker守护进程是Docker架构中的核心部分,它首先充当Docker服务器(Docker Server)的角色,能够接收来自Docker客户端的请求。
- Docker引擎执行Docker内部的一系列工作,每一项工作都是以一个任务(Job)的形式存在。
- 在任务运行过程中,如果需要容器镜像,Docker会从Docker注册中心(Docker Registry)下载镜像,并通过镜像管理驱动程序(Graph driver)将下载的镜像以图形(Graph)的形式存储。
- 当需要为Docker创建网络环境时,通过网络管理驱动程序(Network driver)来创建并配置Docker容器的网络环境。
- 当需要限制Docker容器的运行资源或执行用户指令等操作时,这些操作是通过执行驱动程序(Execdriver)来完成的。
- Libcontainer是一个独立的容器管理库,Network driver和Execdriver都是通过Libcontainer来实现对容器的具体操作。
五、docker简单命令
启动相关
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctlrestart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
查看docker概要信息:docker info
查看docker总体帮助文档:docker --help
查看docker命令帮助文档:docker 具体命令–help
镜像相关
[root@study ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
REPOSITORY
:表示镜像的仓库源TAG
:镜像的标签版本号IMAGE ID
:镜像IDCREATED
:镜像创建时间SIZE
:镜像大小
同一仓库源可以有多个TAG版本,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG
来定义不同的镜像。如果不指定一个镜像的版本标签,例如你只使用ubuntu,docker将默认使用ubuntu:latest镜像
-
docker images -a:
这个命令会列出本地所有的 Docker 镜像,包括中间层镜像(历史镜像)。如果添加-q
选项,则只会显示镜像的 ID。 -
docker search [某个xxx镜像名字]:
这个命令会搜索 Docker Hub 上的公共镜像,搜索结果会列出与[某个xxx镜像名字]
相关的所有镜像。 -
docker pull [某个xxx镜像名字] 或 docker pull [某个xxx镜像名字:TAG]:
这个命令会从 Docker Hub 上拉取(下载)指定名字的镜像到本地。 -
docker system df:
这个命令用于查看 Docker 镜像、容器、数据卷所占用的空间。 -
**d
docker rmi [镜像ID或镜像名:标签]
**:
这个命令用于删除指定名字或 ID 的 Docker 镜像。如果要删除的镜像有其他镜像依赖于它,那么必须先用-f
选项强制删除。# 列出所有本地镜像 docker images # 删除所有镜像(需要确认) docker rmi $(docker images -q) # 如果你确定要删除所有镜像,并且不需要确认,可以使用以下命令: docker rmi -f $(docker images -q)
面试题回答:谈谈 Docker 虚悬镜像是什么?
Docker 虚悬镜像(Dangling Image)是指在 Docker 中 仓库名、标签都是 <none>
的镜像。通常,当使用 docker pull
命令从 Docker Hub 拉取一个镜像时,该镜像会有一个标签,比如 latest
。但是,如果随后用 docker tag
命令给这个镜像重新打了一个标签,那么原来的标签就会移到新的镜像上,而旧的镜像就会变成没有标签的状态,即成为虚悬镜像。
虚悬镜像通常不会占用太多空间,因为它们往往是由其他镜像的中间层组成的。但是,随着时间的推移,它们可能会累积并占用不必要的空间。
要找出所有的虚悬镜像,可以使用以下命令:
docker images -f "dangling=true"
要删除所有的虚悬镜像,可以使用以下命令:
docker image prune
这个命令会删除所有未被任何容器引用的虚悬镜像,释放空间。在使用 prune
命令时,Docker 会提示用户确认删除操作,或者可以使用 -f
选项来强制删除,无需确认。
容器相关
Docker 容器管理的命令非常丰富,以下是一些常用的 Docker 容器命令,按使用场景分类:
容器生命周期管理
-
启动容器:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d
:后台运行容器。--name
:为容器指定一个名称。-p
:指定端口映射(格式为 主机端口:容器端口)。-P
:随机端口映射-i
:以交互模式运行容器,通常与-t
同时使用;-t
:为容器重新分配一个伪输入终端,通常与-i
同时使用;也即启动交互式容器(前台有伪终端,等待交互)。
-
停止容器:
docker stop CONTAINER_ID/NAME
-
启动已停止的容器:
docker start CONTAINER_ID/NAME
-
重启容器:
docker restart CONTAINER_ID/NAME
-
删除容器:
docker rm CONTAINER_ID/NAME # 删除全部的 docker rm $(docker ps -aq)
- 使用
-f
强制删除正在运行的容器。
- 使用
-
强制停止容器:
docker kill CONTAINER_ID/NAME
-
退出容器:
exit
:run进去容器,exit退出,容器停止。ctrl+q+p
:run进去容器,ctrl+q+p退出,容器停止。
-
查看当前启动的容器列表:
docker ps [OPTION]
-a
:显示所有容器(包括已停止的)。-l
:显示最近创建的容器-n
:显示最近n个创建的容器。-q
:静默模式,只显示容器编号。
容器内部操作
-
进入运行中的容器:
docker exec -it CONTAINER_ID/NAME bash
-it
:以交互模式进入容器,bash
可换成其他 shell。
-
在容器中运行命令:
docker exec -it CONTAINER_ID/NAME COMMAND
- 可以指定在容器中运行某个特定命令,而不是进入容器的 shell。
-
重新进入:
docker attach CONTAINER_ID
attach
直接进入容器启动命令的终端,不会启动新的进程。用exit
退出,会导致容器的停止。exec
是在容器中打开新的终端,并且可以启动新的进程。用exit
退出,不会导致容器的停止。- 推荐使用
docker exec
命令,因为退出容器终端,不会导致容器的停止。
-
查看容器日志:
docker logs CONTAINER_ID/NAME
-
-f
:实时跟踪日志。 -
--tail N
:显示最后 N 行日志。 -
复制文件:
-
从容器复制到主机:
docker cp CONTAINER_ID/NAME:容器内路径 主机路径
-
从主机复制到容器:
docker cp 主机路径 CONTAINER_ID/NAME:容器内路径
-
-
导入导出容器:
export
导出容器的内容流作为一个tar归档文件[对应import命令]import
从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
docker export 容器ID > 文件名.tar cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号
-
容器资源监控
-
查看容器资源使用情况:
docker stats
- 默认显示所有运行中的容器的实时 CPU、内存、网络等资源使用情况。
-
检查容器的详细信息:
docker inspect CONTAINER_ID/NAME
- 返回 JSON 格式的容器详细信息,包括网络、存储、配置等。
容器导入与导出
-
导出容器为镜像文件:
docker export -o 文件名.tar CONTAINER_ID/NAME
-
导入容器文件为镜像:
docker import 文件名.tar 镜像名:标签
容器网络管理
-
列出网络:
docker network ls
-
创建网络:
docker network create 网络名称
-
连接容器到网络:
docker network connect 网络名称 CONTAINER_ID/NAME
-
-
断开容器与网络的连接:
docker network disconnect 网络名称 CONTAINER_ID/NAME
其他常用命令
-
清理未使用的容器、镜像、网络等资源:
docker system prune
-a
:清理所有未使用的镜像、容器、网络等。-f
:强制执行清理。
这些命令涵盖了 Docker 容器的基本管理操作。使用这些命令可以更高效地管理和监控 Docker 容器,灵活地调度资源和开发应用。
启动守护式容器(后台服务器)
大部分情况下,我们希望docker的服务是在后台运行的,我们可以过-d
指定容器的后台运行模式
#使用镜像centos:latest以后台模式启动一个容器
docker run -d centos
问题:然后docker ps -a
进行查看,会发现容器已经退出,很重要的要说明的一点:Docker容器后台运行,就必须有一个前台进程。
容器运行的命令如果不是那些一直挂起的命令(比如运行top
,tail
),就是会自动退出的。
这个是docker的机制问题,比如web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start
。但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了。所以,最佳的解决方案是,将要运行的程序以前台进程的形式运行,常见的是命令行模式。
下面使用redis
,演示前台交互式启动和后台守护式启动。
前台交互式启动:
后台守护式启动:
docker commit
docker commit
提交容器副本使之成为一个新的镜像。
docker commit -m="提交的描述信息"-a="作者"容器iD要创建的目标镜像名:[标签名]
案例演示ubuntu安装vim
推送镜像到阿里云:
首先创建命名空间,然后创建仓库