# Docker 安装配置

# Docker 简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

Docker 应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker 的优点

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

  1. 快速,一致地交付您的应用程序
    Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
    容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
    您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
    他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
    当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
    测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
  2. 响应式部署和扩展
    Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
    Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
  3. 在同一硬件上运行更多工作负载
    Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

相关链接

Docker 官网 (opens new window) Github Docker 源码 (opens new window)

# Docker 架构

Docker 包括三个基本概念:

  1. 镜像(Image)
    Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  2. 容器(Container)
    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  3. 仓库(Repository)
    仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。

概念 说明
Docker镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub (opens new window) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

# Docker 安装

# 卸载旧版本

旧版本的 Docker 被称为docker或docker-engine。如果安装了旧版本,请卸载它和与它相关的依赖。

sudo yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engine
1
2
3
4
5
6
7
8

# 安装新版本

  1. 安装依赖包
sudo yum install yum-utils  device-mapper-persistent-data  lvm2
1
  1. 设置镜像的仓库
    设置阿里云的镜像,以便于加快访问速度
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1

提示

yum-config-manager命令是对资源库(/etc/yum.repos.d/下的文件)进行增删改查。 例如上例就是在/etc/yum.repos.d/目录下增加docker-ce.repo文件。
如果需要删除某个资源库则在/etc/yum.repos.d/下手动删除对应repo文件即可。

点击查看 yum-config-manager 帮助

功能描述
使用yum-config-manager命令可以进行YUM配置管理。

命令语法
yum-config-manager [选项] [部分]

选项含义

选项 含义
-e<错误级别> 错误输出级别
-d<调试级别> 调试输出级别
-c<配置文件> 指定配置文件的位置
-t 错误宽容
-q 安静模式
-v 详细操作
-y 对所有问题回答yes
--installroot=<路径> 设置安装根路径
--nogpgcheck 禁用GPG签名检查
--disableplugin=<插件> 按名称禁用插件
--color=<颜色> 控制使用颜色
--setopt=<设置选项> 设置任意配置和软件仓库选项
--noplugins 禁用yum插件
--enableplugin=<插件> 按名称启用插件
--enablerepo=<软件仓库> 启用一个或多个仓库
--rpmverbosity=<调试级别> 为rpm指定调试输出级别
--disablerepo=<软件仓库> 禁用一个或多个软件仓库
--disablepresto 禁用Presto插件,不下载任何deltarpm
-C 从系统缓存中完全运行,不更新缓存
-R<等待时间> 最大命令等待时间,单位是分钟
--showduplicates 在软件仓库,在列表/搜索命令中显示重复的
-x<软件包> 按名称或排除软件包
--obsoletes 在更新过程中启用废弃处理
--save 保存当前的选项
--enable 启用指定的软件仓库
--disable 禁用指定的软件仓库
--add-repo=<软件仓库> 从指定文件或URL添加(和启用)软件仓库

::: 3. 安装docker 分为 docker-ce社区版 和 docker-ee企业版,选择安装 docker-ce社区版

sudo yum install containerd.io docker-ce docker-ce-cli
# 如果不行可采取以下方式增加源后再执行上述安装命令:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1
2
3
  1. 启动docker
systemctl start docker.service
1
  1. 设置为自启动服务
systemctl enable docker.service
1

# 加速设置

如果/etc/docker/daemon.json文件存在,则更改,如没有则新创建一个。

vi  /etc/docker/daemon.json
# 添加内容:
{
    "registry-mirrors": ["https://registry.docker-cn.com","https://pee6w651.mirror.aliyuncs.com","http://hub-mirror.c.163.com"],
    "live-restore": true
}
# 重新加载
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
5
6
7
8
9

# 测试 Docker

  1. 查询状态
systemctl status docker
1
  1. 测试 此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条信息性消息并退出。
docker run hello-world
1

提示

