Docker container常用命令
1 docker container状态图
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 attach
、docker exec
、nsenter
等多种方式进入。
(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