Docker 笔记

Docker

  • 笔记来源:https://docs.docker.com/ 和 《docker 容器和容器云》

  • 此笔记是我在学习过程中的收集,后续还会继续完善。如果有哪里不正确,可以下面留言或者给我邮箱(wunhwantseng@gmail.com)

Docker

  • Docker 是一个轻量级虚拟化技术。它具备传统虚拟机无可比拟的优势,更简易的安装和使用方式、更快的速度、服务集成和开发流程自动化,使得 Docker 被广大技术爱好者青眯。

Docker daemon

  • Docker daemon 是 Docker 守护进程,负责接收并分发执行 Docker 命令。
  • Docker 命令的执行一般都需要获取 root 权限。因为 Docker 的命令工具与 Docker daemon 是同一个二进制文件,而 Docker daemon 负责接收并执行来自 docker 的命令,而 Docker daemon 的运行时需要 root 权限。从 Docker 0.5.2 version 开始,Docker Daemon 默认绑定一个 Unix Socket 来代替原来的 TCP 端口,改 Unix Socket 默认是属于 root 用户的。因此,在执行 docker 命令时,需要使用 sudo 来获取 root 权限。

Docker 子命令分类

  • Docker 环境信息
    • info
      • docker info:用于检查 Docker 是否正确安装
    • version
      • docker version:
  • 容器生命周期管理
    • create
    • exec
    • kill
    • pause
    • restart
    • rm
    • run
    • start
    • stop
    • unpause
  • 镜像仓库命令
    • login
    • logout
    • pull
    • push
    • search
  • 镜像管理
    • build
    • images
    • import
    • load
    • rmi
    • save
    • tag
    • commit
  • 容器运维操作
    • attach
    • export
    • inspect
    • port
    • ps
    • rename
    • stats
    • top
    • wait
    • cp
    • diff
    • update
  • 容器资源管理
    • volume
    • network
  • 系统日志信息
    • events
    • history
    • logs


      docker命令结构图.png

Docker 环境信息

Docker info

  • Docker Info 命令用于检查 Docker 是否正确安装。如果 Docker 正确安装,该命令会输出 Docker 的配置信息。
  • Docker info 命令一般结合 docker version 命令使用,两者结合使用能够提取足够详细的 Docker 环境信息。
  • docker info

Docker version

  • Docker version 查看 Docker 版本
  • docker --version

Docker 容器生命周期管理

Docker create

  • 创建一个新的容器
  • docker create [options] image [command][arg...]

Docker exec

  • Docker 可以通过 docker exec 命令,可以再容器内直接执行任意命令。该命令的基本格式:
    • -i,--interactive=true|false:是否标准输入接受用户输入命令,默认为 false
    • --privileged=true|false:是否给执行命令以最高权限,默认为 false
    • -t:分配伪终端
    • -u,--user=”“,执行命令的用户名或 ID
  • docker exec -it 243c32535da7 /bin/bash

Docker kill

  • 杀死一个或多个容器进程
  • docker kill [options] container [container...]
    • -s:发送一个信号给容器(signal to send to the container)
      • docker kill -s=HUP

Docker start/stop/restart

  • 对于已经存在的容器,可以通过 docker start/stop/restart 命令来启动、停止和重启。利用 docker run 命令新建一个容器时,Docker 将自动为每个新容器分配唯一的 ID 来标识。docker start/stop/restart 命令一般利用容器 ID 标识确定具体容器,在一些情况下也可以使用容器名来确定容器。
  • docker start 命令使用 -i 选项来开启交互模式,始终保持输入流开放。使用 -a 选项来附加标准输入、输出或错误输出。此外,docker stop 和 docker restart 命令使用 -t 选项来设定容器停止前等的等待时间。

