3.容器的相关操作2020-11-02

2020-11-03  本文已影响0人  青山有扶苏

容器生命周期

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 暂停和恢复这两个暂时还没用到。后续有机会用到在展开阐述。

至此,容器的简单操作就完成了,祝大家变得更强~!

上一篇下一篇

猜你喜欢

热点阅读