2023-08-23:Docker容器
学习自:04 容器操作:得心应手掌握 Docker 容器基本操作
1、容器
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。
运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。这将添加一个容器层,该层允许修改镜像的整个副本。

2、容器的生命周期
代表了容器的可能状态,一共有5种:
- created:初建(Create)
- running:运行(Up)
- stopped:停止(Exited)
- paused:暂停
- deleted:删除
各个生命周期之间的转换关系如下图:

3、容器操作
容器操作分为五个步骤:创建并启动容器、终止容器、进入容器、删除容器、导入和导出容器。
1)创建并启动容器
创建
指令:docker create
例子
docker create -it --name=busybox busybox


不能创建两个同名容器。
启动
如果用docker create命令创建的容器处于停止状态,我们可以用docker start来启动它,上边图中,容器已经处于启动(Up)状态了。
容器有两种启动方式:
- docker start 容器名,基于已经创建好的容器直接启动;
- docker run,直接基于镜像新建一个容器并启动,相当于先执行docker create命令从镜像创建容器,然后再执行docker start启动容器。使用docker run的命令如下:
docker run -it --name=busybox busybox
当用docker run创建容器时,Docker后台执行流程为:
- 检查本地是否存在busybox镜像,如果不存在就从Docker Hub拉取;
- 使用busybox镜像创建并启动一个容器;
- 分配文件系统,并且在镜像只读层外创建一个读写层;
- 从Docker IP池中分配一个IP给容器;
- 执行用户的启动命令运行镜像。
上述命令中用到了参数-it,其中-t的作用是分配一个伪终端,-i的作用是可以用终端的STDIN打开,同时使用-it可以让我们进入交互模式。在交互模式下,用户可以通过所创建的终端来输入命令(正常情况下,我们要执行这些命令,需要在最前边加docker标识):
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强制终止容器。
docker stop busybox
要想查看停止状态容器的信息,可以用idocker ps -a
docker ps -a
此时容器的状态栏应为Exited
28d477d3737a busybox "sh" 26 minutes ago Exited (137) About a minute ago busybox
处于终止状态的容器也可以通过docker start命令来启动。
此外,docker restart命令会将一个运行中的容器终止,并且重新启动它:
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
docker exec -it busybox sh
Docker从1.3开始,提供了一种更方便进入容器的方式docker exec,我们可以通过docker exec -it CONTAINER的方式进入到一个已经运行中的容器:

进入容器后,可以看到容器内有两个sh进程,这是因为以exec方式进入容器,会单独启动一个sh进程,每个窗口都是独立且互不干扰的。这种方式是用的最多的进入容器的方式:
4)删除容器
指令:docker rm [选项] 容器名 [其他容器]
例子:
删除一个停止状态的容器
docker rm busybox
删除一个运行中的容器,需要加-f或-force参数,此时Docker会发送SIGKILL信号强制终止正在运行的容器
docker rm -f busybox
5)导出容器
指令:docker export 容器名 > 文件
说明:
将一个容器导出到文件,不管此时该容器是否处于运行状态。
导出容器前要先进入容器创建文件
docker exec -it busybox sh cd /tmp && touch test
再执行导出命令
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

浙公网安备 33010602011771号