[docker] 核心知识 - 容器/镜像的管理和操作

[docker] 核心知识 - 容器/镜像的管理和操作

想要查看完整的指令,可以通过 docker --help 列举所有的指令,这里会提到一些比较常用的核心指令

查看容器的状态

这个应该是最常用的指令,语法为 docker pspsprocess status 的缩写,使用方式如下:

# 查看当前正在运行的 processdocker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED      STATUS      PORTS                                         NAMES
ec2f40d48498   mysql     "docker-entrypoint.s…"   5 days ago   Up 5 days   8080/tcp, 0.0.0.0:3306->3306/tcp, 33060/tcp   nice_kirch# 查看所有的 process,包括已经终止的容器docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS                        PORTS                                         NAMES
801fe6378b3c   ca61c1748   "docker-entrypoint.s…"   About a minute ago   Exited (137) 32 seconds ago                                                 inspiring_wiles
ec2f40d48498   mysql       "docker-entrypoint.s…"   5 days ago           Up 5 days                     8080/tcp, 0.0.0.0:3306->3306/tcp, 33060/tcp   nice_kirch# 查看帮助docker ps --helpUsage:  docker ps [OPTIONS]List containersAliases:docker container ls, docker container list, docker container ps, docker psOptions:-a, --all             Show all containers (default shows just running)-f, --filter filter   Filter output based on conditions provided--format string   Format output using a custom template:'table':            Print output in table format with column headers (default)'table TEMPLATE':   Print output in table format using the given Go template'json':             Print in JSON format'TEMPLATE':         Print output using the given Go template.Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates-n, --last int        Show n last created containers (includes all states) (default -1)-l, --latest          Show the latest created container (includes all states)--no-trunc        Don't truncate output-q, --quiet           Only display container IDs-s, --size            Display total file sizes

结束&重新启动容器

结束容器进程

这个没有具体细说过,不过前面有用,语法为 docker stop,为 docker container stop [OPTIONS] CONTAINER [CONTAINER...] 的缩写

开始容器

docker start

之前用的是 docker run,不过 docker run 后面跟着的是镜像,而非容器,具体语法为 docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]docker run 为 alias 缩写。使用 docker run 会新建一个容器去运行当前镜像。

有些情况下,docker run 并不一定是一个最好的解决方案,尤其是在想要继续运行一个终止的容器,这时候可以使用 docker start 去开始已经终止的容器,使用方式如下:

# restart the container, but it will not block the process, unlike using docker run
# ca61c1748 已经关闭了docker start inspiring_wiles
inspiring_wiles
❯ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                         NAMES
801fe6378b3c   ca61c1748   "docker-entrypoint.s…"   3 minutes ago   Up 2 seconds   0.0.0.0:3000->80/tcp                          inspiring_wiles
ec2f40d48498   mysql       "docker-entrypoint.s…"   5 days ago      Up 5 days      8080/tcp, 0.0.0.0:3306->3306/tcp, 33060/tcp   nice_kirch

重新开始容器

docker restart

restartstart 最大的区别在于 restart 会先执行一个 stop 的操作

如果容器运行已经终止,那么二者没有区别

attached & detached 容器

之前没截图,不过在运行 docker run 的时候,docker 会锁定当前终端,无法进行下一步的操作,但是使用 docker start 就不会发生这种情况。这是因为:

  • 前者在 attached 的模式下运行,这个模式下 docker 会在终端输出当前 container 的 log 和报错信息,同时也可以与当前容器进行互动

    可以理解成在 attached 模式下,终端的互动会对接到 docker 的 STDOUT, STDERR

    默认情况下不绑定 STDIN,但是可以使用 -i flag 去开启

  • 后者在 detached 的模式下运行,docker 不会和终端进行互动

使用 -d 这个 flag 可以用来运行 detached 模式:

docker run -p 3030:80 -d ca61c1748
5a4e23de94e7b0a68948fc8c5d7b6f7abbfce7add8848510a91fab95adcaf131
❯ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                  NAMES
5a4e23de94e7   ca61c1748   "docker-entrypoint.s…"   3 seconds ago    Up 2 seconds    0.0.0.0:3030->80/tcp   confident_montalcini
801fe6378b3c   ca61c1748   "docker-entrypoint.s…"   38 minutes ago   Up 35 minutes   0.0.0.0:3000->80/tcp   inspiring_wiles

