容器是Docker的另外一个核心概念。
简单地说,容器是镜像的一个运行实例,所不一样的是,它带有额外的可写文件层。
若是认为虚拟机是模拟运行的一整套操做系统(提供了运行态环境和其余系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个或一组应用,以及它们的必需运行环境。
本文将具体介绍围绕容器的重要操做,包括建立一个容器、启动容器、终止一个容器、进入容器内执行操做、删除容器和经过导入导出容器来实现容器迁移等。docker
Docker的容器十分轻量级,用户能够随时建立或删除容器。ubuntu
可使用Docker create命令新建一个容器,例如:bash
[root@gavin ~]# sudo docker create -it ubuntu Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 5b7339215d1d: Pull complete 14ca88e9f672: Pull complete a31c3b1caad4: Pull complete b054a26005b7: Pull complete Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c Status: Downloaded newer image for ubuntu:latest c03bb46b440ca9c6b5fe9b941f38005ad08558497cb6f3e6613ccfcdadc7dd5a
当镜像不存在时会先下载镜像再建立容器。
使用docker create命令新建的容器处于中止状态,可使用docker start命令来启动它。工具
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将在终止状态(stopped)的容器从新启动。所须要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。
例如,下面的命令输出一个“Hello World”,以后容器自动终止:学习
[root@gavin /]# sudo docker run ubuntu /bin/echo 'Hello World'
Hello World
这跟在本地直接执行/bin/echo 'Hello World'几乎感受不出任何区别。
当利用docker run来建立并启动容器时,Docker在后台运行的标准操做包括:spa
下面的命令则启动一个bash终端,容许用户进行交互:操作系统
[root@gavin /]# sudo docker run -t -i ubuntu /bin/bash
root@5380e1ecc9c8:/#
其中,-t选项让Docker分配一个伪终端(pseudo-ty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
在交互模式下,用户能够经过所建立的终端来输入命令,例如:3d
root@5380e1ecc9c8:/# pwd / root@5380e1ecc9c8:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@5380e1ecc9c8:/# ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 11 pts/0 00:00:00 ps
在容器内用ps命令查看进程,能够看到,只运行了bash应用,并无运行其余不须要的进程。
用户能够按Ctrl+d或输入exit命令来退出容器:rest
root@5380e1ecc9c8:/# exit
exit
对于所建立的bash容器,当使用exit命令退出以后,该容器就自动处于终止状态了。这是由于对于Docker容器来讲,当运行的应用(此处例子中为bash)退出后,容器也就没有继续运行的必要了。code
更多的时候,须要让Docker容器在后台以守护态(Daemonized)形式运行。用户能够过添加-d参数来实现。
例以下面的命令会在后台运行容器:
[root@gavin /]# sudo docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
1cdff0f459ad8f8e5a3de5603bbd14ea09a152ca430a5528e344c4254197f550
容器启动后会返回一个惟一的ID,也能够经过docker ps命令来查看容器信息:
[root@gavin /]# sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cdff0f459ad ubuntu "/bin/sh -c 'while t…" 11 seconds ago Up 9 seconds keen_perlman
要获取容器的输出信息,能够经过docker logs命令:
[root@gavin /]# docker logs 1cdff0f459ad
hello world
hello world
hello world
...
可使用docker stop来终止一个运行中的容器,命令的格式为docker stop [-t l --time[=10]]。它会首先向容器发送SIGTERM信号,等待一段时间后(默认为10秒),再发送SIGKILL信号终止容器。
此外,当Docker容器中指定的应用终结时,容器也自动终止。例如对于上面演示中只启动了一个终端的容器,用户经过exit命令或Ctrl+d来退出终端时,所建立的容器马上终止。
另外,可使用docker stop来终止一个运行中的容器:
[root@gavin /]# sudo docker stop 1cdff0f459ad
1cdff0f459ad
可使用docker ps -a -q命令看处处于终止状态的容器的ID信息。例如:
[root@gavin /]# sudo docker ps -a -q
1cdff0f459ad
5380e1ecc9c8
e6e0a53c33c4
c03bb46b440c
处于终止状态的容器,能够经过docker start命令来从新启动:
[root@gavin /]# sudo docker start 1cdff0f459ad
1cdff0f459ad
此外,docker restart命令会将一个运行态的容器终止,而后再从新启动它:
[root@gavin /]# sudo docker restart 1cdff0f459ad
1cdff0f459ad
在使用-d参数时,容器启动后会进入后台,用户没法看到容器中的信息。某些时候若是须要进入容器进行操做,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等,博主这里只说下docker exec命令。
Docke自1.3版本起,提供了一个很是方便的工具exec,能够直接在容器内运行命令。
例如进入到刚建立的容器中,并启动一个bash:
[root@gavin /]# sudo docker exec -ti 1cdff0f459ad /bin/bash
root@1cdff0f459ad:/#
可使用docker rm命令删除处于终止状态的容器,命令格式为docker rm [OPTTONS] CONTAINER [CONTAINER...]。支持的选项包括:
例如,查看处于终止状态的容器并删除以下所示:
[root@gavin /]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cdff0f459ad ubuntu "/bin/sh -c 'while t…" 19 minutes ago Up 10 minutes keen_perlman 5380e1ecc9c8 ubuntu "/bin/bash" 26 minutes ago Exited (0) 23 minutes ago practical_snyder e6e0a53c33c4 ubuntu "/bin/echo 'Hello Wo…" 31 minutes ago Exited (0) 31 minutes ago lucid_robinson c03bb46b440c ubuntu "/bin/bash" About an hour ago Created practical_volhard [root@gavin /]# sudo docker rm 5380e1ecc9c8 5380e1ecc9c8
若是要删除一个运行中的容器,能够添加-f参数。Docker会发送SIGKILL信号给容器,终止其中的应用:
[root@gavin /]# sudo docker rm 1cdff0f459ad Error response from daemon: You cannot remove a running container 1cdff0f459ad8f8e5a3de5603bbd14ea09a152ca430a5528e344c4254197f550. Stop the container before attempting removal or force remove [root@gavin /]# sudo docker rm -f 1cdff0f459ad 1cdff0f459ad
导出容器是指导出一个已经建立的容器到一个文件,无论此时这个容器是否处于运行状态,可使用docker export命令,该命令格式为docker export CONTAINER。
查看全部的容器以下所示:
[root@gavin /]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2e003db2a309 ubuntu "/bin/sh -c 'while t…" 14 seconds ago Up 12 seconds keen_nobel e6e0a53c33c4 ubuntu "/bin/echo 'Hello Wo…" 39 minutes ago Exited (0) About a minute ago lucid_robinson
分别导出2e003db2a309容器和e6e0a53c33c4容器到test_for_run.tar文件和test_for_stop.tar文件:
[root@gavin test]# sudo docker export 2e003db2a309 > test_for_run.tar [root@gavin test]# ls test_for_run.tar [root@gavin test]# sudo docker export e6e0a53c33c4 > test_for_stop.tar [root@gavin test]# ls test_for_run.tar test_for_stop.tar
可将这些文件传输到其余机器上,在其余机器上经过导入命令实现容器的迁移。
导出的文件又可使用docker import命令导入,成为镜像,例如:
[root@gavin test]# cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0 sha256:5b8050c321636ec1814fd0927a5044aed089df8641d32ea4442c75a71ad3e596 [root@gavin test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/ubuntu v1.0 5b8050c32163 3 seconds ago 64.2MB
读者可能会记得,博主在以前博文中曾介绍过使用docker load命令来导入一个镜像文件。
实际上,既可使用docker load命令来导人镜像存储文件到本地的镜像库,又可使用docker import命令来导人一个容器快照到本地镜像库。这二者的区别在于容器快照文件将丢弃全部的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时能够从新指定标签等元数据信息。
这篇文章是我学习 Docker 的记录,内容参考自《Docker技术入门与实战》