Docker学习 - 3. Docker的容器

容器(Container)是Docker的另一个核心的概念。
简单的来说,容器是镜像的一个运行实例,不同的是,Docker带有额外的可写文件层。

创建容器

Docker的容器十分轻量级,用户可以随时创建或者删除容器。

新建容器

可以使用docker create的命令新建一个容器,例如:

$ sudo docker create  -it  ubuntu:latest
7a0c2696889sfe2323f2f2v2rcr2c00r3oe2fadc166698475a32
$ sudo docker ps -a
CONTAINER ID    IMAGE     COMMAND   CREATED    STATUS    PORTS     NAMES
7a0c2696889    unbuntu/latest  "/bin/bash"    6 seconds ago  stoic_albattani  

使用docker create命令新建的容器会处于一个停止的状态,可以使用docker start来启动它。

新建并启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stoped)的容器重新启动。对于第一种,所需要的命令是docker run,等价于先执行docker create,再执行dcoker start命令。

$ sudo docker run ubuntu /bin/echo 'Hello world'

当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
  • 利用镜像创建并启动一个容器。
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
  • 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中。
  • 从地址池配置一个IP地址给容器。
  • 执行用户指定的应用程序。
  • 执行完毕以后容器被终止。

下面的命令则启动一个bash终端,允许用户进行交互。

$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

其中, -t 选项让Docker分配一个伪终端并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开。
在交互模式下,可以通过创建的终端来输入命令,就像在一个linux系统中执行shell命令那样。
在容器中可以使用ps来查看进程。
如果要退出容器,可以输入exit。对于创建的容器,当我们退出以后,该容器就自动处于终止状态了,这是因为对于Docker容器来说,当运行的应用退出后,容器也就没有运行必要了。

守护态运行

有的时候,我们需要让Docker容器在后台以守护态(Daemonized)形式运行。用户可以通过添加-d参数来实现。

$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

容器会返回一个ID,可以通过docker ps来查看容器信息,

$ sudo docker ps
CONTAINER ID   IMAGE   COMMAND   CREATED   STATUS   PORTS   NAMES
ce554267d7a4     ubuntu:latest   "/bin/sh -c 'while tr...'  About a minute ago    Up about a minute

如果要获取容器的输出信息,可以通过docker logs命令来查看。

$ sudo docker logs ce5
hello world
hello world
hello world
...

终止容器

可以使用docker stop来终止一个运行中的容器,命令格式为docker stop [-t | --time[=10]]。它会向容器发送一个SIGTERM信号,等待一段时间后(默认10s)再发送SIGKILL信号终止容器。
此外,当Docker容器中指定的应用终结时,容器也自动终止。例如上一节提到的,用户通过exit命令或者Ctrl+d退出终端,所建的容器也会立刻停止。

进入容器

如果需要进入容器进行操作,有多个方法,包括docker execdocker attach命令,以及nsenter工具等。

dp_user@rqalnxg***:/usr/sap/wwpTools> sudo docker attach c5c3544df6e6

需要注意的是使用attach命令有时候不方便,当多个窗口attach到同一个容器里的时候,所有的窗口会同步显示。当某个窗口因为命令被阻塞,其他的窗口也将会没有办法执行操作。
在Docker 1.3以后,提供了一个更加方便的工具exec,可以直接在容器内运行命令。

dp_user@rqalnxgrid4:/usr/sap/wwpTools> sudo docker exec -it c5c3544df6e6 /bin/bash

删除容器

可以使用docker rm命令来删除处于终止状态的容器,命令格式是docker rm [OPTIONS] CONTAINER [CONTAINER...]。支持的选项有:

  • -f, -- force = false 强行终止并删除一个运行中的容器
  • -l,-- link = false 删除容器的链接,但是保留容器。
  • -v, --volumes = false 删除容器挂载的数据卷。

导入和导出容器

导出容器

导出容器是指导出一个已经创建的容器到一个文件,不管该容器是否是处于运行状态,都可以执行docker export命令,该命令的具体格式是docker export CONTAINER
例如,我们想要导出一个container ID是ceaeacfed873的容器,可以使用如下命令:

dp_user@rqalnx***:/usr/sap/wwpTools> sudo docker export ceaeacfed873 >test_run_container.tar
dp_user@rqalnx***:/usr/sap/wwpTools> ls
test_run_container.tar
导入容器

导出的文件同样也可以使用导入的命令docker import进行导入,称为镜像,例如:

dp_user@rqalnx***:/usr/sap/wwpTools> cat test_run_container.tar | sudo docker  import  - test/ubuntu:v1.0
dp_user@rqalnx***:/usr/sap/wwpTools> sudo docker images
REPOSITORY    TAG     IMAGE ID      CREATED         VIRTUAL SIZE
test/ubuntu   v1.0    ceeficcfed654    About a minutes ago     171.3MB

docker load 命令也可以导入一个镜像文件,使用该命令可以将一个镜像存储文件导入到本地的镜像库。
docker import命令可以导入一个容器快照到本地的镜像库, 其区别在于容器快照(也就是docker import)将会丢弃所有的历史记录和元数据信息(仅仅保存容器当时的快照状态),而镜像存储文件(即docker load)将保存完整的的记录,体积也会更大。

猜你喜欢

转载自blog.csdn.net/weixin_33738578/article/details/90987191