3.容器的相关操作2020-11-02
容器生命周期
1.根据镜像创建一个容器
➜ ~ docker create -it --name=busybox busybox
使用docker create
命令创建的容器处于停止状态,可以使用docker start
命令来启动它。
➜ ~ docker start busybox
busybox
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e20db9d7728 busybox "sh" About a minute ago Up 3 seconds busybox
也可是使用docker run
创建容器时并启动,这就相当于 docker create之后再执行了一次 docker start
例如上面的例子,可以在来一遍,使用docker run
➜ ~ docker run -it --name=busybox busybox
/ #
这里加入了 -it参数
-i:让容器的标准输入保持打开
-t:分配一个伪终端并绑定到容器的标准输入上
➜ ~ docker run -it --name=busybox busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # pwd
/
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 sh
7 root 0:00 ps aux
/ #
可以看到,在这个终端中,也是可以run常用的一些命令的
查看进行发现,pid为1的进程是sh,因此,当我们使用exit退出sh时,容器也会退出。
2.停止一个正在运行的容器
➜ ~ docker stop busybox
busybox
命令格式为
docker stop [-t|--time[=10]]
使用docker ps -a可以查看当前设备存在的容器,但是未在运行的
➜ ~ docker ps -a
#或者
➜ ~ docker ps --all
重启一个容器
➜ ~ docker restart busybox
busybox
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8bfe90b24ed9 busybox "sh" 6 minutes ago Up 4 seconds busybox
3.进入一个正在运行时的容器
➜ ~ docker attach busybox
/ #
attach命令同时在多个终端运行时,所有终端窗口将同步显示相同内容,当某个命令行窗口的命令阻塞时,其他命令窗口同样无法操作。
exec命令明显要比attach更为灵活
➜ ~ docker exec -it busybox bin/sh
这里可以简写为
➜ ~ docker exec -it busybox sh
4.删除容器
删除docker容器使用 rm命令,这里以nginx容器为例,先创建启动一个NGINX容器
➜ ~ docker run -it --name=nginx nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
bb79b6b2107f: Pull complete
111447d5894d: Pull complete
a95689b8e6cb: Pull complete
1a0022e444c2: Pull complete
32b7488a3833: Pull complete
查看容器运行状态
➜ ~ docker ps | grep nginx
653c57e5d714 nginx "/docker-entrypoint.…" 3 minutes ago Up About a minute 80/tcp nginx
执行删除容器
➜ ~ docker rm nginx
Error response from daemon: You cannot remove a running container 653c57e5d7141591e2d4c1f4edb0497bdd05bcf729fe977ef7ea0435b3e36c70. Stop the container before attempting removal or force remove
这里提示了一个错误,不能删除一个正在运行的容器,这个其实也是docker的一个防误操作设计,试想一下,如果你不小心删掉了一个大家正在用的容器,那得多糟糕啊,因此,我们需要先将这个容器停止
➜ ~ docker stop nginx
nginx
➜ ~ docker rm nginx
nginx
image-20201102074036804.png
再次查看,这里已经没有nginx这个容器了,当然,docker也提供了强制删除正在运行时容器的命令。
➜ ~ docker rm -f nginx
-f: 会发送SIGKILL信号强制终止正在运行时的容器,不过这个要慎用。否则容易造就血泪史
5导出容器
使用export将容器导出并创建一个文件,以方便后续再服务器之间迁移容器
➜ ~ docker exec -it nginx sh
# cd home && touch test
# ls home
test
#
为了查看迁移之后的效果,这里先进入nginx这个容器,然后在home目录下创建 test文件,接着将这个容器导出为nginx.tar文件
➜ ~ ls
dev docker-帮助文档.md logs nacos nginx.tar nohup.out README.MD rootfs store
可以看到已经将nginx容器导出到nginx.tar文件了。
导出之后,假设我们需要把这个容器迁移到其他设备,这里模拟一下,我先把当前设备的nginx容器删除
➜ ~ docker stop nginx
nginx
➜ ~ docker rm nginx
nginx
image-20201102074904021.png
这里已经没有nginx了,接下来使用导入,将导出的nginx.tar导入
6.导入容器
导入容器的命令为import
执行之后,会变为本地镜像,执行docker run启动该镜像,就实现容器迁移了
➜ ~ docker import nginx.tar nginx:v7
sha256:0ef5841d743c3e41b45a05556c569655e353d6fbfef7c6a4ba36be8b36d8acd7
查看本地镜像列表
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v7 0ef5841d743c 21 seconds ago 131MB
然后启动该镜像
➜ ~ docker run -it nginx:v7 sh
# ls home
test
启动之后,镜像变成了一个容器,并且,在导出时home下创建的test文件也仍然存在,表示此时的导入导出已经成功了。
总结:当一个镜像启动之后就变成了容器,这篇内容包含容器的启动,进入容器,停止容器运行,删除,以及导入导出。
其实就是阐述了容器的生命周期过程,从 create|run 创建一个容器,并通过 start(run创建的已经启动了不用再单独start)可以将容器转化为运行状态,通过stop命令将容器转化为停止状态,当不需要这个容器时可以通过rm删除容器,,也可以带上-f参数进行强制删除。
另外pause和unpause 暂停和恢复这两个暂时还没用到。后续有机会用到在展开阐述。
至此,容器的简单操作就完成了,祝大家变得更强~!