Docker使用示例(5) – 查看容器信息

查看容器信息

  1. docker inspect -f ‘<format>’ <container>

查看网络设置

  1. docker inspect -f ‘{{ .NetworkSettings }}’ <container>

以json格式输出:

  1. docker inspect -f ‘{{ json.NetworkSettings }}’ <container>

获取IP地址

  1. docker inspect -f ‘{{ .NetworkSettings.IPAddress }}’ <container>
  2. <container>

当docker inspect输出多个同类的元素时,我们可以获取指定次序的元素,如获取Config.Env第一个元素:

  1. docker inspect –format ‘{{ index (index .Config.Env) 0 }}’ <container>

也可以获取元素的数量:

  1. docker inspect –format ‘{{ len .Config.Env }}’ <container>

Docker使用示例(4) – 清理容器和镜像

清理容器

清理已停止的容器:

  1. docker rm $(docker ps -qa)

清理所有容器,包括正在运行的和停止的:

  1. docker rm -f $(docker ps -qa)

删除僵死容器

  1. docker rm $(docker ps –all -q -f status=dead)

删除已退出的容器

  1. docker rm $(docker ps –all -q -f status=exited)

清理镜像

清理未生成过容器的镜像

  1. docker rmi $(docker images -qa)

清理所有镜像

  1. docker rmi -f $(docker images -qa)

清理没有tag的镜像

  1. docker images -q -f dangling=true | xargs –no-run-if-empty –delim=’n’ docker rmi

Docker使用示例(3) – 调试容器

打印日志

通过跟踪日志调试正在运行的程序是一种较少干扰的方法。下面的例子相当于在容器中执行了tail -f some-application.log命令。

  1. docker logs –follow –tail 10 7786807d8084

如果你的日志里没有包含时间戳,可以添加–timestamps标志。

监控资源占用

监控系统资源使用情况是一种比较有效找到资源占用过多的程序的方法。下面的例子与通常使用的top命令一样。

  1. docker stats

可以监控几个指定容器的资源:

  1. docker stats 7786807d8084 7786807d8085

Docker统计显示如下信息:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
7786807d8084 0.65% 1.33 GB / 3.95 GB 33.67% 142.2 MB / 57.79 MB 46.32 MB / 0 B
默认情况下,docker stats命令显示的是容器的id,这对于识别容器没什么帮助,如果你想显示容器的名称,可以使用:

  1. docker stats $(docker ps –format ‘{{.Names}}’)

监控容器里的进程

下面的例子相当于传统的ps命令:

  1. docker top 7786807d8084

可以监控指定的进程,如faux:

  1. docker top 7786807d8084 faux

或者获取以root运行的进程列表:

  1. docker top 7786807d8084 -u root

Docker使用示例(2) – 管理容器

列出容器

  1. $ docker ps
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
  3. 2bc9b1988080        redis               "docker-entrypoint.sh"   2 weeks ago         Up 2 hours          0.0.0.0:6379->6379/tcp    elephant-redis
  4. 817879be2230        postgres            "/docker-entrypoint.s"   2 weeks ago         Up 2 hours          0.0.0.0:65432->5432/tcp   pt-postgres

docker ps只列出正在运行的容器。要查看所有容器(包括已停止的),使用-a选项:

  1. $ docker ps -a
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                     NAMES
  3. 9cc69f11a0f7        docker/whalesay     "ls /"                   26 hours ago        Exited (0) 26 hours ago                             berserk_wozniak
  4. 2bc9b1988080        redis               "docker-entrypoint.sh"   2 weeks ago         Up 2 hours                0.0.0.0:6379->6379/tcp    elephant-redis
  5. 817879be2230        postgres            "/docker-entrypoint.s"   2 weeks ago         Up 2 hours                0.0.0.0:65432->5432/tcp   pt-postgres

要列出特定状态的容器,可以使用-f选项指定。如下例子是列出已经退出的容器:

  1. $ docker ps -a -f status=exited
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                     NAMES
  3. 9cc69f11a0f7        docker/whalesay     "ls /"                   26 hours ago        Exited (0) 26 hours ago

也可以使用-q选项来列出容器的ID:

  1. $ docker ps -aq
  2. 9cc69f11a0f7
  3. 2bc9b1988080
  4. 817879be2230

如果在生成容器时使用了–name mycontainer1指定名称,我们可以使用此名称来找到这个容器:

  1. docker ps -f name=mycontainer1

引用容器

