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

 

posted @   ShineLe  阅读(86)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示