Docker run

  • Example:docker run [OPTIONS] IMAGE [COMMAND] .[ARG...]
  • docker run 命令用来基于特定的镜像创建一个容器,并依赖选项来控制该容器。
    • 如:sudo docker run ubuntu echo "Hello Wrold"
      • 这是 docker run 命令最基础的使用方法,该命令从 ubuntu 镜像启动一个容器,并执行 echo 命令来打印出一个“Hello World”。执行完 echo 命令后,容器将停止运行。docker run 命令启动的容器会随机分配一个容器 ID(Container Id),用以标识该容器。
    • 如:sudo docker run -i -t --name ubuntu docker.io/ubuntu:latest /bin/bash
      • docker run 命令启动一个容器,并为它分配一个伪终端执行/bin/bash 命令,用户可以在该伪终端与容器进行交互。
      • -d:守护状态运行;
      • -i:表示使用交互模式,始终保持输入流开放;
      • -t:表示分配一个伪终端,一般两个参数结合时使用-it,即可在容器利用打开的伪终端进行交互操作;
      • --name:可以指定 docker run 命令启动的容器的名字。若无此选项,Docker 将为容器随机分配一个名字。
      • -c:用于给运行在容器中的所有进程分配 CPU 的 shares 指。这是一个相对权重,实际的处理速度还与宿主机 CPU 相关。
      • -m:用于限制为容器中所有进程分配内存总量,以 B、K、M、G 为单位。
      • --link:可以理解为一条 IP 地址的单向纪录信息,可以让容器之间安全地进行交互。
        • docker run -rm --name web --link [name]:[alias]
      • -v:用于挂在一个 volume,可以用多个-v 参数同时挂载多个 volume。volume 的格式[host-dir]:[container-dir]:[rw|ro]。
        • Docker 挂载数据卷的默认权限是读写(rx),用户也可以通过 ro 指定为只读:
      • -p:用于将容器的端口暴露给宿主机的端口,其常用格式为 hostPost:container-Port。通过端口的暴露,可以让外部主机通过宿主机暴露的端口来访问容器内的应用。
      • -P:Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
      • --rm:容器在终止后会立刻删除。注:--rm 和-d 不能同时使用。

Docker pause

  • 暂停一个或多个容器中的所有进程(pause all processes within one or more containers)
  • docker pause container [container...]

Docker unpause

  • 恢复一个或多个容器中的所有进程(unpause all processes within one or more containers)
  • docker unpause container [container...]

Docker registry 容器镜像仓库

  • Docker registry 是存储容器镜像的仓库。用户可以通过 Docker client 与 Docker registry 进行通信,以此来完成镜像的搜索、下载和上传等相关操作。

docker pull

  • Example:docker pull [OPTIONS] NAME[:TAG @DIGEST]
    • OPTIONS:
      • -a:是否获取仓库中的所有镜像,默认为否
      • --all-tags:true|false:等于-a
  • 在使用 docker pull 命令时。可以从官方的 Docker Hub 中的官方镜像库、其他公共库、私人库中获取镜像资源。同时,还可以从私有服务器中获取镜像资源。只需在具体的镜像名前添加用户名、特定库名或服务器地址即可获取镜像。
    • sudo docker pull ubuntu # 从官方 Hub(Docker Hub) 拉取 Ubuntu:latest 的镜像
    • sudo docker pull ubuntu:ubuntu12.04 # 从官方 Hub(Docker Hub) 拉取指明"Ubuntu 12.05"Tag 的镜像
    • sudo docker pull SEL/ubuntu # 从特定的仓库拉去 Ubuntu 镜像
    • sudo docker pull 10.10.103.215:5000/sshd # 从其他服务器拉取镜像

docker push

  • docker push 可以将本地的 image 或 repository 推送到 Docker Hub 的公共或私有镜像库、私有服务器。默认上传到 Docker Hub 官方仓库
    • docker push [OPTIONS] NAME:[:TAG]
    • docker push [OPTIONS] NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/] NAME[:TAG]
      • docker push SEL/ubuntu

docker login

  • 登录镜像仓库
  • docker login [options][server]
    • -p:密码
    • -u:用户名

docker logout

  • 从镜像仓库退出
  • docker logout [server]

镜像管理

  • 用户可以在本地保存镜像资源,为此 Docker 提供了相应的管理子命令。

