Docker container常用命令

介绍与container相关的常用命令

Posted by Cheney.Yin on April 25, 2022

Docker container常用命令

1 docker container状态图


图1 docker容器状态变化

2 命令详解

2.1 容器启动

首先创建容器,

1
2
3
4
5
docker create -it --name=busybox busybox
2dad99a1a04cd4adccfad768ac19389acbba4362090087fec8f587d5b9874abd
docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS    PORTS     NAMES
2dad99a1a04c   busybox   "sh"      5 seconds ago   Created             busybox

docker容器处于Created状态,并未运行。

然后,执行docker start启动容器。

1
2
3
4
5
docker start busybox
busybox
docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
2dad99a1a04c   busybox   "sh"      2 minutes ago   Up 3 seconds             busybox

现在,容器处于运行状态。

这个过程可以通过docker run简化过程。

1
docker run -it --name busybox busybox

Docker后台启动流程为:

  • Docker检查本地是否存在busybox镜像,如果镜像不存在则从Docker Hub拉取镜像。
  • 使用busybox镜像创建并启动一个容器。
  • 分配文件系统,并且在镜像只读层外创建一个读写层。
  • 从Docker IP池中分配一个IP给容器。
  • 执行用户启动命令运行镜像。

上述命令中,-t参数作用是分配一个伪终端,-i参数表示打开STDIN,因此-it表示进入交互模式。在交互模式下可以输入命令,

1
2
3
4
ps -a
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    8 root      0:00 ps -a

可以看到PID为1的进程sh。在交互模式下执行exit,意味着杀死了1号进程,等同于容器被杀死。杀死容器主进程,则容器也会被杀死

1
2
3
4
5
6
7
8
/ # ps -a
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    8 root      0:00 ps -a
/ # exit
docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                     PORTS     NAMES
e27bbc62b96c   busybox   "sh"      3 minutes ago   Exited (0) 4 seconds ago             busybox

2.2 终止容器

使用docker stop命令终止容器。

1
2
3
4
5
6
7
8
docker stop --help

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

Options:
  -t, --time int   Seconds to wait for stop before killing it (default 10)

改命令首先向运行中的容器发送SIGTERM信号,如果容器内1号进程接受并能处理,则等待1号进程处理完毕后退出;如果等待一段时间后,容器仍然没有退出,则会发送SIGKILL强制终止容器。

1
2
3
4
5
6
docker stop busybox
busybox

docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                       PORTS     NAMES
e27bbc62b96c   busybox   "sh"      15 minutes ago   Exited (137) 5 seconds ago             busybox

2.3 进入容器

进入运行状态的容器可以通过docker attachdocker execnsenter等多种方式进入。

(1)使用docker attach进入容器

1
2
3
4
5
6
7
8
9
# tm1
docker attach busybox
echo 'Hello'
Hello

# tm2
docker attach busybox
echo 'Hello'
Hello

docker attach命令同时在多个终端运行时,所有的终端将会同步显示相同内容,当某个命令行窗口阻塞时,其它命令行窗口也将无法操作。

(2)使用docker exec进入容器

1
2
3
4
5
6
docker exec -it busybox /bin/sh
ps -a
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    7 root      0:00 /bin/sh
   14 root      0:00 ps -a

进入容器后,可以看到容器内有两个sh进程,7号进程是以exec的方式进入容器启动的,每个命令窗口都是独立互不干扰的。

(3)使用nsenter进入容器

参考

nsenter 可以访问另一个进程的名称空间,并执行程序。

首先获取容器的主进程PID

1
2
docker inspect -f \{\{.State.Pid\}\} busybox
11147

获取进程PID后,使用nsenter进入容器。

1
2
3
4
5
6
sudo nsenter --target 11147 --mount --pid --uts --ipc --net '/bin/sh'
/bin/ps -a
PID   USER     TIME  COMMAND
    1 root      0:00 sh
   22 root      0:00 /bin/sh
   23 root      0:00 /bin/ps -a

或者,

1
sudo nsenter --target 11147 --all '/bin/sh'

2.4 删除容器

删除停止状态的容器,

1
docker rm busybox

强制删除运行中的容器,

1
docker rm -f busybox

2.5 导出导入容器

(1)导出

docker export命令导出一个容器到文件,不管容器是否处于运行状态。

1
docker export busybox > busybox.tar

容器被打包进了busybox.tar文件。

(2)导入

docker import命令可将docker export导出文件转化为本地镜像,最后使用docker run重新创建启动新的容器。

1
docker import busybox.tar busybox:test