docker入门
<h2>1 docker是什么</h2>
<p>docker是一种容器化技术,可以将软件打包成标准化单元,以用于开发、交付和部署。能够对进程进行封装隔离,
属于操作系统层面的虚拟化技术。</p>
<h3>1.1 与传统虚拟化技术的优势</h3>
<ul>
<li>启动速度快,启动基本上是秒级,比传统虚拟化技术快很多;</li>
<li>资源利用率高,一台主机上可以同时运行很多个docker容器,但一台主机能够虚拟化的机器有限;</li>
<li>更快速的交互和部署</li>
<li>更高效的虚拟化,能够实现更高的性能和效率;</li>
<li>更轻松的迁移和扩展</li>
<li>更简单的管理
<h2>2 基本概念</h2></li>
<li>镜像,是一个特殊的文件系统,相当于把一个应用运行所需要的所有东西定格起来,可以简单理解为java中类
之于对象的关系;</li>
<li>容器,镜像运行的实例,可类比于对象之于类的关系;</li>
<li>仓库,存放镜像的地方,可分为私有仓库和公开仓库两种形式;</li>
<li>数据卷,
<h2>3 镜像介绍</h2>
<p>Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载。</p>
<h3>3.1 如何获取镜像</h3></li>
<li>使用 docker pull 镜像名:标签 命令来从默认仓库获取所需要的镜像。(也可从指定仓库获取)
<h3>3.2 列出镜像</h3></li>
<li>使用 docker images 显示本地已有的镜像。
<h3>3.3 创建镜像</h3></li>
<li>修改已有的镜像</li>
<li>通过Dockerfile文件构建docker镜像
<h3>3.4 导出和载入镜像</h3></li>
<li>从镜像导出,docker save [options] outfileName image:tag (option可为-o或>)</li>
<li>从压缩包导入,docker load [option] infileName (option可为-i或<),与save配套
<h3>3.5 移除镜像</h3></li>
<li>使用 docker rmi 镜像id 命令移除镜像
<h3>3.6 docker镜像的实现原理</h3>
<h2>4 容器介绍</h2>
<p>容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作
系统。</p>
<h3>4.1 启动容器</h3></li>
<li>基于镜像新建一个容器并启动,使用docker run 命令</li>
<li>将在终止状态(stopped)的容器重新启动,docker start 容器id
<h3>4.2 进入容器</h3>
<p>在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用
docker attach 命令或docker exec命令等。</p></li>
<li>docker attach 容器名,docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。</li>
<li>docker exec -it containerName /bin/sh,只用-i时,由于没有分配伪终端,看起来像pipe执行一样。使用
-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致整个容器退出。
<h3>4.3 导入导出容器</h3></li>
<li>从容器导出,docker export [option] outfileName container (option可为-o)</li>
<li>从压缩包导入,docker import [option] infileName image:tag (option可为-i)</li>
</ul>
<p>用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器
快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的
快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等
元数据信息。</p>
<h3>4.4 删除容器</h3>
<ul>
<li>docker rm containerId,根据容器id删除容器
<h3>4.5 守护态运行docker容器</h3>
<p>docker run的时候加上-d参数。</p>
<h3>4.6 停止容器</h3></li>
<li>docker stop containerId,根据容器id停止容器
<h2>5 仓库介绍</h2>
<p>仓库(Repository)是集中存放镜像的地方。</p></li>
</ul>
<p>一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可
以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对
于仓库地址 dl.dockerpool.com/ubuntu 来说,dl.dockerpool.com 是注册服务器地址,ubuntu 是仓库名。</p>
<h3>5.1 Docker Hub</h3>
<p>Docker 官方维护了的公共仓库 。</p>
<p>基本操作:</p>
<ul>
<li>docker login,登录</li>
<li>docker search,查找官方仓库的镜像</li>
<li>docker pull,拉取镜像</li>
<li>docker push,推送镜像到仓库</li>
<li>docker tag,给镜像打标签
<h3>5.2 docker的私有仓库</h3>
<p>有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。</p></li>
</ul>
<p>docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。</p>
<h3>5.3 Docker配置文件</h3>
<p>Docker 的 Registry 利用配置文件提供了一些仓库的模板(flavor),用户可以直接使用它们来进行开发或生产
部署。</p>
<p>在 config_sample.yml 文件中,可以看到一些现成的模板段:</p>
<ul>
<li>common:基础配置</li>
<li>local:存储数据到本地文件系统</li>
<li>s3:存储数据到 AWS S3 中</li>
<li>dev:使用 local 模板的基本配置</li>
<li>test:单元测试使用</li>
<li>prod:生产环境配置(基本上跟s3配置类似)</li>
<li>gcs:存储数据到 Google 的云存储</li>
<li>swift:存储数据到 OpenStack Swift 服务</li>
<li>glance:存储数据到 OpenStack Glance 服务,本地文件系统为后备</li>
<li>glance-swift:存储数据到 OpenStack Glance 服务,Swift 为后备</li>
<li>elliptics:存储数据到 Elliptics key/value 存储</li>
</ul>
<p>用户也可以添加自定义的模版段。默认情况下使用的模板是 dev,要使用某个模板作为默认值,可以添加
SETTINGS_FLAVOR 到环境变量中</p>
<h2>6 数据管理</h2>
<p>数据管理包括Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:</p>
<ul>
<li>数据卷(Data volumes)</li>
<li>数据卷容器(Data volume containers)
<h3>6.1 数据卷</h3>
<p>数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:</p></li>
<li>数据卷可以在容器之间共享和重用</li>
<li>对数据卷的修改会立马生效</li>
<li>对数据卷的更新,不会影响镜像</li>
<li>卷会一直存在,直到没有容器使用</li>
</ul>
<h4>6.1.1 创建一个数据卷</h4>
<ol>
<li>在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂
载多个数据卷。
<code>docker run -d -P --name web -v /webapp training/webapp python app.py</code>
注意:也可以在 Dockerfile 中使用 VOLUME 来添加一个或者多个新的卷到由该镜像创建的任意容器。
<h4>6.1.2 挂载一个主机目录作为数据卷</h4>
<p>使用 -v 标记也可以指定挂载一个本地主机的目录到容器中去。
<code>docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py</code></p></li>
</ol>
<p>该命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。本地目录的路径必须是绝对路径,如果目录
不存在 Docker 会自动为你创建它。</p>
<p>注意:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的
路径格式不一样,所以目前还不能支持。</p>
<p>Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。
<code>docker run -d -P --name web -v /src/webapp:/opt/webapp:ro</code></p>
<h4>6.1.3 挂载一个主机文件作为数据卷</h4>
<p>-v 标记也可以从主机挂载单个文件到容器中
<code>docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash</code></p>
<h3>6.2 数据卷容器</h3>
<p>如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器,其实就是一个正常的
容器,专门用来提供数据卷供其它容器挂载的。</p>
<ol>
<li>首先,创建一个命名的数据卷容器 dbdata:
<code>docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres</code></li>
<li>
<p>然后,在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。</p>
<pre><code>docker run -d --volumes-from dbdata --name db1 training/postgres
docker run -d --volumes-from dbdata --name db2 training/postgres</code></pre>
</li>
<li>还可以使用多个 --volumes-from 参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容
器来挂载数据卷。
<code>docker run -d --name db3 --volumes-from db1 training/postgres</code></li>
</ol>
<p>*注意:使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。</p>
<p>如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须
在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。 这可以让用户在容器
之间升级和移动数据卷。</p>
<h3>6.3 数据备份、恢复</h3>
<p>可以利用数据卷对其中的数据进行进行备份、恢复和迁移。</p>
<h4>6.3.1 备份</h4>
<p>首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的
/backup 目录。命令如下:</p>
<pre><code>docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata</code></pre>
<p>容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar。</p>
<h4>6.3.2 恢复</h4>
<p>如果要恢复数据到一个容器,首先创建一个带有数据卷的容器 dbdata2。</p>
<pre><code>docker run -v /dbdata --name dbdata2 ubuntu /bin/bash</code></pre>
<p>然后创建另一个容器,挂载 dbdata2 的容器,并使用 untar 解压备份文件到挂载的容器卷中。</p>
<pre><code>docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar</code></pre>
<h2>7 Dockerfile</h2>
<p>使用 Dockerfile 可以允许用户创建自定义的镜像。</p>
<h3>7.1 Dockerfile 基本结构</h3>
<p>Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。</p>
<p>一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。</p>
<p>例如</p>
<pre><code># This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# Base image to use, this must be set as the first line
FROM ubuntu
# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com
# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
CMD /usr/sbin/nginx</code></pre>
<p>其中,一开始必须指明所基于的镜像名称,接下来推荐说明维护者信息。</p>
<p>后面则是镜像操作指令,例如 RUN 指令,RUN 指令将对镜像执行跟随的命令。每运行一条 RUN 指令,镜像添加
新的一层,并提交。</p>
<p>最后是 CMD 指令,来指定运行容器时的操作命令。</p>
<h3>7.2 Dockerfile 指令</h3>
<p>指令的一般格式为 INSTRUCTION arguments,指令包括 FROM、MAINTAINER、RUN 等。</p>
<h4>FROM</h4>
<p>格式为 <code>FROM <image>或FROM <image>:<tag></code>。</p>
<p>第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令
(每个镜像一次)。</p>
<h4>MAINTAINER</h4>
<p>格式为 <code>MAINTAINER <name></code>,指定维护者信息。</p>
<h4>RUN</h4>
<p>格式为 <code>RUN <command></code> 或 <code>RUN ["executable", "param1", "param2"]</code>。</p>
<p>前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种
方式实现,例如 <code>RUN ["/bin/bash", "-c", "echo hello"]</code>。</p>
<p>每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。</p>
<h4>CMD</h4>
<p>支持三种格式</p>
<ul>
<li><code>CMD ["executable","param1","param2"]</code> 使用 exec 执行,推荐方式;</li>
<li><code>CMD command param1 param2</code> 在 /bin/sh 中执行,提供给需要交互的应用;</li>
<li><code>CMD ["param1","param2"]</code> 提供给 ENTRYPOINT 的默认参数;</li>
</ul>
<p>指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被
执行。</p>
<p>如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。</p>
<h4>EXPOSE</h4>
<p>格式为 <code>EXPOSE <port> [<port>...]</code>。</p>
<p>告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配
一个端口转发到指定的端口。</p>
<h4>ENV</h4>
<p>格式为 <code>ENV <key> <value></code>。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。</p>
<p>例如</p>
<pre><code>ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH</code></pre>
<h4>ADD</h4>
<p>格式为 <code>ADD <src> <dest></code>。</p>
<p>该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也
可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。</p>
<h4>COPY</h4>
<p>格式为 <code>COPY <src> <dest></code>。</p>
<p>复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>。</p>
<p>当使用本地目录为源目录时,推荐使用 COPY。</p>
<h4>ENTRYPOINT</h4>
<p>两种格式:</p>
<pre><code>ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行)。</code></pre>
<p>配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。</p>
<p>每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。</p>
<h4>VOLUME</h4>
<p>格式为 <code>VOLUME ["/data"]</code>。</p>
<p>创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。</p>
<h4>USER</h4>
<p>格式为 <code>USER daemon</code>。</p>
<p>指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。</p>
<p>当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用 gosu,而
不推荐 sudo。</p>
<h5>WORKDIR</h5>
<p>格式为 <code>WORKDIR /path/to/workdir</code>。</p>
<p>为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。</p>
<p>可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如</p>
<pre><code>WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd</code></pre>
<p>则最终路径为 /a/b/c。</p>
<h4>ONBUILD</h4>
<p>格式为 <code>ONBUILD [INSTRUCTION]</code>。</p>
<p>配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。</p>
<p>例如,Dockerfile 使用如下的内容创建了镜像 image-A。</p>
<pre><code>[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]</code></pre>
<p>如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行
ONBUILD 指令内容,等价于在后面添加了两条指令。</p>
<pre><code>FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src</code></pre>
<p>使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。</p>
<h3>7.3 Dockerfile 创建镜像</h3>
<p>通过命令 docker bulid -t image:tag Dockerfile文件路径 创建镜像。</p>
<h2>8 容器的交互方式</h2>
<p>容器中的应用与外部的交互方式有两种:1.容器的连接系统;2.端口映射。</p>
<h3>8.1 容器的连接系统</h3>
<p>该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。</p>
<h4>8.1.1 自定义容器名</h4>
<p>连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。</p>
<p>虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:</p>
<ul>
<li>自定义的容器名,比较好记;</li>
<li>当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器;</li>
</ul>
<p>使用 --name 标记可以为容器自定义命名。
<code>docker run -d -P --name web training/webapp python app.py</code>
可以使用 docker inspect 来查看容器内部信息。</p>
<p>注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要
先用docker rm 来删除之前创建的同名容器。</p>
<p>在执行 docker run 的时候如果添加 --rm 标记,则容器在终止后会立刻删除。注意,--rm 和 -d 参数不能同
时使用。</p>
<h4>8.1.2 容器互联</h4>
<p>使用 --link 参数可以让容器之间安全的进行交互。步骤如下:</p>
<p>先创建一个新的数据库容器。</p>
<pre><code>docker run -d --name db training/postgres</code></pre>
<p>然后创建一个 web 容器,并将它连接到 db 容器</p>
<pre><code>docker run -d -P --name web --link db:db training/webapp python app.py</code></pre>
<p>此时,db 容器和 web 容器建立互联关系。</p>
<p>--link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名。</p>
<p>使用 docker ps 来查看容器的连接</p>
<pre><code>$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db, web/db
aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp web</code></pre>
<p>可以看到自定义命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。这表示 web 容器链接到 db
容器,web 容器将被允许访问 db 容器的信息。</p>
<p>Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db 容器的
时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上。</p>
<h3>8.2 外部访问容器</h3>
<p>容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。</p>
<p>当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。可以通过
docker ps 命令查看映射的端口。</p>
<p>-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。</p>
<ul>
<li>hostPort:containerPort,映射指定的主机端口到容器端口;</li>
<li>ip:hostPort:containerPort,映射指定主机的指定端口到容器端口;</li>
<li>ip::containerPort,映射指定主机的任意端口到容器端口;</li>
</ul>
<h2>9 附录:docker命令</h2>
<h3>9.1 容器生命周期管理</h3>
<ul>
<li>
<p>docker run :创建一个新的容器并运行,语法:<code>docker run [OPTIONS] IMAGE [COMMAND] [ARG...]</code></p>
<pre><code>-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--restart=always: 主机开机容器自启;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷</code></pre>
</li>
<li>docker start/stop/restart :开始、停止、重启容器</li>
<li>docker kill :杀掉一个运行中的容器。</li>
<li>docker rm :删除一个或多少容器,语法:<code>docker rm [OPTIONS] CONTAINER [CONTAINER...]</code>
<pre><code>-f :通过SIGKILL信号强制删除一个运行中的容器
-l :移除容器间的网络连接,而非容器本身
-v :-v 删除与容器关联的卷 </code></pre></li>
<li>docker pause/unpause :暂停/恢复容器中的所有进程</li>
<li>docker create :创建一个新的容器但不启动它</li>
<li>docker exec :在运行的容器中执行命令,语法:<code>docker exec [OPTIONS] CONTAINER COMMAND [ARG...]</code>
<pre><code>-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端</code></pre>
<h3>9.2 容器操作</h3></li>
<li>docker ps : 列出容器,语法:<code>docker ps [OPTIONS]</code>
<pre><code>-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。</code></pre></li>
<li>docker inspect : 获取容器/镜像的元数据,语法:<code>docker inspect [OPTIONS] NAME|ID [NAME|ID...]</code>
<pre><code>-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。</code></pre></li>
<li>docker top :查看容器中运行的进程信息,支持 ps 命令参数,
语法:<code>docker top [OPTIONS] CONTAINER [ps OPTIONS]</code></li>
<li>docker attach :连接到正在运行中的容器。退出会停止容器。</li>
<li>docker events : 从服务器获取实时事件。</li>
<li>docker logs : 获取容器的日志,语法:<code>docker logs [OPTIONS] CONTAINER</code>
<pre><code>-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志</code></pre></li>
<li>docker wait : 阻塞运行直到容器停止,然后打印出它的退出代码。</li>
<li>docker port : 列出指定的容器的端口映射。
<h3>9.3 容器rootfs命令</h3></li>
<li>docker commit :从容器创建一个新的镜像,语法:<code>docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]</code>
<pre><code>-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。</code></pre></li>
<li>docker cp :用于容器与主机之间的数据拷贝。语法如下:
<pre><code>docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH</code></pre></li>
<li>docker diff : 检查容器里文件结构的更改。
<h3>9.4 镜像仓库</h3></li>
<li>
<p>docker login/logout : 登陆/登出到镜像仓库,若未指定镜像仓库地址,默认为官方仓库,语法如下:</p>
<pre><code>docker login [OPTIONS] [SERVER]
docker logout [OPTIONS] [SERVER]
OPTIONS说明:
-u :登陆的用户名
-p :登陆的密码</code></pre>
</li>
<li>docker pull : 从镜像仓库中拉取或者更新指定镜像</li>
<li>docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库</li>
<li>docker search : 从Docker Hub查找镜像
<h3>9.5 本地镜像管理</h3></li>
<li>docker images : 列出本地镜像。语法:<code>docker images [OPTIONS] [REPOSITORY[:TAG]]</code>
<pre><code>-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。</code></pre></li>
<li>docker rmi : 删除本地一个或多少镜像。语法:<code>docker rmi [OPTIONS] IMAGE [IMAGE...]</code>
<pre><code>-f :强制删除;
--no-prune :不移除该镜像的过程镜像,默认移除;</code></pre></li>
<li>docker tag : 标记本地镜像,将其归入某一仓库。</li>
<li>docker build 命令用于使用 Dockerfile 创建镜像。语法:<code>docker build [OPTIONS] PATH | URL | -</code>
<pre><code>--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式</code></pre></li>
<li>docker history : 查看指定镜像的创建历史,语法:<code>docker history [OPTIONS] IMAGE</code>
<pre><code>-H :以可读的格式打印镜像大小和日期,默认为true;
--no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。</code></pre></li>
<li>docker save : 将指定镜像保存成 tar 归档文件。</li>
<li>docker load : 导入使用 docker save 命令导出的镜像。</li>
<li>docker import : 从归档文件中创建镜像。
<h3>9.6 info | version</h3></li>
<li>docker info : 显示 Docker 系统信息,包括镜像和容器数。
docker version :显示 Docker 版本信息。</li>
</ul>