新安装的 Docker 是没有该镜像的,它会自动从网上下载该镜像并运行。
具体执行步骤为:

  1. Docker客户端连接Docker守护程序。
  2. Docker守护进程从Docker Hub中提取“hello world”镜像。
  3. Docker守护进程运行该镜像的可执行文件。
  4. Docker守护进程将该输出流式传输到Docker客户端并显示。

# 卸载 Docker

/var/lib/docker是Docker默认的工作路径

# 1、卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io

# 2、删除资源
sudo rm -rf /var/lib/docker
1
2
3
4
5

# Docker 客户端

# 查看 Docker 命令选项

输入 docker 命令来查看到 Docker 客户端的所有命令选项。

docker
1

# 查看 Docker 版本

docker version
1

# 查看 Docker 信息

docker info
1

# 查看 Docker 命令帮助

通过命令 docker command --help 深入的了解指定的命令帮助。
例如通过命令 docker stats --help 查看stats命令的帮助

docker stats --help
1

# Docker 镜像使用

# 搜索镜像

Docker 默认搜索的是 Docker Hub 上的镜像。

  1. 命令格式
    docker search [OPTIONS]

OPTIONS 选项:

  • -f, --filter filter 过滤条件,根据提供的条件过滤输出
  • --format string 使用Go模板格式化字符串打印搜索
  • --limit int 限制int最大搜索结果数(默认值25)
  • --no-trunc trunc不截断输出

2.实例
列出java镜像收藏数不小于10的镜像。

docker search -f stars=10 java
1

搜索结果为: 搜索结果

搜索结果参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思
OFFICIAL: 是否 docker 官方发布
AUTOMATED: 自动构建。

# 下载镜像

  1. 命令格式:
    docker pull [OPTIONS] 镜像名[:TAG|@DIGEST]

OPTIONS 选项:

  • -a, --all-tags 下载存储库中所有标记的镜像
  • --disable-content-trust 忽略镜像的校验,默认开启
  • --platform string 如果服务器支持多平台,则设置平台字符串
  • -q, --quiet 抑制详细输出

2.实例
1)下载名称为 mysql 镜像的最新版本

docker pull mysql
1

提示

如果不标记TAG,则会下载最新版本。
等同于:
docker pull mysql:latest

2)下载名称为 mysql 镜像的 5.7 版本

docker pull mysql:5.7
1

# 查看本地镜像

  1. 命令格式:
    docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS 选项:

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  • --digests :显示镜像的摘要信息;
  • -f :显示满足条件的镜像;
  • --format :指定返回值的模板文件;
  • --no-trunc :显示完整的镜像信息;
  • -q :只显示镜像ID。
  1. 实例
    显示本地镜像
docker images
1

# 查看镜像元数据

  1. 命令格式:
    docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS 选项:

  • -f :指定返回值的模板文件。
  • -s :显示总的文件大小。
  • --type :为指定类型返回JSON。
  1. 实例
    查看本地hello-world镜像元数据
docker inspect hello-world
1

# 删除镜像

  1. 命令格式:
    docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS 选项:

  • -f :强制删除;
  • --no-prune :不移除该镜像的过程镜像,默认移除;
  1. 实例
    删除本地hello-world镜像
docker rmi hello-world
1

提示

删除失败的处理,大部分情况是依赖问题,例如上列删除 hello-world 失败,报错信息为:
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container eecfe9da21fa is using its referenced image d1165f221234
因此首先删除标记为 eecfe9da21fa 的容器,然后再删除 hello-world。

docker rm eecfe9da21fa      # 注意命令是 rm
docker rmi hello-world      # 注意命令是 rmi
1
2

# Docker 创建镜像

# Dockerfile 指令

Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行的命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。