这个情况下,使用 docker run 也不会 block 终端,如图:

在这里插入图片描述


使用 -a 这个 flag 可以运行 attached 模式,如:

docker start -a confident_montalcini

在这里插入图片描述

可以看到这里的终端被 block 了


另一种在容器启动后想要继续 attach,则是可以使用 attach 这个指令,如:

docker start confident_montalcini
confident_montalcini
❯ docker attach confident_montalcini
docker ps

在这里插入图片描述

logs

docker logs 是用来查看 docker 容器的日志,即负责将容器的 STDOUT & STDERR 输出到终端,用法如下:

# show logsdocker logs inspiring_wiles
learn docker
learn docker in depth
learn k8s# show usagedocker logs --helpUsage:  docker logs [OPTIONS] CONTAINERFetch the logs of a containerAliases:docker container logs, docker logsOptions:--details        Show extra details provided to logs-f, --follow         Follow log output--since string   Show logs since timestamp (e.g. "2013-01-02T13:23:37Z") or relative (e.g. "42m" for 42 minutes)-n, --tail string    Number of lines to show from the end of the logs (default "all")-t, --timestamps     Show timestamps--until string   Show logs before a timestamp (e.g. "2013-01-02T13:23:37Z") or relative (e.g. "42m" for 42 minutes)

默认情况下,docker logs 会输出从容器启动后的所有日志,所以也经常会搭配其他的 flag 一起使用,如使用 -f 会进入 attached 模式(只有 STDOUT & STDERR),比较适合 debug:

docker logs -f inspiring_wiles
learn docker
learn docker in depth
learn k8s
^C%

效果如下:

在这里插入图片描述

一般日常开发中用的比较多的是 -n <number> 去查看最后 <number> 条数据,搭配 -f 一起使用进行 debug,或者直接用时间戳查看 log:

docker logs -f -n 1 inspiring_wiles
learn k8s
^C%
❯ docker logs -t --since 20m inspiring_wiles
2024-04-14T18:22:33.363234022Z learn docker
2024-04-14T18:22:47.814615869Z learn docker in depth
2024-04-14T18:22:51.324651322Z learn k8s

但是在其他环境下,如 tde/qc/uat/prod,遇到问题 aws 会发送警报邮件,在收到警告邮件后使用 --since 搭配 --until 一起去查看固定时间段中发生的问题:

docker logs --since "2023-01-02T12:00:00Z" --until "2023-01-02T14:00:00Z" inspiring_wiles# 本地没有任何数据,所以输出是空的

这个时间戳会输出 1 月 2 日 12 点-2 点的所有日志,timezone 的话是 UTC。

补充一下,虽然 attached 和 log 绑定的都是 STDOUT & STDERR,但是 attached 是可以使用 -i 的 flag 绑定 interactive 模式,但是 log 是只读的

interactive 模式

这个绑定的是 STDIN

案例的话这里用一个 python 脚本去跑好了,我本地也没装 python,用 docker 正好,下面是脚本:

from random import randintmin_number = int(input('Please enter the min number: '))
max_number = int(input('Please enter the max number: '))if (max_number < min_number):print('Invalid input - shutting down...')
else:rnd_number = randint(min_number, max_number)print(rnd_number)

这是配置的 Dockerfile:

FROM pythonWORKDIR /appCOPY . /appCMD [ "python", "rng.py" ]

但是直接运行的话,会失败:

# 省略掉builddocker run 71d0f063594b4f8
Please enter the min number: Traceback (most recent call last):File "/app/rng.py", line 3, in <module>min_number = int(input('Please enter the min number: '))^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
EOFError: EOF when reading a line

这是因为 python 脚本预期会从终端中获取用户输入的信息,默认情况下 docker 的运行是 attached 模式,但是STDIN 并不会被绑定,因此会报错。想要开启互动模式就需要使用 -i,同时经常搭配 -t 去进行 terminal 的授权:

docker run -it 71d0f063594b4f8
Please enter the min number: 0
Please enter the max number: 10
3

重新运行容器,使用 attached 模式并不会报错,不过它也不会从终端读取数据,所以需要用 -a -i 这个 flag 去完整的实现功能:

docker start -ai wizardly_lamarr
Please enter the min number: 10
Please enter the max number: 20
17

删除容器/镜像

跑了一些案例之后我本地也有了一些用不上的容器和镜像,多了也会占用空间,所以也需要定期进行清理,删除的 flag 是 -rm

docker rm wizardly_lamarr sweet_shannon festive_faraday confident_montalcini inspiring_wiles
wizardly_lamarr
sweet_shannon
festive_faraday
confident_montalcini
inspiring_wiles❯ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED      STATUS                   PORTS     NAMES
ec2f40d48498   mysql     "docker-entrypoint.s…"   5 days ago   Exited (0) 2 hours ago             nice_kirch

对应删除镜像的指令为 rmi:

docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
<none>       <none>    71d0f063594b   14 minutes ago   1.02GB
<none>       <none>    ca61c1748170   2 hours ago      1.11GB
mysql        latest    374f9fbf70c1   5 days ago       632MB
❯ docker rmi 71d0f063594b ca61c1748170
Deleted: sha256:71d0f063594b4f80bc1e17e0d6631a943584454ff982ba526cdaa4f7368065b1
Deleted: sha256:ca61c17481707811537498b2efd412d03631e461a0d16c4deb4d98c496f3e2b6
❯ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
mysql        latest    374f9fbf70c1   5 days ago   632MB

只有在 没有 容器(包括已经终止的容器)使用镜像的时候,当前镜像才能被删除

自动删除已经停止的容器

其实准确的说应该是在容器被停止时,自动删除自己。使用方法是在运行 run 的时候,添加 --rm flag:

docker run -p 3030:80 -d --rm ca61c1748
92faae4c200c55ec680818dd492838fc318abb3cf1bbfe6bcd0496ddb066fdca
❯ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                  NAMES
92faae4c200c   ca61c1748   "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   0.0.0.0:3030->80/tcp   naughty_thompson
❯ docker stop naughty_thompson
naughty_thompson
❯ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED      STATUS                   PORTS     NAMES
ec2f40d48498   mysql     "docker-entrypoint.s…"   5 days ago   Exited (0) 2 hours ago             nice_kirch

本地容器互相传输文件

之前碰到的一个案例:[spring] Spring Boot REST API - 项目实现,这个里面我把本地的 sql 文件传到了容器里去运行。用的指令都是 docker cp,接受的参数是 <filename><container_name>:<filename>,文件名后跟 / 代表的是文件夹。

不过需要注意的是,docker 好像不支持多个文件的复制,之前尝试使用 *.sql 失败了,后来研究了一下 bash script 完成了 cv 的过程……现在想想直接 cv 文件夹应该也可以……

从本地向容器传文件的指令如下:

docker cp rng.py ecstatic_kepler:/py_script
Successfully copied 2.05kB to ecstatic_kepler:/py_script❯ docker exec -it ecstatic_kepler bash
root@786e02116e1e:/app# cd ..
root@786e02116e1e:/# cat py_script
from random import randintmin_number = int(input('Please enter the min number: '))
max_number = int(input('Please enter the max number: '))if (max_number < min_number):print('Invalid input - shutting down...')
else:rnd_number = randint(min_number, max_number)print(rnd_number)root@786e02116e1e:/#

从容器向本地 cv 文件:

# copy file from container to localdocker cp ecstatic_kepler:/py_script new_py_script.py
Successfully copied 2.05kB to /Users/luhan/study/docker/py-script/new_py_script.py
❯ cat new_py_script.py
from random import randintmin_number = int(input('Please enter the min number: '))
max_number = int(input('Please enter the max number: '))if (max_number < min_number):print('Invalid input - shutting down...')
else:rnd_number = randint(min_number, max_number)print(rnd_number)

