Docker容器的使用与操作

devtools/2024/9/23 4:49:47/

1、什么是容器

        镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义容器是镜像运行时的实体,基于同一镜像可以创建若干个不同的容器

        每个容器都有一个软件镜像。可以将容器看作一个将应用程序及其依赖环境打包而成的集装箱。容器可以被创建、启动、停止、删除、暂停等。

        容器的实质是进程容器进程在属于自己的独立的命名空间内进行。

2、容器的基本信息

使用docker ps -a命令可以输出本机上的全部容器列表

 [root@docker-2322030238 ~]# docker ps -aCONTAINER ID   IMAGE         COMMAND       CREATED       STATUS                   PORTS     NAMESd0ba3b089e49   ubuntu        "/bin/bash"   5 weeks ago   Exited (0) 5 weeks ago             elastic_kepler446cd6f8f8cc   hello-world   "/hello"      5 weeks ago   Exited (0) 5 weeks ago             brave_swartz

上述列表反映了容器的基本信息。CONTAINER ID列表示容器ID,IMAGE列表示容器所用镜像的名称,COMMAND列表示启动容器时执行的命令,CREATED列表示容器的创建时间,STATUS列表示容器运行的状态(UP表示运行中,Exited表示已停止),POPTS列表示容器对外发布的端口号,NAMES列表示容器名称

容器ID能保证唯一性,但难于记忆,因此可以通过容器名称来代替容器ID引用容器。可以在执行docker run命令时通过--name选项自行指定。还可以使用docker rename命令为现有容器重命名。

 docker rename d0ba3b089e49 ubuntu_server

3、可写的容器

        容器与镜像的主要不同之处是容器顶部的可写层。一个镜像由多个可读的镜像层组成,正在运行的容器会在这个镜像上面增加一个可写的容器层,所有写入容器的数据(包括添加的新数据或修改的已有数据)都保存在这个可写层中。当容器被删除时,这个可写层也会被删除,但是底层的镜像层保持不变。因此,任何对容器的操作均不会影响到其镜像。 ​

        由于每个容器都有自己的可写容器层,所有的改变都存储在这个容器层中,因此多个容器可以共享访问同一个底层镜像,并且仍然拥有自己的数据状态。

4、磁盘上的容器大小

使用docker ps -s 命令查看一个运行中的容器的大小,SIZE 列会显示两个不同的值

 [root@docker-a ~]# docker run -d httpd495355dcccdb5ff7f0a52a1dd3ff231daa590b7cd16b99911a5bec6b64a88975# 查看该容器的大小CONTAINER ID   IMAGE     COMMAND    ...      NAMES           SIZE495355dcccdb   httpd     "httpd-foreground" ...  peaceful_pike   2B (virtual 148MB)

SIZE列第1个值表示每个容器的可写层当前所用的数据大小。第2个值是虚拟大小,表示该容器所用只读镜像的数据量加上容器可写层大小的和。

磁盘上正在运行的容器所用的磁盘空间每个容器大小和虚拟大小值的总和

5、写时复制策略

写时复制是一个高效率的文件共享复制策略。共享有助于减小镜像大小。复制使容器效率更高

大致步骤:

        1、从镜像各层中搜索要修改的文件,从最新的层开始直到最底层,一次一层,被找到的文件将被添加到缓存中以加速后续操作。

        2、对找到文件的第1个副本执行copy up操作,将其复制到容器的可写层中。

6、容器操作指令

        Docker 提供了相当多的容器操作命令,既包括创建、启动、停止、删除、暂停等容器生命周期管理操作。

Docker还提供了一个统一的容器管理命令docker container,基本语法如下:

docker container 子命令