指令 说明
FROM 指定所创建镜像的基础镜像
MAINTAINER 指定维护者信息
RUN 运行命令
CMD 指定启动容器时默认执行的命令
LABEL 指定生成镜像的元数据标签信息
EXPOSE 声明镜像内服务所监听的端口
ENV 指定环境变量
ADD 赋值指定的<src>路径下的内容到容器中的<dest>路径下,<src>可以为URL;如果为tar文件,会自动解压到<dest>路径下
COPY 赋值本地主机的<scr>路径下的内容到容器中的<dest>路径下;一般情况下推荐使用COPY而不是ADD
ENTRYPOINT 指定镜像的默认入口
VOLUME 创建数据挂载点
USER 指定运行容器时的用户名或UID
WORKDIR 配置工作目录
ARG 指定镜像内使用的参数(例如版本号信息等)
ONBUILD 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令
STOPSIGNAL 容器退出的信号
HEALTHCHECK 如何进行健康检查
SHELL 指定使用SHELL时的默认SHELL类型

# From 指令

FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
1
2
3
  • FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。
  • FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
  • FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。
  • 如果FROM语句没有指定镜像标签,则默认使用latest标签。

# MAINTAINER 指令

指定创建镜像的用户。

MAINTAINER <name>
1

# Run 指令

在创建镜像的时候需要执行的命令。

# 由shell启动,Linux默认为`/bin/sh -c`,Windows默认为`cmd /S /C`
RUN <command>
# 运行可执行文件
RUN ["executable", "param1", "param2"]
1
2
3
4

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的版本控制。
exec 方式会被解析为一个 JSON 数组,所以必须使用双引号而不是单引号。exec 方式不会调用一个命令 shell,所以也就不会继承相应的变量。

提示

尽量少执行RUN,因为每执行一条RUN就会新建一层,因此可以将必须执行的RUN尽量合并为一个。

# CMD 指令

镜像创建后,运行容器需要执行的命令。

CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
1
2
3

CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。
CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。

# LABEL 指令

给镜像添加信息。使用docker inspect可查看镜像的相关信息。

LABEL "com.example.vendor"="ACME Incorporated"
1

# EXPOSE 指令

指定于外界交互的端口,在容器启动时用-p传递参数,例如-p 3307:3306将容器内的3306绑定到本机的3307

EXPOSE <port> [<port>...]
1

告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用-p或者-P选项生效。

# ENV 指令

设置环境变量

ENV <key> <value>       # 只能设置一个变量
ENV <key>=<value> ...   # 允许一次设置多个变量
1
2

指定一个环节变量,会被后续RUN指令使用,并在容器运行时保留。

# ADD 指令

将本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压。

ADD <src>... <dest>
1

ADD复制本地主机文件、目录或者远程文件 URLS 到容器指定路径中 。
支持通过 Go 的正则模糊匹配,具体规则可参见 Go filepath.Match (opens new window)

ADD hom* /mydir/        # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/    # ? 替代一个单字符,例如:"home.txt"

ADD test relativeDir/          # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/         # 添加 "test" 到 /absoluteDir/
1
2
3
4
5

路径必须是绝对路径,如果不存在,会自动创建对应目录
路径必须是 Dockerfile 所在路径的相对路径
如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制

# COPY 指令

COPY复制新文件或者目录到容器指定路径中。用法同ADD,唯一的不同是不能指定远程文件 URLS。

COPY <src>... <dest>
1

# ENTRYPOINT 指令

ENTRYPOINT  "executable", "param1", "param2"
ENTRYPOINT command param1 param2 (shell form)
1
2

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,而CMD是可以被覆盖的。如果需要覆盖,则可以使用docker run --entrypoint选项。
每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。

# VOLUME 指令

VOLUME ["/data"]
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
1
2
3

用于指定持久化目录,在容器启动时用-v传递参数,例如-v ~/opt/data/mysql:/var/lib/mysql将本机的~/opt/data/mysql和容器内的/var/lib/mysql做持久化关联
容器启动时会加载,容器关闭后会回写。

# USER 指令

USER daemon
1

指定运行容器时的用户名或 UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户。

# WORKDIR 指令

WORKDIR /path/to/workdir
1

为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