使用场景如下:

  • 需要从本地 cv 一些配置文件到容器里,就像上面的案例一样
  • 需要从容器里面获取一些 log,这也是另一个使用场景

命名与版本

开启容器是,使用 --name 即可:

docker run -p 3030:80 -d --rm --name node-app ca61c1748
d83e45b95eaf1e01197b2cd75f56c4fcc0dfd985badab2799baece79cc2a2409
❯ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                  NAMES
d83e45b95eaf   ca61c1748   "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds   0.0.0.0:3030->80/tcp   node-app

镜像稍微复杂一些,它的命名规范为 <name>:<tag>,如:

docker build -t node-app:latest .
# 省略其他 build 过程=> => naming to docker.io/library/node-app:latest                                                                                                                                       0.0s❯ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
node-app     latest    ca61c1748170   3 hours ago   1.11GB
node         latest    5212d7dd5bd4   3 days ago    1.1GB
mysql        latest    374f9fbf70c1   5 days ago    632MB# run docker image to create a containerdocker run -p 3030:80 -d --rm --name node-app node-app:latest
f4354ad44f955b0ff4f937e5973d1d2bc5eb5c35eb6ead440fae5307253d9416

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread时钟管理

操作系统需要通过时间来规范其任务,主要介绍时钟节拍和基于时钟节拍的定时器。 时钟节拍 任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。 RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_P…

租用马来西亚服务器:稳定高效的网络选择

马来西亚首都是吉隆坡。作为一个新兴的多元化经济国家&#xff0c;也属于亚洲四小龙之一。地理位置优越&#xff0c;中间隔着南中国海。一部分是北接泰国的位于马来半岛的西马来西亚&#xff0c;另一部分则是东马来西亚&#xff0c;在婆罗洲岛的北部。这种地理位置有利于促进该…

IGBT退饱和现象解析与防范

IGBT是一种重要的功率半导体器件&#xff0c;广泛应用于电力电子领域&#xff0c;如变频器、电动机驱动、电力传输等。在这些应用中&#xff0c;IGBT的导通和关断特性至关重要&#xff0c;而退饱和是IGBT工作过程中的一个重要现象。 IGBT的退饱和定义 退饱和是指IGBT在导通状态…

WordPress用户福音:Elementor Pro国产版替代方案,全新中文界面更懂你

如果你正在考虑创建自己的网站&#xff0c;那么在第一次谷歌搜索时&#xff0c;你可能已经看到了WordPress、Elementor和网站构建器这些专业名称。WordPress是最受欢迎的网站平台之一&#xff0c;这不难理解&#xff1a;它高度可定制&#xff0c;易于学习&#xff0c;而且是免费…

java算法day55 | 动态规划part16 ● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 思路&#xff1a; 和1143.最长公共子序列这道题思路相同&#xff0c;只不过需要对return的数据做一些操作。 class Solution {public int minDistance(String word1, String word2) {int[][] dpnew int[word1.length()1][word2.length()1];for(int …

【Linux 驱动基础】设备树中断

# 前置知识 interrupts 文档 Specifying interrupt information for devices 1) Interrupt client nodes -------------------------Nodes that describe devices which generate interrupts must contain an "interrupts" property, an "interrupts-extende…

业务与数据的终极对决:如何让大数据成为企业的超能力?

在数字化转型的浪潮中&#xff0c;企业如同在茫茫数据海洋中航行的船只&#xff0c;而数据资产管理就是指引航向的罗盘。但是&#xff0c;当业务需求与数据脱节、数据孤岛林立、业务流程与数据流程不同步、以及业务增长带来的数据管理挑战成为阻碍&#xff0c;我们该如何突破重…

ios证书过期需要重新安装app

根据近日工业和信息化部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;相信不少要进行IOS平台App备案的朋友遇到了一个问题&#xff0c;就是apple不提供云管理式证书的下载&#xff0c;也就无法获取公钥及证书SHA-1指纹。 已经上架的应用不想重…

如何让表单流程引擎提质增效?