docker container子命令docker子命令功能
docker container attachdocker attach进入容器
docker container commitdocker commit从当前容器创建新的镜像
docker container cpdocker cp容器和本地文件系统之间复制文件和目录
docker container createdocker create创建新的容器
docker container diffdocker diff检查容器创建以来其文件系统上文件或目录的更改
docker container execdocker exec从正在运行的容器中执行命令
docker container exportdocker export容器的文件系统导出为一个归档文件
docker container inspectdocker inspect显示一个或多个容器的详细信息
docker container killdocker kill杀死”一个正在运行的容器
docker container logsdocker logs获取容器的日志信息
docker container lsdocker ps输出容器列表
docker container pausedocker pause暂停一个或多个容器内的所有进程
docker container portdocker port列出容器的端口映射或特定的映射
docker container prune删除所有停止执行的镜像
docker container renamedocker rename容器重命名
docker container restartdocker restart重启一个或多个容器
docker container rmdocker rm删除一个或多个容器
docker container rundocker run创建一个新的容器并执行命令
docker container startdocker start启动一个或多个已停止的容器
docker container statsdocker stats显示容器资源使用统计信息的实时流
docker container stopdocker stop停止一个或多个正在运行的容器
docker container topdocker top显示容器正在运行的进程
docker container unpausedocker unpause恢复一个或多个容器内被暂停的所有进程
docker container updatedocker update更新一个或多个容器的配置
docker container waitdocker wait阻塞一个或多个容器的运行,直到容器停止运行,然后输出

7、操作

7.1、创建并同时启动容器

使用docker run命令运行一个容器,基本语法:

 docker run[选项]镜像[命令][参数···]

-d(--detach)后台运行容器,并返回容器ID。
-i(--interactive):让容器标准输入保持打开,通常与-t选项同时使用。
-t(--tty):为容器重新分配一个伪输入终端(Pseudo TTY),通常与-i选项同时使用。
-p(--publish):设置端口映射,格式为“主机端口:容器端口”。
--dns:指定容器使用的DNS服务器,默认和主机上的DNS设置一致。
--name:为容器指定一个名称
--rm容器退出时自动删除

 # 启动容器执行命令后自动终止容器,不常用,主要用来测试[root@docker-a ~]# docker run ubuntu /bin/echo "这是一个自动终止的容器"这是一个自动终止的容器​# 启动容器并允许用户交互# 将-1和-t两个选项合并在一起,-t让Docker分配一个伪终端并绑定到容器的标准输入中,则让容器的标准输入保持打开状态,自动进入容器的交互模式,此时可通过终端执行命令[root@docker-a ~]# docker run -it ubuntu /bin/bashroot@d9778e5b51e2:/# root@d9778e5b51e2:/# ls     # 列出当前目录下的文件bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  varroot@d9778e5b51e2:/# exit   # 退出容器exit​# 启动容器并让其以守护进程的形式在后台运行[root@docker-a ~]# docker run -d -p 80:80 --name testweb httpd  # 启动-个Web服务器的容器8320b75a0036c01bc5d1ffda24fbcaa92ad2f61c0a3d81164fb78b9c0563ce5b# 容器启动后在后台运行,并返回一个唯一的容器ID,可以通过该ID 对容器进行进一步操作。也可以通过docker ps命令来查看正在运行的容器的信息[root@docker-a ~]# docker psCONTAINER ID   IMAGE    ...  STATUS          PORTS                  NAMES8320b75a0036   httpd    ...  Up 48 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   testweb​# 由于在后台运行,容器不会将输出直接显示在主机上,使用 docker logs 命令来获取容器的输出信息[root@docker-2322030238 ~]# docker logs testwebAH00558: httpd: Could...

执行docker run命令创建并启动容器时,Docker在后台运行的操作步骤如下:

  • 检查本地是否存在指定的镜像,如果没有就从镜像仓库自动下载这个镜像。
  • 基于镜像创建一个容器并启动它
  • 容器分配一个文件系统,并在镜像层顶部增加一个可读写的容器
  • 从主机配置的网桥接口中将一个虚拟接口桥接到容器
  • 从网桥的地址池中给容器分配一个IP地址
  • 运行用户指定的应用程序。
  • 根据设置决定是否终止容器运行

这种在后台运行容器的方式又称分离(Detached)模式,与之相对的是前台(Foreground)模式。

7.2、创建容器

使用docker create 命令创建一个新的容器,但不启动它,其基本语法

 docker create[选项] 镜像 [命令][参数···]

 # 基于busybox镜像创建一个容器[root@docker-a ~]# docker create -i -t busyboxUnable to find image 'busybox:latest' locallylatest: Pulling from library/busybox7b2699543f22: Pull complete Digest: sha256:c3839dd800b9eb7603340509769c43e146a74c63dca3045a8e7dc8ee07e53966Status: Downloaded newer image for busybox:latestdb0b8744590de26b9c4df8ea942fc06d2499770314dc7c44541687c082749208