docker images

  • docker images 命令可以列出主机上的镜像,默认只列出最顶层的镜像,可以使用 -a 选项显示所有镜像。
  • docker images [OPTIONS].[REPOSITORY[:TAG]]
    • -a:列出所有的镜像文件(默认隐藏中间的镜像)
    • --digests=true|(defalut)false:列出镜像的数字摘要值
    • -f,--filter:按条件过滤镜像
      • dangling (boolean - true or false)
      • label (label=<key> or label=<key>=<value>)
      • before (<image-name>:[:<tag>],<image id> or image@digest) - filter images created before given id or references
      • since (<image-name>:[:<tag>],<image id> or image@digest) - fimter images created since given id or references
      • reference (pattern of an image reference) - filter images whose reference matches the specified pattern
        • docker images --filter-reference='ubuntu:latest'
    • --format string: 以 Go 模板格式输出 (pretty-print images using a go template)
      • template format
        • .ID:image ID
        • .Repository:image repository
        • .Tag:image tag
        • .Digest:image digest
        • .CreatedSince
        • .CrearedAt
        • .Size
      • Example:docker images --format "{{.ID}}:{{.Repository}}"
    • --no-trunc=true|false:不截断输出(Don't truncate output)
    • -q,--quiet=true|(default)false:仅输出 ID 信息

docker tag

  • 为了方便在后续工作中使用特定镜像,还可以使用 docker tag 命令来为本地镜像任意添加新的标签。
  • docker tag <oldImage>:[TAG] <newImage>:[TAG]
  • 这些新的和旧的镜像的 ID 完全一致。实际上它们指向同一个镜像文件,只是别名不同而已。docker tag 命令添加的标签实际上起到类似链接的作用。

docker rmi

  • 命令用于移除镜像,可以支持同时移除多个镜像,也可以按照条件来移除。
  • docker rmi [OPTIONS] IMAGE [IMAGE...]
    • -f:强制除去镜像(force removal of image)
    • --no-prune:不要删除未标记的父镜像(Do not delete untagged parents)
  • PS:使用 rmi 命令移除镜像时。如果已有基于该镜像启动的容器存在,则无法直接移除,需要先移除容器。当然,提供-f 选项,可强制移除存在容器的镜像或启动中的容器。

docker rm

  • 命令用于移除容器,可以支持同时移除多个容器,也可以按照条件来移除。
  • docker rm [OPTIONS] CONTAINER [CONTAINER...]
    • -f:强制杀死并移除一个运行中的容器;(Force the removal of a running container(uses SIGKILL))
    • -l:移除指定链接;(remove the specified link)
    • -v:移除容器挂载的数据卷;(remove anonymous volumes associalted with the container)

Volume 数据卷

  • volume 是存在于一个或多个容器中的特定文件或者文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供一下便利:
    • volume 在容器创建时就会初始化,在容器运行时就可以使用其中的文件
    • volume 能在不同的容器之间共享和重用
    • 对 volume 中数据的操作会马上生效
    • 对 volume 中数据的操作不会影响到镜像本身
    • volume 的生命周期独立于容器的生命周期,即使删除容器,volume 仍然会存在,没有任何容器使用的 volume 也不会被 Docker 删除

创建 volume

  • 可以通过 docker volume create 创建一个 volume
    • docker volume create --那么 vol_simple
  • 在使用 docker run 和 docker create 创建容器时,也可以使用 -v 标签为容器添加 volume
    • sudo docker run -d -v /data ubuntu /bin/bash
    • sudo docker run -d -v vol_simple:/data ubuntu /bin/bash

挂载 volume

  • docker 同时也允许我们将宿主机上的目录挂载到容器中
  • 在 /host/dir 文件夹中的所有文件或文件夹可以在容器的 /container/dir 文件夹下被访问。如果镜像中原本存在 /container/dir 文件夹,该文件夹下原有的内容将被隐藏,以保持与宿主机中的文件夹一致。
    • sudo docker run -d -v /host/dir:/container/dir ubuntu /bin/bash
  • 将主机上的文件或文件夹作为 volume 挂载时,可以使用 :ro 指定该 volume 为只读
    • sudo docker run -it --name vol_read_only -v /host/dir:/container/dir:ro
  • 可以再 volume 挂载时使用 z 和 Z 来指定该 volume 是否可以共享。docker 中默认的是 z,即共享该 volume。也可以在挂载时使用 z 来标注该 volume 为私有数据卷
    • sudo docker run -it --name vol_unshared -v /host/dir:/container/dir:Z ubuntu /bin/bash

共享 volume(--volumes-from)

  • 在使用 docker run 或 docker create 创建新容器时,可以使用 --volumes-from 标签来使得容器与已有的容器共享 volume。
    • docker run --rm -it --name vol_use --volumes-from vol_simple ubuntu /bin/bash
  • 一个容器挂载了一个 volume ,即使这个容器停止运行,该 volume 仍然存在,其他容器也可以使用 --volumes-from 与这个容器共享 volume。如果有一些数据,比如配置文件、数据文件等,需要在多个容器之间共享,一种常见的做法是创建一个数据容器,其他的容器与之共享 volume;
    • docker run --name vol_data -v /data ubuntu echo "this is a data-only container"
    • docker run -it --name -vol_share1 --volume-from vol_data ubuntu /bin/bash

删除 volumn

  • 如果创建容器时从容器中挂载了 volume,在/var/lib/docker/volumes 下会生成与 volume 对应的目录,使用 docker rm 删除容器并不会删除与 volume 对应的目录,这些目录会占据不必要的存储空间。在删除容器时一并删除:
    • 使用 docker volume rm <volume_name> 删除 volume
    • 使用 docker rm -v <container_name> 删除容器
    • 在运行容器时使用 docker run --rm,--rm 标签会在容器停止运行时删除容器以及容器所挂载的 volume

创建镜像

基于已有镜像的容器创建

  • 该方法主要是使用 docker commit 命令。

    • docker commit [OPTIONS] container [REPOSITORY[:TAG]]

      • -a,--author="":作者信息
      • -c,--change=[ ]:提交的时候执行 Dockerfile 指令,包括 CMD|ENTRYPOINT|ENV|EXPOSR|LABEL|ONBUILD|USER|VOLUME|WORKDIR 等;
      • -m,--message=”“:提交消息
      • -p,--pause=true:提交时暂停容器运行
    • docker commit -m "Add a new file" -a "zhangsan" a925cb40b3f0 test:0.1

基于本地模板导入

  • 用户可以直接从一个操作系统模板文件导入一个镜像
  • docker import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]