Docker命令可以使用以下三种方式来引用容器:
Full UUID:9cc69f11a0f76073e87f25cb6eaf0e079fbfbd1bc47c063bcd25ed3722a8cc4a
Short UUID:9cc69f11a0f7
Name:berserk_wozniak
使用docker ps可以看到这三种形式。
UUID是Docker自动生成的,不能更改。你可以使用–name来指定一个你的名称。如果不指定,Docker则会分配一个随机的名称。

删除所有退出的容器

  1. docker ps -aq -f status=exited | xargs -r docker rm

其中docker ps -aq -f status=exited会列出所有已退出的容器的ID
或者使用:

  1. docker rm $(docker ps -aq -f status=exited)

连接后台运行的容器

  1. docker attach –sig-proxy=false <container>

使用这个命令会连接到容器的bash,意味着如果容器里运行着一个脚本,你会看到脚本的输出。
如果要断开连接,使用Ctrl-P Ctrl-Q。
如果要创建一个新的容器bash环境并进入,可以使用:

  1. docker exec -it <container> bash

从/到容器复制文件

从容器到宿主:

  1. docker cp CONTAINER_NAME:PATH_IN_CONTAINER PATH_IN_HOST

从宿主到容器:

  1. docker cp PATH_IN_HOST CONTAINER_NAME:PATH_IN_CONTAINER

启动/停止/重启容器

启动:

  1. docker start <container> [<container>…]

停止:

  1. docker stop <container> [<container>…]

重启:

  1. docker restart <container> [<container>…]

Docker使用示例(1) – 创建容器

容器运行后自动删除

一般情况下,退出一个Docker容器后它仍然会存在。这允许你再次运行容器,查看其文件系统等。不过,有时候你可能想运行容器后马上自动删除。例如想执行一个命令或者查看一个文件。Docker为此提供了一个–rm命令行参数来实现它。

  1. docker run –rm ubuntu cat /etc/hosts

这会从ubuntu镜像创建一个容器,显示/etc/hosts的内容,然后退出后立即销毁容器。
这避免了你只是想做下实验后再清理容器的麻烦。
注意:–rm选项在与-d(–detach)选项时失效。
当使用–rm选项时,Docker被删除后也会删除与之关系的volumes。这与执行docker rm -v my-container类似。只删除未命名的volumes。
例如,运行docker run -it –rm -v /etc -v logs:/var/log centos /bin/produce_some_logs,/etc数据卷会被删除,/var/log则不会。

容器重启策略

  1. docker run –restart=always -d <container>

默认情况下,当Docker守护进程重启时(如主机系统重启),容器不会跟着重启。Docker为容器提供了一个重启策略,选项为–restart=always。使用此选项一旦Docker守护里程重启后,容器也会重启。
不过,如果是手动停止的容器(如docker stop ),重启策略则不会生效。

设置容器名称

默认下,使用docker run创建容器时会分配一个随机的名称,如small_roentgen或modest_dubinsky。这种名称对识别容器不会有任何帮助。我们可以通过–name选项来指定一个有意义的名称。

  1. docker run –name my-ubuntu ubuntu:14.04

名称必须是唯一的。如果指定了一个与正在运行容器的名称一样,docker会报错并且不会创建任何容器。

后台运行容器

为了让容器在后台运行,我们可以在生成容器时使用-d选项。

  1. docker run -d busybox top

给容器分配数据卷

Docker 数据卷(volume)其实是一个文件或者目录,它在容器生命周期结束后还会保留。我们可以挂载宿主机的一个文件或目录作为Docker的数据卷。
使用-v选项添加一个数据卷:

  1. docker run -d -v "/data" awesome/app bootstrap.sh

这会创建一个数据卷并把它挂载到容器的/data目录。

挂载宿主目录

挂载宿主文件或目录到容器:

  1. docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh

这会把宿主的/home/foo/data目录挂载到容器里的/data目录。这个操作就会Linux的mount命令。因此这个挂载只存在于容器的生命周期。更改宿主/home/foo/data的文件会立即影响到容器的/data对应的文件里,因为它们是指向硬盘上的同一个文件。

命名数据卷

可以在创建数据卷时指定一个名称,而不只是主机目录路径。

  1. docker run -d -v "my-volume:/data" awesome/app bootstrap.sh

命名的数据卷创建后,可以通过此名称来与其它容器共享。

交互方式运行容器

使用-it选项来以交互方式运行容器。

  1. $ docker run -it ubuntu:14.04 bash
  2. root@8ef2356d919a:/# echo hi
  3. hi
  4. root@8ef2356d919a:/#

-i选项保持STDIN打开,而-t则分配一个伪TTY。

登录正在运行的容器

我们可以使用如下命令来登录正在运行的容器

  1. docker exec -it jovial_morse bash