目录
背景
容器
容器和容器文件
容器状态
容器列表
注意
操作
创建容器
启动容器
进入容器
进入容器 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 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>