目录

背景

容器

容器和容器文件

容器状态

容器列表

注意

操作

创建容器

启动容器

进入容器

进入容器  attach和exec的区别

停止容器

重启容器

删除容器

导出容器

导入容器


背景

上一篇文章,已经讲解了如何基于image文件,进行镜像的运行。而镜像的运行结果,就是产生一个容器实例。这一篇文章就是讲解下,容器以及容器文件的内容。

容器

容器和容器文件

image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已,因此涉及到容器状态的概念。

容器状态

包含下面几种:

容器状态:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)

容器列表

docker run ...之后就会生成一个容器,同一镜像文件多次的docker run之后,就会生成不同的容器,不过都是基于同一个镜像文件实例化出来的。

查看当前容器的命令:

# 列出本机正在运行的容器
$ docker container ls
 
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all

注意

1、只有正在后台运行的容器,或者停止运行的容器才会被列举出来。

2、镜像docker run之后,进入交互模式,如果这个时候输入exit,那么容器不会被删除,只是容器的状态从运行变成停止。

eg,没有添加-a参数,那么这个时候没有运行中的容器可以列举:

C:\Users\32631>docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 
C:\Users\32631>docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
d9137260f9ed        ubuntu              "/bin/bash"         29 minutes ago      Exited (0) 24 minutes ago                       sweet_maxwell

上面返回结果解释:

1、在上面的列表中,CONTAINER ID列是唯一标识容器的ID号,NAMES列则是唯一标识容器的一个名称,这个名称是由docker随机生成的。STATUS表示当前的容器的状态。PORTS表示当前容器对外开放的端口(端口这个下面会再解释)

2、使用docker container logs d9137260f9ed 或者 docker container logs sweet_maxwell可以显示这个容器的日志信息。

3、注意,凡是需要使用容器ID的命令,其ID都可以替换为容器的名称(Name),ID或者Name都可以唯一标识一个容器。

操作

创建容器

运行镜像就可以创建1个容器,此时容器自动就会启动,然后处于运行的状态:

docker run -it ubuntu

启动容器

启动和创建是不同的概念,启动的意思是说容器创建后,被停止了,这个时候可以再启动。一般给退出运行的容器重新启动时候使用。

启动的命令,通过容器ID或者容器名字启动:

docker start ID/NAME

eg:

C:\Users\32631>docker start d9137260f9ed
d9137260f9ed
 
C:\Users\32631>docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d9137260f9ed        ubuntu              "/bin/bash"         47 minutes ago      Up 29 seconds                           sweet_maxwell

进入容器

如果我们是创建容器的话,那么创建之后自动就会进入容器的交互窗口。

但是上面我们启动容器,这个时候容器只是被启动了,并没有立马进入到交换窗口。

进入容器的方式有四种:

1、 创建时进入:

docker run -it ubuntu

2、 启动时进入:

docker start -i ID/NAME

3、 attach方式进入(在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入)

docker attach ID/NAME

eg,演示了从后台运行,到获取id,到attach进入:

C:\Users\32631>docker container run -itd ubuntu
9fa9f8469ecf73b4f0574b4417b838aca9913417a011e72fd33850cb92f60bdb
 
C:\Users\32631>docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9fa9f8469ecf        ubuntu              "/bin/bash"         22 seconds ago      Up 21 seconds                           affectionate_elbakyan
 
C:\Users\32631>docker attach  9fa9f8469ecf
root@9fa9f8469ecf:/#

4、 exec方式进入(在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入)

docker exec -it ID/NAME /bin/bash

其中-it是固定要的 /bin/bash也是固定要的

进入容器  attach和exec的区别

上面介绍了4中方式。其中第三种和第四种很相似,但是推荐使用exec方式。

区别:

attach方式进入容器后,如果从这个容器退出,会导致容器的停止(即执行exit会退出并停止容器)
exec方式进入容器后,如果从这个容器退出,不会导致容器的停止,这就是为什么推荐大家使用 docker exec 的原因。

停止容器

docker stop ID/NAME

重启容器

docker restart ID/NAME

删除容器

删除容器之前必须确保已停掉容器。

docker container rm ID/NAME

导出容器

docker之所以可以无视主机,做到软件在不同系统上无缝运行,跟容器可以导出导入有很大的关系,比如这个容器我们运行正常,那么就可以将容器打包出来,再导入到另外一台机器上,是把这个状态的容器导出来,类似于数据库的备份操作,不仅仅会把镜像的信息(类似表结构)保留下来,还会把当前的状态信息(类似表数据)保留下来。

命令:

docker export -o output.tar ID/NAME

其中-o表示输出到文件,output.tar为目标文件(通常导成.tar文件),ID/NAME表示容器的ID/NAME

注意:导出的位置是当前命令执行的位置

eg:

C:\Users\32631>docker export -o output.tar 96266b69e2fd
 
C:\Users\32631>

docker 容器数据保存在哪里 docker容器文件_ubuntu

导入容器

是导出容器的逆过程

命令:

docker import output.tar IMAGENAME:VERSION

其中output.tar表示要被导进来的容器,IMAGENAME表示镜像名称(因为容器被导进来,会自动被当做镜像来使用),VERSION表示版本号,如果没有版本号,默认就是latest,可以不指定

eg,下面案例分别演示了从进入容器-》删除容器-》查看当前容器列表-》导入一个容器(未指定镜像信息)-》指定了镜像信息-》查看当前容器列表的过程:

C:\Users\32631>docker attach 96266b69e2fd
root@96266b69e2fd:/# exit
exit
 
C:\Users\32631>docker container rm 96266b69e2fd
96266b69e2fd
 
C:\Users\32631>docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 
C:\Users\32631>docker import output.tar
sha256:e816e4dc14d5b58428f8b289421a8a03f22d5f7e41bab5334b1c97919c77cac5
 
C:\Users\32631>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              e816e4dc14d5        12 seconds ago      73.9MB
ubuntu              latest              4e2eef94cd6b        10 days ago         73.9MB
 
C:\Users\32631>docker import output.tar newubuntu
sha256:d60aa43d53cfdd69615366b5eb9bdd88f76b78648e0ca57be8851355037f7200
 
C:\Users\32631>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
newubuntu           latest              d60aa43d53cf        8 seconds ago       73.9MB
<none>              <none>              e816e4dc14d5        53 seconds ago      73.9MB
ubuntu              latest              4e2eef94cd6b        10 days ago         73.9MB
 
C:\Users\32631>docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 
C:\Users\32631>