WORKDIR /a  (这时工作目录为/a)
WORKDIR b  (这时工作目录为/a/b)
WORKDIR c  (这时工作目录为/a/b/c)
1
2
3

# ARG 指令

ARG <name>[=<default value>]
1

由外部启动时必须传入的参数,在容器启动时用--build-arg传递参数
指定于外界交互的端口,在容器启动时用-p传递参数,例如--build-arg CONT_IMG_VER=v2.0.1

# ONBUILD 指令

ONBUILD [INSTRUCTION]
1

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
如果基于 image-A 创建新的镜像时,新的 Dockerfile 中使用 FROM image-A 指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。

# HEALTHCHECK 指令

容器健康状况检查命令。

HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
1
2

第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令

[OPTIONS]的选项支持以下三种选项:

  • --interval=DURATION 两次检查默认的时间间隔为30秒
  • --timeout=DURATION 健康检查命令运行超时时长,默认30秒
  • --retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3 注意:
    HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。

# 实例1: java镜像 Dockerfile

  1. 第一步:准备软件安装包
    准备java安装包文件: server-jre-8u291-linux-x64.tar.gz
    将java安装包文件放到本地 /data/soft目录下。

  2. 第二步:编写 Dockerfile 文件
    vi ./Dockerfile

FROM centos
MAINTAINER xiongsy<xiongsy@cqupt.edu.cn>

