容器是什么
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。
容器生命周期
根据容器可能处于的状态,分为5种:
- created: 初建状态
- running: 运行状态
- stopped: 停止状态
- paused: 暂停状态
- deleted: 删除状态
容器的操作
创建并启动容器
- 创建容器, 使用命令
docker create
,创建容器, 如docker create busybox
- 启动容器,启动容器有两种方式:
- 使用
docker start
命令基于已经创建好的容器直接启动 - 使用
docker run
命令直接基于镜像创建一个容器并启动,相当于执行create后再执行start
- 使用
使用docker run
命令如下:
docker run -it --name=busybox busybox
当使用docker run创建并启动容器时,Docker 后台执行的流程为:
- Docker 会检查本地是否存在 busybox 镜像,如果镜像不存在则从 Docker Hub 拉取 busybox 镜像;
- 使用 busybox 镜像创建并启动一个容器;
- 分配文件系统,并且在镜像只读层外创建一个读写层;
- 从 Docker IP 池中分配一个 IP 给容器;
- 执行用户的启动命令运行镜像。
上述命令中, -t 参数的作用是分配一个伪终端,-i 参数则可以终端的 STDIN 打开,同时使用 -it 参数可以让我们进入交互模式
终止容器
使用docker stop
命令停止运行容器。命令格式docker stop [-t || --time[=10]]。该命令首先会向运行中的容器发送 SIGTERM 信号,如果容器内 1 号进程接受并能够处理 SIGTERM,则等待 1 号进程处理完毕后退出,如果等待一段时间后,容器仍然没有退出,则会发送 SIGKILL 强制终止容器
进入容器
处于运行状态的容器可以通过docker attach
、docker exec
、nsenter
等多种方式进入容器.
- 使用
docker attach
进入容器,如docker attach busybox
注意:当我们同时使用docker attach命令同时在多个终端运行时,所有的终端窗口将同步显示相同内容,当某个命令行窗口的命令阻塞时,其他命令行窗口同样也无法操作。 - 使用
docker exec
命令进入容器
Docker 从 1.3 版本开始,提供了一个更加方便地进入容器的命令docker exec,我们可以通过docker exec -it CONTAINER的方式进入到一个已经运行中的容器, 如docker exec -it busybox sh
删除容器
- 删除一个停止状态的容器,可以使用
docker rm
命令删除,如docker rm busybox
- 删除一个正在运行中的容器,可以用
docker rm -f
命令删除,如docker rm -f busybox
, 必须添加 -f (或 --force) 参数, Docker 会发送 SIGKILL 信号强制终止正在运行的容器
导出导入容器
导出容器
使用docker export
命令导出一个容器导文件,不论容器是否在运行。如docker export busybox > busybox.tar
执行以上命令后会在当前文件夹下生成 busybox.tar 文件,我们可以将该文件拷贝到其他机器上,通过导入命令实现容器的迁移。
导入容器
使用docker export
导出的容器,可以使用docker import
命令导入,执行完docker import
后会变为本地镜像,最后再使用docker run
命令启动镜像, 即可完成迁移,如docker import busybox.tar busybox:test