当前位置: 首页 > news >正文

【Docker-14】容器操作案例

一、容器基本操作

1.通过 nginx 镜像文件创建容器

QQ_1744805667506

2.查看容器的详细信息

QQ_1744805733589

3.停止当前正在运行的容器并删除

QQ_1744805805833

二、容器状态迁移

# 1.创建容器
root@Nanyiroot:~# docker images nginx  
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    53a18edff809   2 months ago    192MB
nginx        1.23.4    a7be6198544f   23 months ago   142MB
nginx        1.24.0    6c0218f16876   2 years ago     142MB
nginx        1.23.3    ac232364af84   2 years ago     142MB
nginx        1.21.1    822b7ec2aaf2   3 years ago     133MB
root@Nanyiroot:~# docker create --name mynginx002 -p 8102:80 a7be6198544f
07afde0a22f00a6608c4fa900933d3d1f095972d5f19b7b994b54dfd36e36ea1
root@Nanyiroot:~# 
root@Nanyiroot:~# # 2.通过 docker ps们可以看到容器状态为已经创建
root@Nanyiroot:~# docker ps -a | grep mynginx002
07afde0a22f0   a7be6198544f   "/docker-entrypoint.…"   31 seconds ago   Created                              mynginx002
root@Nanyiroot:~# # 3.通过 docker start 启动容器
root@Nanyiroot:~# docker start mynginx002
mynginx002# 4.通过 docker ps 可以看到容器为已经运行
root@Nanyiroot:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS         PORTS                                     NAMES
07afde0a22f0   a7be6198544f   "/docker-entrypoint.…"   44 seconds ago   Up 3 seconds   0.0.0.0:8102->80/tcp, [::]:8102->80/tcp   mynginx002
root@Nanyiroot:~# # 5.通过 docker stop 可以停止容器
root@Nanyiroot:~# docker stop mynginx002
mynginx002
root@Nanyiroot:~# docker ps -a | grep mynginx002
07afde0a22f0   a7be6198544f   "/docker-entrypoint.…"   About a minute ago   Exited (0) 4 seconds ago             mynginx002
root@Nanyiroot:~# # 6.再次启动容器,然后 kill 容器
root@Nanyiroot:~# docker start mynginx002
mynginx002
root@Nanyiroot:~# docker kill mynginx002
mynginx002
root@Nanyiroot:~# docker ps -a | grep mynginx002
07afde0a22f0   a7be6198544f   "/docker-entrypoint.…"   About a minute ago   Exited (137) 3 seconds ago             mynginx002
root@Nanyiroot:~# # 7.启动容器,然后暂停容器
root@Nanyiroot:~# docker start mynginx002
mynginx002
root@Nanyiroot:~# docker pause mynginx002
mynginx002
root@Nanyiroot:~# docker ps -a | grep mynginx002
07afde0a22f0   a7be6198544f   "/docker-entrypoint.…"   2 minutes ago   Up 13 seconds (Paused)     0.0.0.0:8102->80/tcp, [::]:8102->80/tcp   mynginx002#8. 恢复容器
root@Nanyiroot:~# docker unpause mynginx002
mynginx002
root@Nanyiroot:~# docker ps -a | grep mynginx002
07afde0a22f0   a7be6198544f   "/docker-entrypoint.…"   2 minutes ago   Up 34 seconds              0.0.0.0:8102->80/tcp, [::]:8102->80/tcp   mynginx002
root@Nanyiroot:~# # 9.重启容器
root@Nanyiroot:~# docker restart mynginx002
mynginx002
root@Nanyiroot:~# docker ps -a | grep mynginx002
07afde0a22f0   a7be6198544f   "/docker-entrypoint.…"   3 minutes ago   Up 4 seconds               0.0.0.0:8102->80/tcp, [::]:8102->80/tcp   mynginx002
root@Nanyiroot:~# # 10.通过 docker rm 可以删除容器
root@Nanyiroot:~# docker stop mynginx002
mynginx002
root@Nanyiroot:~# docker rm mynginx002
mynginx002
root@Nanyiroot:~# docker ps -a | grep mynginx002

三、容器批量处理技巧

QQ_1744806780704

-a:表示打印所有的容器信息, 包括正在运行和已经退出的。
-q:表示只返回容器 ID。
-f:表示基于给的条件过滤 等价于 --filter 选项。

1.批量删除容器