COPY ./jdk1.8.0_291/* /data/java2/

ENV JAVA_HOME /data/java2
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
1
2
3
4
5
6
7
8
9

# 实例2: SpringBoot微服务镜像 Dockerfile

  1. 第一步:准备软件安装包

  2. 第二步:编写 Dockerfile 文件 vi ./Dockerfile

FROM java:8
EXPOSE 8080

VOLUME /tmp
ADD ./app.jar  /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
1
2
3
4
5
6
7

# Docker 创建镜像

  1. 命令格式:
    docker build [OPTIONS] PATH | URL | -

OPTIONS 选项:

  • --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指令的网络模式
  1. 实例
    使用当前目录的 Dockerfile 创建镜像,标签为 cqupt/java2:v1
docker build -t cqupt/java2:v1 .
1

提示

注意最有有个点.

使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。

docker build github.com/creack/docker-firefox
1

也可以通过 -f Dockerfile 文件的位置:

$ docker build -f /path/to/a/Dockerfile .
1

提示

注意最有有个点.

# Docker 运行镜像

  1. 命令格式:
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS 选项:
  • -d, --detach=false, 指定容器运行于前台还是后台,默认为false
  • -i, --interactive=false, 打开STDIN,用于控制台交互
  • -t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
  • -u, --user="", 指定容器的用户
  • -a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
  • -w, --workdir="", 指定容器的工作目录
  • -c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
  • -e, --env=[], 指定环境变量,容器中可以使用该环境变量
  • -m, --memory="", 指定容器的内存上限
  • -P, --publish-all=false, 指定容器暴露的端口
  • -p, --publish=[], 指定容器暴露的端口
  • -h, --hostname="", 指定容器的主机名
  • -v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
  • --volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
  • --cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
  • --cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
  • --cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
  • --cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
  • --device=[], 添加主机设备给容器,相当于设备直通
  • --dns=[], 指定容器的dns服务器
  • --dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
  • --entrypoint="", 覆盖image的入口点
  • --env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
  • --expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
  • --link=[], 指定容器间的关联,使用其他容器的IP、env等信息
  • --lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
  • --name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
  • --net="bridge", 容器网络设置:
  • bridge 使用docker daemon指定的网桥
  • host //容器使用主机的网络
  • container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
  • none 容器使用自己的网络(类似--net=bridge),但是不进行配置
  • --privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities
  • --restart="no", 指定容器停止后的重启策略:
  • no:容器退出时不重启
  • on-failure:容器故障退出(返回值非零)时重启
  • always:容器退出时总是重启
  • --rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
  • --sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

# Docker 停止运行镜像

docker stop cmysql
1

# 技巧

# 拷贝文件到 Docker 镜像中

  1. 启动镜像
    例如本例启动名称文centos的镜像
docker run -it centos /bin/bash
1
  1. 然后ctrl+d退出

  2. 查看容器的ID

[root@localhost xx]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMES
e8516017d99c   centos    "bash"    13 minutes ago   Exited (0) 8 minutes ago             sei
1
2
3
  1. 拷贝文件 例如拷贝apr-1.7.0.tar.gz到容器的/data/soft目录下
docker cp ./apr-1.7.0.tar.gz e8516017d99c:/data/soft
1
  1. 查看容器的状态 例如上列的 STATUS 为 Exited (0) 表示已经退出,需要重新启动。
docker start e8516017d99c
1
  1. 登录容器
docker exec -it e8516017d99c /bin/bash
1
  1. 查看拷贝的文件是否存在

# 以交互方式构建 Docker 镜像

  1. 以交互方式运行centos
docker run --user 0 -it --name sei centos:latest bash
1
  1. 拷贝所有文件到镜像中
docker cp ./soft/* e8516017d99c:/data/soft/
1
  1. 编译安装软件

  2. 提交

docker commit sei cqupt/centos:v1
1
  1. 将新的 image 保存成 tar 压缩文件,给其他人使用,统一开发环境
docker save cqupt/centos:v1 -o cqupt_centos.tar
1
  1. 别人拿到 test_cpu.tar 文件后使用 docker load 加载 image
docker load -i cqupt_centos.tar
1
  1. 查看导入的 image
docker images
1

# 运行 mysql

  1. 准备 mysql 配置文件和数据库数据存放目录 本例将 mysql 的配置文件 my.cnf 放到 /data/mysq/conf 目录。
    数据库数据文件存放到 /data/mysql/data 目录

  2. 执行运行命令

docker run -d -p 3306:3306  -e MYSQL_ROOT_PASSWORD=123456 --name mysql -v /data/mysq/conf/my.cnf:/data/mysq/conf/my.cnf -v /data/mysql/data:/data/mysql/data cqupt/centos:v1
1

# 实例: 创建自定义nginx镜像

  1. 第一步:下载基础镜像
docker pull registry.openanolis.cn/openanolis/anolisos:8.8
1
  1. 第二步:交互方式登录镜像(暂命名为终端1),注意:此时终端退出后,所有的更改都会丢失
docker run -it registry.openanolis.cn/openanolis/anolisos:8.8 /bin/bash
# 进入终端后对系统进行更新
yum -y upgrade
yum clean all
1
2
3
4
  1. 第三步:新开一个终端(暂命名为终端2)查看镜像的id(例如:e8516017d99c)
docker ps 
tar xvf ./server-jre-8u381-linux-x64.tar.gz  #解压当前目录下的java包
docker cp ./jdk1.8.0_381 e8516017d99c:/data/java2  #将解压后的java拷贝到镜像的/opt/java8目录
1
2
3
  1. 第四步:回到第二步的终端1中执行设置环境
echo "export JAVA_HOME=/data/java2" >> /etc/profile
echo "export JRE_HOME=/data/java2/jre" >> /etc/profile
echo "export CLASSPATH=\$CLASSPATH:\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib" >> /etc/profile
echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile #注意检查是否正确了

source /etc/profile
1
2
3
4
5
6
  1. 第五步:切换到第三步的终端2上拷贝当前目录下的安装文件到镜像中的/data/soft目录下
docker cp ./ e8516017d99c:/data/soft
1
  1. 第六步:切换到第二步的终端1上并编译安装
  2. 第七步:再切换回第三步的终端2上将安装后的环境提交并另存为一个新的镜像
docker commit e8516017d99c xiongsy/nginx

docker save xiongsy/nginx -o /data/docker_xiongsy_nginx.tar
1
2
3