容器运维操作

docker history

  • 列出镜像各层的历史创建信息
  • docker history [options]
    • --format
    • --human,-H(default true):以人类可读的格式打印大小和日期(print sizes and dates in human readable format)
    • --no-trunc
    • --quiet

docker search

  • 搜索远程仓库中共享的镜像,默认搜索官方仓库中的镜像。
    • --filter,-f
    • --limit(default 25):max number of search results
    • --no-trunc
  • docker search [options] term

docker attach

  • 连接到正在运行的容器,观察该容器的运行环境,或与容器的主进程进行交互。
  • 将本地标准的输入、输出、异常流附加到正在运行的容器(Attach local standard input,output,error streams to a running container)
  • docker attach [options] container
    • --detach-keys:覆盖用于分离容器的密钥(override the key sequence for detaching a container)
    • --no-stdin:不附加标准输入(do not attach stdin)
    • --sig-proxy(default true):将所有接收到的信号代理到流程(proxy all receiced signals to the process)

docker inspect

  • 查看镜像和容器的详细信息,默认会以 JSON 数组渲染(输出:render)。可以通过--format 参数来指定输出的模板格式。
  • docker inspect [options] name|id [name:id...]
    • --format, -f:使用给定的 go 模板格式化输出(format the output using given go template)
    • --size, -s:如果类型为容器,则显示总文件大小(Diplay total files size if the type is container)
    • --type:返回一个指定类型的 JSON(return json for specified type)

docker ps

  • 容器列表(List Containers)
  • 可以查看容器相关信息,默认只显示正在运行的容器信息。可以查看到的信息包括 Container ID、Names、image、status、容器运行后执行的 COMMAND、创建时间 CREATED 和绑定开启的端口 PORTS。
  • docker ps [options]
    • -a:显示所有容器,默认只显示正在运行的容器。 (show all containers,default show just running)
    • --latest,-l:显示最新创建的容器,包括所有的状态。(show the latest created container,includes all states)
    • --last,-n(default -1):显示最后创建 N 个的容器,包括所有的状态。(show n last created containers.incluedes all states)
    • --filter,-f:根据提供的条件过滤输出。(filter output based on conditions provided)
    • --format:pretty-print containers using a go template
    • --no-trunc:don't truncate output
    • --quiet,-q:only display numeric ids
    • --size,-s:display total file sizes