(1)查看当前容器列表
docker container ls -a

QQ_1744806971299

(2)删除命令后边加多个容器 ID(比较麻烦,不建议使用)
docker container rm 43 49 50 ...
(3)通过参数传递方式批量删除容器(推荐使用)
docker container rm $(docker container ls -aq)
(4)查看当前容器列表,发现已经批量删除完毕
docker container ls -a

2.按照状态过滤删除已经退出的容器

1.查看当前容器列表
docker container ls -a2.按照状态过滤删除已经退出的容器
docker container rm $(docker container ls -q --filter status=exited)3.确认是否删除
docker container ls -a

注意 :其他命令在做批量处理的时候同样可以类比, 比如批量停止: docker container stop $( docker container ps -aq )

3.过略指令示例

QQ_1744807474288

四、容器交互模式

1.attached模式

(1)通过 nginx 镜像创建一个容器,映射 80 端口

QQ_1744808016397

-p 8106:80 表示端口映射,第一个端口表示映射到宿主机的端口,第二个端口表示映射到 Docker 容器的端口。

  • 通过上述方式创建容器,就是 attached 模式,这样容器会在前台运行。
  • 访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器的日志会实时的展现到窗口并且占用此端口。
  • 如果是在 Linux 服务器上,按 Ctrl+C 就会停止掉 Docker 服务,很容易误操作,所以需要一个更好的,更稳定的模式,对应的是 detached 模式。
  • attached 模式仅适用于容器和程序的调试阶段

下面实践一下 attached 模式的用法:

  • 第一步:以 attached 模式创建运行容器,映射到宿主机的 80 端口:

QQ_1744808084305

  • 第二步:访问服务器的 8106 端口,用浏览器访问服务器 ip 或者域名,默认访问 80 端口:

QQ_1744808160927

可以看到 nginx 主页已经展现在浏览器上,当我们刷新访问后发现在标准输出上会打印一些相关的 log 出来。

QQ_1744808189585

  • 第三步:键入 Ctrl + C

QQ_1744808209588

执行命令查看当前容器状态,可以发现该容器已经退出:

QQ_1744808233668

2.detached模式

在 docker container run -p 80:80 nginx 命令基础上加一个-d 或者 --detach 选项表示 detached 模式,即在后台执行

  • 在后台运行,启动后只显示容器 ID,并且可以输入任何命令。
  • 就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作。
  • 比起 attached 模式更建议使用。

下面来实践一下 detached 模式的用法:

  • 第一步:以 detached 模式创建容器,并映射 80 端口:

QQ_1744808709464

  • 第二步:浏览器访问服务器网址,并查看后台日志。

刷新浏览器可以看到此时在后台已经打印出来相关的日志:

QQ_1744808741117

  • 动态跟踪日志:后台日志窗口只会打印一次日志。如果想动态跟踪日志,可以加 -f 选项;如果想关闭日志跟踪模式,可以键入 Ctrl+C 结束。

QQ_1744808850899

  • detached 模式转 attached 模式

QQ_1744808922311

3.interactive 模式

当创建好一个容器之后,可能需要去容器内部获取一些信息或执行一些命令,就需要进入到交互式模式。例如创建一个 Ubuntu 容器之后,需要到系统里输入各种 Shell 命令和系统进行交互就需要进入交互式模式才可以完成。

(1)创建运行容器并进入到交互模式

QQ_1744809439547

进入到容器的交互 shell 中,可以在该 shell 下执行对应的命令:

QQ_1744809467298

  • -i:保持容器运行。通常与 -t 同时使用,加入 it 这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。

输入nginx后,浏览器可以正常访问

QQ_1744809499244

QQ_1744809524838

2. 针对一个已经运行的容器里进入到交互模式
(1)在后台创建运行 nginx 容器
root@Nanyiroot:~# docker run -d --name mynginx010 -p 8110:80 nginx:1.23.4
722bb75f9b9ab90947b2b878d49b5e80acb9a4c1f1c333df70b7db4ba8e3162b
(2) 进入该容器的交互模式

QQ_1744809980367

(3)退出交互式模式

输入 Ctrl + C 并不会产生什么影响,在交互式 shell 中输入 exit 则退出:

QQ_1744810046418

QQ_1744810078270

QQ_1744810029823

五、容器与宿主机内容复制

(1)启动一个nginx服务

QQ_1744810606893

(2)拷贝宿主机文件到容器中