随着社会的进步和科技的发展&#xff0c;低代码技术平台在诸多行业中成为利用价值高的平台。对于解决信息孤岛、部门协作不给力、办公效率不高等缺点&#xff0c;低代码技术平台都可以为其架设出一道优质的桥梁&#xff0c;共同朝着高效率的流程化办公方向前进。表单流辰引擎是…

31、链表-K个一组反转链表

思路&#xff1a; 首先知道如何反转链表&#xff0c;其次找出每组的开始节点和结束节点&#xff0c;然后对于不足与k个的链表保持原状。 代码如下&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (headnull||k1){return head;}ListN…

内网渗透-cobaltstrike之cs上线获取shell

cobaltstrike之cs上线获取shell 文章目录 cobaltstrike之cs上线获取shell前言一、什么是cobaltstrike二、cs上线获取shell 1.环境搭建 CS安装windows连接 2. cs上线获取shell 总结 前言 一、什么是cobaltstrike CobaltStrike是一款渗透测试神器&#xff0c;被业界人称为CS神器…

Python基于卷积神经网络的车牌识别系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

结构体的内存对齐

目录 对齐规则&#xff1a; 为什么存在内存对齐&#xff1f; 对齐规则&#xff1a; 1、结构体的第一个成员对齐到和结构体起始位置偏移量为0的地址处 2、其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。 对齐数 编译器默认的一个对齐数 与 …

网站添加PWA支持,仅需三步,无视框架的类型

总结起来&#xff0c;网站配置PWA简单步骤为&#xff1a; 编写 manifest.json&#xff1b;编写 serviceWorker.js&#xff1b;在 index.html 引入上述两个文件&#xff1b;把上述三个文件放在网站根目录(或者同一目录下)&#xff1b;网站需要部署在https环境才能触发&#xff…

Cosmopolitan Libc 工作原理与多平台使用方法教程(x64 Linux / WSL2 / Windows)

⚠️阅读前请注意 本博客适用于Cosmopolitan Libc 3.X版本&#xff0c;不适用于Cosmopolitan Libc 2.X版本。Cosmopolitan Libc 是一个非常年轻的项目&#xff0c;可能存在各种问题。Cosmopolitan Libc 仍处于快速迭代开发之中&#xff0c;本文内容在一定时期内会持续更新。 Co…

如何使用CANoe进行LINstress测试

1.创建Stress测试工程 依次按照1-3的步骤建立工程 4部分&#xff0c;主要是Description of the sample configurations&#xff08;对示例工程的描述&#xff09; 5部分主要是显示示例工程的位置和简单描述 工程打开后如下图所示 重点关注红框标注的地方&#xff0c;重新截一…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.5 年末操作:维护新财政年度会计凭证编号范围

2.6.5 年末操作&#xff1a;维护新财政年度会计凭证编号范围 财务系统的维护者要在每年年末预先设置好下一年度的会计凭证编号范围&#xff08;number range&#xff09;&#xff0c;以便下一年度会计凭证能够顺利生成。这一操作一定要在下一年度1月1日以前预先完成。 …

半导体材料(二)——半导体导电特性

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第二篇笔记&#xff0c;上一篇传送门。 半导体导电特性 载流子的迁移 外电场下电子和空穴定向位移产生电流。电流密度可写作&#xff1a; J e ( μ n n μ p p ) E σ E Je(\mu_n n\mu_p p)E\sigm…

行式存储VS列式存储对比

行式存储&#xff1a; 一行代表一个记录的所有字段。 可以快速读取和写入单条记录。 如果要检索一条数据&#xff0c;数据库会读取or写入整条记录&#xff0c;包含所有相关字段。 列式存储&#xff1a; 表中每一列的数据连续存放。这种方式在需要对某一列进行大量运算或分析时…

「 典型安全漏洞系列 」14.NoSQL注入漏洞详解

NoSQL注入是一个漏洞&#xff0c;攻击者能够干扰应用程序对NoSQL数据库进行的查询&#xff0c;本文我们将研究如何测试一般的NoSQL漏洞&#xff0c;然后重点研究如何利用MongoDB中的漏洞&#xff08;MongoDB是最流行的NoSQL数据库&#xff09;。 1. 什么是NoSQL注入 NoSQL注入…