docker commit

  • 可以将一个容器固化为一个新的镜像。当需要制作特定的镜像时,会进行修改容器的配置。如:在容器中安装特定工具等,可以通过该指令将这些修改配置保存起来,使其不会因为容器的停止而丢失。
  • 提交保存时,只能选用正在运行的容器(即可以通过 docker ps 查看的容器)来制定新的镜像。在制作特定的镜像时,直接使用该命令指示一个临时性的辅助命令,不推荐使用。官方建议通过 docker build 命令结合 dockerfile 创建和管理镜像。
  • docker commit [options] container [repository[:tag]]
    • --author,-a:Author(eg:"John Hanibal Smith hannibal@a-team.com")
    • --change,-c:通过 dockerfile 指令应用于创建的镜像(Apply Dockerfile instruction to the created image)
    • --message,-m:提交信息(commit message)
    • --pause,-p(default true):在操作期间暂停容器(Pause container during commit)

docker logs

  • 打印容器中进程的运行日志
    • docker logs [options] container

docker events

  • 打印出实时的系统事件
    • docker events [options]

docker stats

  • docker stats 命令是 Docker 1.5 版本中最新提供的命令,专门用于容器状态信息的统计,同时它还有配套的 API(GET/containers/(id)/stats),可供开发人员调用。使用该命令,用户可以实时监控启动中的容器的运行情况,包括 CPU、内存、快设备 I/O 和网络 I/O,这些信息都会定期刷新以显示最新的运行情况。
  • 显示容器资源使用情况统计信息的实时流(display a live stream of container(s) resource usage statistics)

docker port

  • 查看当前映射的端口配置,也可以查看绑定的地址
  • docker port conatiner [private_port[/proto]]

存出和载入镜像

docker save

  • 如果要导出镜像到本地文件,可以使用 docker save 命令。
  • docker save -o ubuntu_14.04.tar ubuntu:14.04

docker load

  • 使用 docker load 将导出的 tar 文件再导入到本地镜像库
  • docker load --input ubuntu_14.04.tar
  • docker load < ubuntu_14.04.tar

Dockerfile

  • Dockerfile 是 Docker 用来构建镜像的文本文件,包含自定义的指令和格式。

docker build 命令和镜像构建过程

镜像构建过程

  • 一般情况下,将本地主机的一个包含 Dockerfile 的目录中的所有内容作为上下文。上下文通过 docker build 命令传入 Docker daemon 后,便开始按照 Dockerfile 中的内容构造镜像。
  • Dockerfile 描述了组装镜像的步骤,其中每条指令都是单独执行的。除了 FROM 指令,其他每一条指令都会在上一条指令生成镜像的基础上指令,执行完后悔生成一个新的镜像层,新的镜像层覆盖在原来的镜像之上从而形成了新的镜像。Dockerfile 所生成的最终镜像就是在基础镜像上面叠加一层层的镜像层组建的。
  • 为了提高镜像构造的速度,Docker daemon 会缓存构建过程中的中间镜像。当从一个已在缓存中的基础镜像开始构建新镜像时,会将 Dockerfile 中的下一条指令和基础镜像的所有子镜像做比较。如果有一个子镜像是由相同的指令生成的,则命中缓存直接使用该镜像,而不需要再生成一个新的镜像。在寻找缓存的过程中,COPY 和 ADD 指令与其他指令稍有不同,其他指令只对比生成镜像的指令字符串是否相同;ADD 和 COPY 指令除了对比指令字符串,还要对比容器中的文件内容和 ADD、COPY 所添加的文件内容是否相同。此外,镜像构建过程中,一旦缓存失败,则后续的指令都将生成新的镜像,而不再使用缓存。
  • 格式:docker build -t <image>:[tag] <dockerfile_path>

Dockerfile 指令

MAINTAINER

