[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 --help

Usage:  docker ps [OPTIONS]

List containers

Aliases:
  docker container ls, docker container list, docker container ps, docker ps

Options:
  -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 --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Aliases:
  docker container logs, docker logs

Options:
      --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 randint

min_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 python

WORKDIR /app

COPY . /app

CMD [ "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 randint

min_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 randint

min_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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java:多线程解决生产者消费者问题

生产者消费者问题 生产者消费者问题&#xff0c;也称有限缓冲问题&#xff0c;是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两种线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Radio Button的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Radio Button的使用及说明 文章编号&#xff…

【机器学习】机器学习创建算法第6篇:线性回归,学习目标【附代码文档】

机器学习&#xff08;算法篇&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习算法课程定位、目标&#xff0c;K-近邻算法定位,目标,学习目标,1 什么是K-近邻算法,1 Scikit-learn工具介绍,2 K-近邻算法API。K-近邻算法&#xff0c;1.4 …

云服务器降价,阿里腾讯华为京东云优惠价格表整理

现在租一个服务器多少一个月&#xff1f;优惠价格低至3.8元1个月&#xff0c;租用一个月云服务器收费价格表&#xff1a;阿里云和腾讯云2核2G3M服务器优惠价格61元一年&#xff0c;折合一个月5元&#xff0c;京东云轻量云主机5.8元一个月&#xff0c;华为云服务器优惠价格3.8元…

如何落地一个FaaS平台?

简介&#xff1a; 函数即服务&#xff08;FaaS&#xff09;作为云计算 2.0 时代重要的发展方向&#xff0c;能够从工程效率、可靠性、性能、成本等方面给开发者带来巨大的价值&#xff0c;尤其是能够极大地提升研发效率。因此&#xff0c;拥抱FaaS成为开发者关心的重要技术领域…

【Java】maven的生命周期和概念图

maven的生命周期&#xff1a; 在maven中存在三套"生命周期"&#xff0c;每一套生命周期,相互独立,互不影响的,但是中同一套生命周期里,执行后面的命令会自动先执行前面的命令 CleanLifeCycle&#xff1a;清理的生命周期 clean defaultLifeCycle&#xff1a;默认的…

YashanDB亮相数据技术嘉年华精彩不断

4月12-13日&#xff0c;由墨天轮数据社区和中国数据库联盟&#xff08;ACDU&#xff09;主办的第十三届数据技术嘉年华 &#xff08;DTC 2024&#xff09;在北京召开。崖山数据库系统YashanDB受邀亮相&#xff0c;多维度展示了YashanDB的独特技术、创新成果与行业应用。 数据库…

大话设计模式之享元模式

享元模式是一种结构型设计模式&#xff0c;旨在有效地支持大量细粒度的对象共享&#xff0c;从而减少内存消耗和提高性能。 在享元模式中&#xff0c;对象分为两种&#xff1a;内部状态&#xff08;Intrinsic State&#xff09;和外部状态&#xff08;Extrinsic State&#xf…

代码随想录阅读笔记-回溯【复原IP地址】

题目 给定一个只包含数字的字符串&#xff0c;复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201…

D3-八数码

D3-八数码 题目描述解题思路代码如下 题目描述 解题思路 本题若直接在3*3网格中思考较为困难&#xff0c;可以转换为一维的字符串&#xff0c;在一维字符串中考虑较为简单&#xff0c;要注意本题中两个字符交换位置时只能是x和另外字符交换&#xff0c;本题另外一个难点在于如何…

TypeScript系列之-深度理解基本类型画图讲解

JS的类型(8)&#xff1a; null undefined string number boolean bigint symbol object&#xff08;含 Array, Function,Date.....&#xff09; TS的类型(87): 以上所有&#xff0c;加上 void, never, enum, unknown, any 再加上自定义类型 type interface 上一节我们说…

判断IQ水平-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第50讲。 判断IQ水平&#…

利用栈删除数组中重复元素

先将数据排序&#xff08;降序或升序&#xff09; 建立一个“栈”&#xff0c;三种情况&#xff1a; 1.栈为空&#xff1a;压入一个元素 2.栈不为空 且 栈顶元素不等于将入栈元素&#xff1a;压入一个元素 3.栈不为空 且 栈顶元素等于将入栈元素&#xff1a;删除将压入元素…

SCI 四区(JEI)投稿到录用过程中的经历和心得体会

计算机视觉领域中&#xff0c;包含目标检测、三维重建、语义分割、图像分类等分支。其中&#xff0c;目标检测分支最卷&#xff0c;你知道的&#xff0c;没有背景和资源&#xff0c;发一篇SCI属实不易。本篇博客详细介绍本人投稿到录用过程中的经历和心得。 目录 1. 硬件资源落…

微信云开发小程序的服务器是属于服务商的还是商家的

越来越多的小程序&#xff0c;选择使用微信云开发来进行开发。然而&#xff0c;关于微信云开发小程序的服务器归属权问题&#xff0c;往往会引起一些商家的疑虑。本文将详细解析微信云开发小程序的服务器是属于服务商的还是商家的。 首先&#xff0c;我们需要明确微信云开发的概…

maven引入外部jar包

将jar包放入文件夹lib包中 pom文件 <dependency><groupId>com.jyx</groupId><artifactId>Spring-xxl</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/lib/Spr…

1042: 中缀表达式转换为后缀表达式

解法&#xff1a;直接给算法 创建一个栈和一个空的后缀表达式字符串。 遍历中缀表达式中的每个字符。 如果当前字符是操作数&#xff0c;直接将其添加到后缀表达式字符串中。 如果当前字符是操作符&#xff0c;需要将其与栈顶的操作符进行比较&#xff1a; 如果栈为空&#…

动态规划专练( 337.组合总和Ⅳ)

337.组合总和Ⅳ 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3], target 4 输出&#x…

2022年蓝桥杯省赛软件类C/C++B组----积木画

想借着这一个题回顾一下动态规划问题的基本解法&#xff0c;让解题方法清晰有条理&#xff0c;希望更多的人可以更轻松的理解动态规划&#xff01; 目录 【题目】 【本题解题思路】 【DP模版】 总体方针&#xff1a; 具体解题时的套路&#xff1a; 【题目】 【本题解题思…

Python判断节假日的几种方式,你学废了吗?

最近在推进信息安全巡检的工作&#xff0c;按公司制度要求和信息安全标准&#xff0c;要求按时对硬件设备、网络、机房、应用系统、数据库等等做巡检工作。为了保证达到信息安全的目标&#xff0c;要求在每周四和节假日的前一天对各类设备和系统进行巡检。 1、使用holidays库判…