2023-08-23:Docker容器
学习自:04 容器操作:得心应手掌握 Docker 容器基本操作
1、容器
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。
运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。这将添加一个容器层,该层允许修改镜像的整个副本。
2、容器的生命周期
代表了容器的可能状态,一共有5种:
- created:初建(Create)
- running:运行(Up)
- stopped:停止(Exited)
- paused:暂停
- deleted:删除
各个生命周期之间的转换关系如下图:
3、容器操作
容器操作分为五个步骤:创建并启动容器、终止容器、进入容器、删除容器、导入和导出容器。
1)创建并启动容器
创建
指令:docker create
例子
1 | docker create -it --name=busybox busybox |
不能创建两个同名容器。
启动
如果用docker create命令创建的容器处于停止状态,我们可以用docker start来启动它,上边图中,容器已经处于启动(Up)状态了。
容器有两种启动方式:
- docker start 容器名,基于已经创建好的容器直接启动;
- docker run,直接基于镜像新建一个容器并启动,相当于先执行docker create命令从镜像创建容器,然后再执行docker start启动容器。使用docker run的命令如下:
1
docker run -it --name=busybox busybox
当用docker run创建容器时,Docker后台执行流程为:
- 检查本地是否存在busybox镜像,如果不存在就从Docker Hub拉取;
- 使用busybox镜像创建并启动一个容器;
- 分配文件系统,并且在镜像只读层外创建一个读写层;
- 从Docker IP池中分配一个IP给容器;
- 执行用户的启动命令运行镜像。
上述命令中用到了参数-it,其中-t的作用是分配一个伪终端,-i的作用是可以用终端的STDIN打开,同时使用-it可以让我们进入交互模式。在交互模式下,用户可以通过所创建的终端来输入命令(正常情况下,我们要执行这些命令,需要在最前边加docker标识):
1 2 3 4 | ps aux PID USER TIME COMMAND 1 root 0:00 sh 6 root 0:00 ps aux |
可以看到容器的1号进程为sh命令,在容器内部不能看到主机上的进程信息,因为容器内部和主机是完全隔离的。
在Linux中,1号进程代表主进程,因此如果通过exit退出sh,那么容器也会退出。对于容器而言,kill 主进程 = kill 容器本身。
2)终止容器
指令:docker stop [-t|-time[=10]] 容器
说明:
该命令会向运行中的容器发送SIGTERM信号,如果容器内1号进程能够接受并处理SIGTERM,则等待1号进程处理完毕后退出;如果等待一段时间后,容器仍没退出,就发送SIGKILL强制终止容器。
1 | docker stop busybox |
要想查看停止状态容器的信息,可以用idocker ps -a
1 | docker ps -a |
此时容器的状态栏应为Exited
1 | 28d477d3737a busybox "sh" 26 minutes ago Exited (137) About a minute ago busybox |
处于终止状态的容器也可以通过docker start命令来启动。
此外,docker restart命令会将一个运行中的容器终止,并且重新启动它:
1 | docker restart busybox |
3)进入容器
进入容器后输入exit退出容器,容器也会被关掉。因为容器的1号进程为sh命令,在Linux中,1号进程代表主进程,因此如果通过exit退出sh,那么容器也会退出。对于容器而言,kill 主进程 = kill 容器本身。
指令:
-
docker attach 容器名
-
docker exec [选项] 容器名 sh
attach
使用docker attach,就可以进入创建好的容器中,实现和docker run -it一样的终端操作模式,之后输入指令就不用加docker前缀了:
注意
当我们用docker attach在多个终端同时运行时,所有的终端将会同步显示相同内容,当某个命令行窗口阻塞时,其他命令行窗口也会同样无法操作。
这导致了docker attach不够灵活,一般用的不多,更常用一种灵活的进入容器的方式docker exec。
exec
1 | docker exec -it busybox sh |
Docker从1.3开始,提供了一种更方便进入容器的方式docker exec,我们可以通过docker exec -it CONTAINER的方式进入到一个已经运行中的容器:
进入容器后,可以看到容器内有两个sh进程,这是因为以exec方式进入容器,会单独启动一个sh进程,每个窗口都是独立且互不干扰的。这种方式是用的最多的进入容器的方式:
4)删除容器
指令:docker rm [选项] 容器名 [其他容器]
例子:
删除一个停止状态的容器
1 | docker rm busybox |
删除一个运行中的容器,需要加-f或-force参数,此时Docker会发送SIGKILL信号强制终止正在运行的容器
1 | docker rm -f busybox |
5)导出容器
指令:docker export 容器名 > 文件
说明:
将一个容器导出到文件,不管此时该容器是否处于运行状态。
导出容器前要先进入容器创建文件
1 2 | docker exec -it busybox sh cd /tmp && touch test |
再执行导出命令
1 | docker export busybox > busybox. tar |
该命令执行完毕后会在当前文件夹(本地)下生成busybox.tar文件,我们可以将其拷贝到其他机器上,通过导入命令实现容器的迁移。
6)导入容器
指令:
-
docker import 导出的文件 导入的镜像
-
完整版:docker import [选项] file [REPOSITORY:[TAG]]
通过docker export导出的文件,可以用docker import导入,执行完import之后会变成本地镜像,之后再用docker run命令启动该镜像,就实现了容器的迁移:
docker import busybox.tar busybox:test
此时busybox.tar被导入为新的镜像,镜像名为busybox:test,之后可以用docker run启动并进入容器,查看上一步创建的临时文件:
可以看到我们之前在/tmp目录下创建的test文件也被迁移过来了,这样我们就通过export和import实现了容器的迁移。
小结
镜像包含了容器运行所需的文件系统结构和内容,是静态只读文件
容器是在镜像的只读层上创建了可写层,容器中的进程处于运行状态,容器是真正的运行载体。
回顾
1、容器
- 容器是基于镜像创建的可运行实例,单独存在,一个镜像可以创建出多个容器;
- 运行容器时会添加一个容器层,实际上是在容器内部创建该文件系统的读写副本,该层允许修改镜像的整个副本
- 镜像是只读的,创建了容器之后就在容器层获得了一个可读写的副本
2、容器生命周期:创建、运行、停止、暂停、删除
3、容器操作
- 创建:create
- 启动:start(启动一个准备好的容器)、run(创建新容器并启动)
- 终止:stop
- 进入:attach(多个终端同步)、exec(更常用)
- 删除:rm
- 导出:export
- 导入:import
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性