这个容器处于已创建(Created)但未启动的状态,最后一行返回的是容器ID,可以使用docker start命令启动容器

7.3、启动容器

使用docker start命令启动一个或多个处于停止状态的容器,其基本语法

docker start[选项]容器[容器…]

# 启动上述容器
[root@docker-a ~]# docker start db0b8744...
db0b8744...

运行中的容器,可以使用docker restart命令重新启动它。

7.4、停止容器

使用docker stop命令停止一个或多个处于运行状态的容器,其基本语法

docker stop [选项]容器[容器···]

# 停止上述容器
[root@docker-a ~]# docker stop db0b8744...
db0b8744...

也可以使用 docker pause命令暂停容器中所有的进程

docker unpause命令,恢复容器中被暂停的所有进程

还可以使用docker kill命令“杀死(强制停止)”一个或多个容器

docker kill [选项]容器[容器…]

7.5、重命名容器

使用docker rename命令为现有的容器重新命名,以便于后续的容器操作,基本语法

docker rename 容器 容器名称

[root@docker-a ~]# docker run -d httpd
36801b2a29907a711eb89affbdc28d8c4f5111ea53eadffcc14829f940f71390
[root@docker-a ~]# docker rename 36801b2a29907a711 myweb
[root@docker-a ~]# docker ps -l
CONTAINER ID   IMAGE     ...    STATUS          PORTS     NAMES
36801b2a2990   httpd     ...    Up 31 seconds   80/tcp    myweb

7.6、显示容器列表

使用docker ps命令显示容器列表,基本语法

docker ps [选项]

主要选项说明如下。
-a(--all)显示所有的容器,包括未运行的容器
-f(--filter):根据条件过滤显示的容器
-l(--latest):显示最近创建容器
-n(--lastint):列出最近创建的n个容器
--no-trunc不截断输出,显示完整的容器信息
-q(--quiet):采用静默模式,只显示容器ID
-s(--size):显示总的文件大小

不带任何选项执行该命令会列出所有正在运行的容器信息。可以使用-a选项列出所有的容器

[root@docker-a ~]# docker ps -a
CONTAINER ID   IMAGE      STATUS       ...    PORTS            NAMES
36801b2a2990   httpd      Up 2 minutes   ...  80/tcp           myweb
...