QQ_1744810696889

(3)进入容器中查看

QQ_1744810763758

(4)在宿主机上编译一个 index.html 文件

QQ_1744810896929

(5)从外部页面访问

QQ_1744810920345

(6)将宿主机上的 index.html 拷回容器中

QQ_1744810989363

(7)回到容器中查看内容,发现文件已经覆盖

QQ_1744811034545

(8)再次访问页面

QQ_1744811054968

(9)清理容器,释放空间

QQ_1744811090219

六、容器自动删除

(1)启动一个 nginx,指定 --rm 选项

QQ_1744856127331

(2)停止容器

QQ_1744856141332

(3)再次查看容器是否存在

发现容器自动删除了:

QQ_1744856155859

七、容器自动重启

容器重启选项如下:

  • docker run --restart=no [容器名]:默认值不自动重启。
  • docker run --restart=on-failure:3 [容器名]:on-failure 若容器的退出状态非 0,则 docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃。
  • docker run --restart=always [容器名] :always 容器退出时总是重启。
  • docker run --restart=unless-stopped [容器名] unless-stopped 容器退出时总是重启,但不考虑 Docker 守护进程启动时就已经停止的容器。

如果容器启动时没有设置–restart 参数,则通过下面命令进行更新:

  • docker update --restart=always [容器名]
(1)启动 nginx 服务,指定总是重启

QQ_1744856388479

(2)进入容器中停止 nginx 服务

QQ_1744856462513

(3)查看进程状态,可以看到进程还是启动状态

QQ_1744856490044

(4)释放空间

QQ_1744856535395

八、容器环境变量设置

(1)启动一个 nginx 容器 -- 配置环境变量:
root@Nanyiroot:~# docker run -it --rm -e MYTEST1=1 -e MYTEST2=2 -e MYTEST3=3 a7be6198544f bash
root@2c192e18b3fe:/# env | grep MYTEST
MYTEST1=1
MYTEST3=3
MYTEST2=2(2)进入容器查看环境变量
root@2c192e18b3fe:/# env | grep MYTEST
MYTEST1=1
MYTEST3=3
MYTEST2=2(3)通过配置文件完成环境变量的设置
root@Nanyiroot:~/cdd# vi myenv
root@Nanyiroot:~/cdd# docker run -it --rm --env-file=./myenv a7be6198544f bash
root@313df4115d3a:/# env | grep MYTEST
MYTEST4=4
MYTEST3=3
MYTEST2=2
MYTEST=1

九、容器详细查看

可以查看一个容器的详细信息,比如我们可以查看所有设置的环境变量。

(1)启动容器
docker run -d \--name mynginx016 \        # 给容器起名 mynginx016-p 8116:80 \               # 映射主机的 8116 端口到容器的 80 端口-e MYTEST=1 \              # 设置环境变量 MYTEST=1-h mynginx016.com \        # 设置容器的主机名为 mynginx016.coma7be6198544f               # 使用镜像 ID 运行容器-h 这个主机名能干什么?
改变 shell 提示符中的主机名
比如 root@mynginx016.com:/# 就来自这个设置。
在容器内使用 hostname 进行服务发现
如果你的应用或脚本依赖主机名(比如自动生成日志、识别服务器身份等),这就很有用。

QQ_1744857266496

(2)查看容器信息

QQ_1744857303241

QQ_1744857352819

(3)释放资源

QQ_1744857490045

十、容器执行单行命令

可以直接借助 docker 的容器环境执行一些命令,比如容器中有某个命令而宿主机上没有这个时候借助容器可以完成某些任务。

QQ_1744857597734

十一、容器镜像导入导出

(1)创建目录
root@Nanyiroot:~/cdd# mkdir testtar
root@Nanyiroot:~/cdd# cd testtar
root@Nanyiroot:~/cdd/testtar# (2)运行一个 nginx 镜像,然后修改首页内容
root@Nanyiroot:~/cdd/testtar# docker run -d --name mynginx030 -p 8030:80 nginx:1.24.0
7ea71e65ac553fad82a203c6a09b9f5b31ef8632a22fe92a77012fcec3ce5a5b
root@Nanyiroot:~/cdd/testtar# docker exec -it mynginx030 bash
root@7ea71e65ac55:/# cd /usr/share/nginx/html
root@7ea71e65ac55:/usr/share/nginx/html# echo "I am from docker" > index.html
root@7ea71e65ac55:/usr/share/nginx/html# 

