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

news2024/12/26 11:03:27

[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

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

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

相关文章

华为欧拉系统(openEuler-22.03)安装深信服EasyConnect软件(图文详解)

欧拉镜像下载安装 iso镜像官网下载地址 选择最小化安装&#xff0c;标准模式 换华为镜像源 更换华为镜像站&#xff0c;加速下载&#xff1a; sed -i "s#http://repo.openeuler.org#https://mirrors.huaweicloud.com/openeuler#g" /etc/yum.repos.d/openEuler.r…

Lobe UI - 基于 AntDesign 开发的 AIGC Web 应用的开源 UI 组件库

今天推荐一个可以快速开发 ChatGPT UI 界面的组件库&#xff0c;质量很高&#xff0c;拿来就能用。 Lobe UI 是由 lobehub 团队开发的一套 web UI 组件库&#xff0c;和我之前推荐的很多通用型的 UI 组件库不同&#xff0c;Lobe UI 是专门为目前火热的 AIGC 应用开发而打造&am…

2.整数表示

系列文章目录 信息的表示和处理 : Information Storage&#xff08;信息存储&#xff09;Integer Representation&#xff08;整数表示&#xff09;Integer Arithmetic&#xff08;整数运算&#xff09;Floating Point&#xff08;浮点数&#xff09; 文章目录 系列文章目录前…

软件设计不是CRUD(18):像搭积木一样搭建应用系统(上)——单个应用系统的搭建过程

1、概述 之前的文章本专题花了大量文字篇幅,介绍如何基于业务抽象的设计方式完成应用系统各个功能模块的设计工作。而之所以进行这样的功能模块设计无非是希望这些功能模块在具体的项目实施过程中,能够按照当时的需求快速的、简易的、稳定的、最大可能节约开发成本的形成可用…

腾讯EdgeOne产品测评体验——开启安全防护,保障数据无忧

当今时代数字化经济蓬勃发展人们的生活逐渐便利&#xff0c;类似线上购物、线上娱乐、线上会议等数字化的服务如雨后春笋般在全国遍地生长&#xff0c;在人们享受这些服务的同时也面临着各式各样的挑战&#xff0c;如网络数据会不稳定、个人隐私容易暴露、资产信息会被攻击等。…

RabbitMQ消息模型之Direct消息模型

Direct消息模型 * 路由模型&#xff1a; * 一个交换机可以绑定多个队列 * 生产者给交换机发送消息时&#xff0c;需要指定消息的路由键 * 消费者绑定队列到交换机时&#xff0c;需要指定所需要消费的信息的路由键 * 交换机会根据消息的路由键将消息转发到对应的队…

C++vector类(个人笔记)

vector类 1.熟悉vector接口以及使用1.1vector的定义1.2vector迭代器使用1.3vector空间增长1.4vector增删查改1.5vector迭代器失效问题&#xff08;重点&#xff09; 2.vector的一些笔试题3.模拟实现vector 1.熟悉vector接口以及使用 vector的C官网文档 1.1vector的定义 (con…

基于Python的卷积网络的车牌识别系统,附源码

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

深入剖析Tomcat(二) 实现一个简单的Servlet容器

现在开始《深入剖析Tomcat》第二章的内容&#xff0c;第一章中&#xff0c;我们编码实现了一个能正常接收HTTP请求并返回静态资源的Web容器&#xff0c;这一章开始引入Servlet的概念&#xff0c;使我们的服务能根据请求动态返回内容。 Servlet是什么&#xff1f; 这是首先要弄…

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息&#xff1a; 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列&#xff0c;用于发送&#xff0c;设置播放…

docker-compose yaml指定具体容器网桥ip网段subnet;docker创建即指定subnet;docker取消自启动

1、docker-compose yaml指定具体容器网桥ip网段subnet docker-compose 启动yaml有时可能的容器网段与宿主机的ip冲突导致宿主机上不了网&#xff0c;这时候可以更改yaml指定subnet 宿主机内网一般是192**&#xff0c;这时候容器可以指定172* version: 3.9 services:coredns:…

内网渗透-域环境的搭建

域环境的搭建 文章目录 域环境的搭建前言一、什么是域环境 什么是域内网基础知识点 二、域环境的搭建 1. 部署域结构2.如何加入域3.SRV出错及解决办法4.SRV记录注册不成功的可能原因 禁用域中的账户将计算机退出域添加域用户总结 前言 一、什么是域环境 什么是域 域是一种管…

盘点2024年最新可用免费云服务器

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始使用云服务器来满足各种业务需求。云服务器作为云计算的核心服务之一&#xff0c;以其弹性扩展、按需付费等特点受到广泛关注。本文将为大家盘点2024年最新可用免费云服务器&#xff0c;助力大家轻松上云&#xf…

浏览器工作原理与实践--CSRF攻击:陌生链接不要随便点

在上一篇文章中我们讲到了XSS攻击&#xff0c;XSS 的攻击方式是黑客往用户的页面中注入恶意脚本&#xff0c;然后再通过恶意脚本将用户页面的数据上传到黑客的服务器上&#xff0c;最后黑客再利用这些数据进行一些恶意操作。XSS攻击能够带来很大的破坏性&#xff0c;不过另外一…

量子飞跃:从根本上改变复杂问题的解决方式

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨王珩 编译/排版丨沛贤 深度好文&#xff1a;1000字丨5分钟阅读 利用多功能量子比特的量子计算机已处于解决复杂优化问题的最前沿&#xff0c;例如旅行商问题&#xff0c;这是一个典型的…

Python实现时间序列ARIMA模型(附带超详细理论知识和完整代码实现)

文章目录 0 结果1 介绍2 建模2.1 预备知识2.1.1 ADF检验结果&#xff08;单位根检验统计量&#xff09;2.1.2 差分序列的白噪声检验&#xff08;这里使用Ljung-Box检验&#xff09;2.1.3 ARIMA模型&#xff08;差分整合移动平均自回归模型&#xff09;的三个参数:p&#xff0c;…

探索分布式技术--------------注册中心zookeeper

目录 一、ZooKeeper是什么 二、ZooKeeper的工作机制 三、ZooKeeper特点 四、ZooKeeper数据结构 五、ZooKeeper应用场景 5.1统一命名服务 5.2统一配置管理 5.3统一集群管理 5.4服务器动态上下线 5.5软负载均衡 六、ZooKeeper的选举机制 6.1第一次启动选举机制 6.2非…

家居网购项目(Ajax验证用户名+上传图片)

文章目录 1.Ajax验证用户名1.程序框架图2.修改MemberServlet3.修改login.jsp4.结果展示 2.Ajax判断验证码是否输入正确1.修改MemberServlet2.修改login.jsp3.结果展示 3.Ajax添加购物车1.程序框架图2.修改CartServlet2.修改index.jsp3.解决问题—未登录直接添加购物车&#xff…

Excel文件解析

在此模块的学习中&#xff0c;我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是&#xff1a;解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析&#xff0c;将文件直接加载到内存&#xff0c;所以速度比较快&#xff0c;适合Excel文件数据量不…

没有算法大佬,都是草台班子

没有算法大佬&#xff0c;都是草台班子。 最近除了工作之外&#xff0c;还有一些时间在和加我微信的小伙伴沟通&#xff0c;聊的内容大部分集中在如何快速有效的学习人工智能、入门人工智能的技巧。 其中&#xff0c;一个知乎过来加我微信的小伙伴的经历更是让我感触很深。 …