FROM

  • 格式:FROM <image> 或 FROM <image>:<tag>
    • FROM 指令的功能是为后面的指令提供基础镜像。因此一个有效的 Dockerfile 必须以 FROM 指令作为第一条非注释指令。从公共镜像库中拉去镜像很容易,基础镜像可以选择任何有效的镜像。在一个 Dockerfile 中,FROM 指令可以出现多次,这样会构造多个镜像。在每个镜像创建完成后,Docker 命令行界面会输出该镜像的 ID。若 FROM 指令中参数 tag 为空,则 tag 默认是 latest;若参数 image 或者 tag 指令的镜像不存在,则返回错误。

ENV

  • 格式:ENV <key> <value> 或 ENV <key> = <value> ...
    • ENV 指令可以为镜像创建出来的容器生命环境变量。并且在 Dockerfile 中,ENV 指令声明的环境变量会被后面的指定指令(即 ENV、ADD、COPY、WORKIR、EXPOSE、VOLUME、USER)解释使用。其他指令使用环境变量时,使用格式为variable_name或者{variable_name}。在变量前面添加斜杠\可以转移,如\foo或者\\{foo},将会被分别转为foo 和\{foo},而不是环境变量所保存的值。另外,ONBUILD 指令不支持环境更换。

COPY

  • 格式:COPY <src> <dest>
    • COPY 指令复制<src>所指向的文件或目录,将它添加到新镜像中,复制的文件或目录在镜像中的路径是<dest>。<src>所指定的源可以有多个,但必须在上下文中,即必须是上下文根目录的相对路径。不能使用如 COPY ../someplace/something|someplace 这样的值。此外,<src>可以使用通配符指向所有匹配通配符的文件或目录。例如,COPY home* /mydir/表示复制所有以"hom"开头的文件到目录/mydir/。
    • <dest>可以是文件或目录,但必须是目标镜像中的绝对路径或者相对于 WORKIR 的相对路径(WORKIR 即 Dockerfile 中 WORKIR 指令指定的路径,用来为其他指令设置工作目录)。若<dest>以反斜杠/结尾则其指向的是目录;否则<src>所指向的文件或目录中的内容会被复制添加到<dest>目录中,当<src>指定多个源时,<dest>必须是目录。另外,如果<dest>不存在,则路径中不存在的目录被创建。

RUN

  • 格式:RUN <command> (shell 格式),RUN ["executable","param1","param2"] (exec 格式,推荐格式)
    • RUN 指令会在前一条命令创建出的镜像基础上创建一个容器,并在容器中运行命令,在命令结束运行之后提交容器为新镜像,新镜像被 Dockerfile 中的下一条指令使用。
    • RUN 指令的两种格式表示命令在容器中的两种运行方式。当使用 shell 格式时,命令通过/bin/sh -c 运行;当使用 exec 格式时,命令是直接运行的,容器不调用 shell 程序,即容器中没有 shell 程序。exec 格式中的参数会当成 JSON 格式被 Docker 解析,故必须使用双引号而不能使用单引号。因为 exec 格式不会再 shell 中执行,所以环境变量的参数不会被替换。例如:当执行 CMD["echo","HOME"]指令时,HIOME不会做变量替换。如果希望执行shell程序,指令可以写成CMD["sh","-c","echo","$HOME"]。

ADD

  • 格式:ADD <src> <dest>
    • ADD 与 COPY 指令在功能上很相似,都支持复制本地文件到镜像的功能,但 ADD 指令还支持其他功能。<src> 可以是一个指向网络文件的 URL,此时若<dest>指向一个目录,则 URL 必须是完全路径,这样可以获得网络文件的文件名 filename,该文件会被复制添加到<dest>/<filename>。例如:ADD http://example.com/foobar /创建文件/foobar。
    • <src>还可以指向一个本地压缩归档文件,该文件在复制到容器中时会被压缩提取,如:ADD example.tar.xz /。但若 URL 中的文件为归档文件则不会被解压提取。
    • ADD 和 COPY 指令虽然功能很相似。但一般推荐使用 COPY,因为 COPY 只支持本地文件,相比 ADD 而言,它更透明。