-f选项可以通过多种条件过滤容器,如id(容器ID)、name(容器名称)、label(由键值对定义的元数据)、status(状态,可用值有created、restarting、running、removing、paused、exited、dead等。

# 列出了已停止的容器
[root@docker-2322030238 ~]# docker ps --filter status=exited
CONTAINER ID   IMAGE     ...      STATUS        PORTS     NAMES
db0b8744590d   busybox    ...  Exited (137) 10 minutes ago      modest_feistel
...

通过shell命令替换docker ps命令可以完成容器的批量操作。

# 暂停正在运行的所有容器
docker pause $(docker ps -f status=running -q)

7.7、查看容器详细信息

使用docker inspect命令来查看容器的详细信息,也就是元数据。

[root@docker-a ~]# docker inspect --format='{{.Name}}' 36801b2a2990
/myweb

通过JSON格式的State子节获取容器的状态元数据。

[root@docker-a ~]# docker inspect --format='{{json .State}}' myweb
{"Status":"paused","Running":true...

7.8、进入容器

方法一:使用docker attach命令连接到正在运行的容器,其语法格式

docker attach [选项] 容器

# 连接到一个运行中的容器并从中退出的过程
[root@docker-a ~]# docker run -d --name topdemo ubuntu /usr/bin/top -b
73c97d3a43c30c0c4b03574c3a79a56e5da66d372c36427769eaf5c5db9026d3
[root@docker-2322030238 ~]# docker attach topdemo 
...
top - 10:07:41 up
...
[root@docker-a ~]# docker ps -a | grep topdemo
73c97d3a43c3   ubuntu        "/usr/bin/top -b"       39 seconds ago   Exited (0) 13 seconds ago                                         topdemo

Ctrl+C 组合键不仅会从容器退出(脱离容器),而且会导致容器停止。要使容器依然运行,就需要在执行Docker run 命令运行容器时加上--sig-proxy=false 选项,确保按 Ctrl+C 组合键或Ctrl+D组合键不会停止容器

docker attach --sig-proxy=false topdemo

这个命令比较过时,更多的Docker用户会考虑使用docker exec命令来实现相同的功能

方法二:使用docker exec命令在正在运行的容器中执行命令,其语法格式

docker exec [选项]容器 命令[参数···]

-d选项表示分离模式, 在后台运行命令;-i选项表示即使没有连接上也保持标准输入处于打开状态是一种交互模式-t选项用于分配一个伪终端

# 进入一个运行中的容器,交互执行命令,并从容器中退出的过程
[root@docker-2322030238 ~]# docker start topdemo
topdemo
[root@docker-2322030238 ~]# docker exec -it topdemo /bin/bash
root@73c97d3a43c3:/# psPID TTY          TIME CMD7 pts/0    00:00:00 bash15 pts/0    00:00:00 ps
root@73c97d3a43c3:/# exit
exit
[root@docker-2322030238 ~]# 

7.9、删除容器

使用docker rm命令删除一个或多个容器,基本语法

docker rm [选项] 容器 [容器…]

默认情况下,只能删除没在运行的容器。要删除正在运行的容器,需要使用-f(--force)选项通过SIGKILL信号强制删除:

[root@docker-2322030238 ~]# docker rm -f topdemo
topdemo

还有两个选项与网络连接数据卷有关:-l(--link)选项设置是否删除容器的网络连接,而保留容器本身;-v(--volumes)选项设置是否删除与容器关联的卷。


http://www.ppmy.cn/devtools/8324.html

相关文章

Day 27 39. 组合总和 40.组合总和II 131.分割回文串

组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 target)都是正整数。解集不能…

从事数据分析相关工作技术总结

在数据分析领域,掌握一系列技术和工具是非常重要的。以下是一些关键技术和技能,它们对于成为一名成功的数据分析师至关重要: 统计学和概率论 理基本的统计概念,如均值、中位数、方差、标准差、概率分布等。掌握假设检验、回归分析…

深度学习基础——循环神经网络的结构及参数更新方式

深度学习基础——循环神经网络的结构及参数更新方式 深度学习领域的一大重要分支是循环神经网络(Recurrent Neural Networks,简称RNN),它是一种用于处理序列数据的神经网络结构。与传统的前馈神经网络不同,循环神经网…

Git 远程仓库多人协作

文章目录 前言一、操作远程仓库1、克隆远程仓库2、向远程仓库推送3、拉取远程仓库4、删除远程库 二、多人协作 前言 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。那么该怎么分布呢?首先肯定得有一台机器充当“原始库”&…

Stable Diffusion UI 从安装到实现文字图片融合(光影字,错觉图)图片制作详细教程

前言 最近在实践大模型本地部署,前几天在本地部署了一个ChatGLM大模型,刚好环境搭好了,也支持跑Stable Diffusion,所以就安装了再尝试一下。 原因是之前在B站上有大佬做了一个Windows电脑能一键运行的Stable Diffusion的安装包&…

LeetCode第797题: 所有可能的路径

目录 1.问题描述 2.问题分析 1.问题描述 给你一个有 n 个节点的有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)。 graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08…

C语言修炼——什么是流?什么是文件?什么是文件操作?

目录 一、为什么使用文件?二、什么是文件?2.1 程序文件2.2 数据文件2.3 文件名 三、二进制文件和文本文件四、文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 五、文件的顺序读写5.1 顺序读写函数介绍a. fgetcb.…

服务器Linux上杀死特定进程的命令:kill

1、查看用户XXX正在运行的进程 top -u xxx2、查看想要杀死的进程对应的PID 先找到此进程对应的命令 取其中的main-a3c.py即可 ps -aux | grep main-a3c.py可以看到对应的PID是1325390使用kill杀死对应PID的进程 kill -9 1325390成功,gpustat可以看到之前一直占…