(3)访问首页

QQ_1744859308635

(4)通过 docker export 保存镜像
root@Nanyiroot:~/cdd/testtar# docker export -o mynginx030.tar mynginx030
root@Nanyiroot:~/cdd/testtar# ls
mynginx030.tar
root@Nanyiroot:~/cdd/testtar# (5)通过 docker import 导入镜像
root@Nanyiroot:~/cdd/testtar# docker import mynginx030.tar mynginx:v0.30
sha256:fc69b98c98912e73a43ef6893d200b55c7bf2aa53890a9833a0304808cfde227
root@Nanyiroot:~/cdd/testtar# docker images mynginx
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mynginx      v0.30     fc69b98c9891   23 seconds ago   141MB(6)停止现在的容器,重新启动容器
root@Nanyiroot:~/cdd/testtar# docker stop mynginx030
mynginx030
root@Nanyiroot:~/cdd/testtar# docker rm mynginx030
mynginx030(7)使用导出的镜像启动一个新的容器
root@Nanyiroot:~/cdd/testtar# docker run -d --name mynginx030 -p 8130:80 fc69b98c9891 nginx -g "daemon off;"
39bf382e59acd6c26f9d26842f5c789e139abd8e3aca1296af86e0fdfa49183e
root@Nanyiroot:~/cdd/testtar# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
39bf382e59ac   fc69b98c9891   "nginx -g 'daemon of…"   8 seconds ago   Up 8 seconds   0.0.0.0:8130->80/tcp, [::]:8130->80/tcp   mynginx030

如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似 “docker: Error response from daemon: Container command not found or does not exist” 的错误。我们必须指定启动命令,因为 export 丢失了元数据信息

十二、容器日志查看

1.启动一个nginx

QQ_1745031113246

2.查看全部日志

QQ_1745031127525

3.实时查看日志

刷新访问几次页面:

QQ_1745031179083

QQ_1745031190026

4.查看最新的5行日志

QQ_1745031240158

5.停止容器释放资源
root@Nanyiroot:~# docker stop mynginx031
mynginx031

十三、容器资源查看

1.运行一个nginx
docker run -d --name mynginx032 -p 8032:80 a7be6198544f
2.通过 docker top 查看容器中有哪些进程

添加 aux,可以看到占用的内存和 CPU 信息:

QQ_1745031472936

3.通过 docker stats 可以看到资源的实时占用变化
docker stats mynginx032

QQ_1745031513923

4.释放资源
docker stop mynginx032
docker rm mynginx032

相关文章:

  • Java Web 之 互联网协议 100问
  • 向量陷阱:关键词、长度与相关性如何误导Embedding模型?
  • Spring中的AOP基础理解
  • 【网络篇】TCP vs UDP底层区别+网络编程概念
  • 数据结构排序算法全解析:从基础原理到实战应用
  • MySQL游标的定义和应用
  • Kubernetes相关的名词解释CNI插件(1)
  • 【Easylive】seataServer.properties 配置文件详细解析
  • stm32(gpio的四种输出)
  • 2025年渗透测试面试题总结-拷打题库06(题目+回答)
  • 网络--socket编程(2)
  • 【Linux】条件变量、基于阻塞队列的生产者消费者模型
  • java怎么找bug?Arthas原理与实战指南
  • 内积模型的性质
  • 数字化转型四步走:企业的进化密码
  • 大模型Rag - 两大检索技术
  • JVM基础认知:JVM到底是什么?为什么它如此重要?
  • 【NLP 65、实践 ⑯ 基于Agent优化文章】
  • 【AI论文】ColorBench:视觉语言模型能否看到并理解多彩的世界?一个全面的色彩感知、推理和鲁棒性基准测试
  • 基于medusa范式的大模型并行解码推理加速初探
  • 体坛联播|巴萨三球逆转塞尔塔,CBA季后赛山西横扫广东
  • 观察|如何推动再保险交易规模上量增加话语权,行业在临港新片区共倡议
  • 左眼失明左耳失聪,办理残疾人证被拒?县残联:双眼残疾才能办
  • 聚餐醉酒后骑车撞树身亡、家属起诉共饮者赔44万,法院已判
  • 上海徐汇探索AI赋能城市治理,面向全球招募量子城市解决方案
  • 习近平会见马来西亚最高元首:开启中马关系新的“黄金50年”