CMD

  • 格式:
    • CMD <command>(shell 格式)
    • CMD ["executsble","param1","param2"](exec 格式,推荐)
    • CMD ["param1","param2"](为 ENTRYPOINT 指令提供参数)
  • CMD 指令提供容器运行时的默认值,这些默认值可以是一条指令,也可以是一些参数。一个 Dockerfile 中可以是多条 CMD 指令,但只有最后一条 CMD 指令有效。CMD ["param1","param2"]格式时在 CMD 指令喝 ENTRYPOINT 指令配合使用的,CMD 指令中的参数会添加到 ENTRYPOINT 指令中。使用 shell 和 exec 格式时,命令在容器中的运行方式与 RUN 指令相同。不同在于,RUN 指令在构建镜像时执行命令,并生成新的镜像;CMD 指令在构建镜像时并不执行任何命令,而是在容器启动时默认将 CMD 指令作为第一条执行的命令。如果用户在命令行界面运行 docker run 命令时指定了命令参数,则会覆盖 CMD 指令中的命令。

ENTRYPOINT

  • 格式:
    • ENTRYPOINT <command>(shell 格式)
    • ENTRYPOINT ["executable","param1","param2"](exec 格式,推荐格式)
  • EXTRYPOINT 指令个 CMD 指令类似,都可以让容器在每次启动时执行相同的命令,但他们之间又有不同。一个 Dockerfile 中可以有多条 ENTRYPOINT 指令,但只有最后一条 ENTRYPOINT 指令有效。当使用 shell 格式,ENTRYPOINT 指令会忽略任何 CMD 指令和 docker run 命令的参数,并且会运行在 bin/sh -c 中。这以为着 ENTRYPOINT 指令进程为 bin/sh -c 的子进程,进程在容器中的 PID 将不是 1,且不能接受 Unix 信号。

ONBUILD

  • 格式:ONBUILD [INSTRUCTION]
  • ONBUILD 指令的功能是添加一个将来执行的触发器指令到镜像中。当该镜像作为 FROM 指令的参数时,这些触发器指令就会在 FROM 指令执行时加入到构建过程找那个。

EXPOSE

  • 格式:EXPOSE [<port>...]:expose 80 22 8080
  • 声明镜像内服务所监听的端口

USER

  • 格式:USER daemon。
  • 指定运行容器时的用户名或 UID,后续的 RUN 等质量也会使用指定的用户身份。
  • 当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以再之前创建所需要的用户。需要获取管理员权限可以使用 sudo
    • 例如:RUN groupadd -r postgres && useradd -r -g postgres postgres

WORKDIR

  • 格式:WORKIRD /path/to/workdir

  • 为后续的 RUN、CMD 和 ENTRYPOINT 指令配置工作目录。

  • 可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。如:

    WORKDIR /a
    WORKDIR b
    WORKDIR b
    # 最终路径为/a/b/c
    

Docker 容器监控维度

容器监控命令

docker ps

  • 通过使用 docker ps 命令,可以查看当前主机上的容器信息,包括 容器 ID、镜像名、容器启动执行命令、创建时间、状态、端口信息和容器名。该命令默认只列出当前正在运行的容器的信息,用户可以通过使用 -a 参数来列出包括已停止的所有容器的信息。

docker images

  • 通过使用 docker images 命令,可以查看当前主机上的镜像信息,包括镜像所属的库、标签、ID、 创建时间和实际大小。该命令默认只会列出所有顶层镜像的信息,但用户可以通过 -a 参数来查看所有中间层的镜像的信息。

docker stats

  • docker stats 是 docker 1.5 版本中最新提供的命令,专门用于容器状态信息的统一,同时它还有配套的 API(GET /containers/(id)/stats),可供开发人员调用。使用该命令,用户可以实时监控启动中的容器运行情况,包括 CPU、内存、块设备 I/O 和网络 I/O,这些信息都会定时刷新以显示最新的运行情况。

docker inspect

  • 可以通过使用 docker inspect 命令,可以查看镜像或容器的底层详细信息,来了解镜像或容器的完整构建信息,包括基础配置、主机配置、网络设置、状态信息等。同时,如果需要查看其特定信息,可以通过 -f 参数来设定输出格式

docker top

  • 可以通过使用 docker top 命令,可以查看正在运行的容器中的进程的运行情况。该命令可以使用户在没有通过 /bin/bash 终端与容器进行交互时,帮助用户查看容器内的进程信息,包括进程号、父进程号、命令等

docker port

  • docker port 命令用于查看容器与主机之间的端口映射关系信息。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342