Docker 手册

摘要: Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。


1、简介


1.1 什么是Docker

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

1.2 Docker的应用场景

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

1.3 友情链接


2、安装


2.1 安装环境

Debian-10.7-amd64

2.2 安装依赖

apt update && apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common

2.3 安装GPG证书

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add

2.4 添加软件源

这里添加的源为 北京外国语大学开源软件镜像站
add-apt-repository "deb [arch=amd64] https://mirrors.bfsu.edu.cn/docker- ce/linux/debian $(lsb_release -cs) stable"

2.5 更新并安装

apt update && apt -y install docker-ce


3、基础配置


Docker有两处可以配置参数:一个是 docker.service 服务配置文件,一个是Docker daemon配置文件  daemon.json 。建议所有修改都在 daemon.json 中进行。若没有 daemon.json ,自行创建 /etc/docker/daemon.json,官方 daemon.json配置说明。这里对一些常用的配置进行说明。

3.1 镜像下载和上传并发数

Docker1.12 开始,支持自定义下载和上传镜像的并发数,默认值上传为5个并发,下载为3个并发。通过添加 max-concurrent-downloadsmax-concurrent-uploads 参数对其修改:
{
 "max-concurrent-downloads": 3,
 "max-concurrent-uploads": 5 
}

3.2 镜像加速地址

国内直接拉取镜像会有些缓慢,为了加速镜像的下载,可以给Docker配置国内的镜像地址。
{
 "registry-mirrors": ["https://ucjisdvf.mirror.aliyuncs.com"] 
}

3.3 私有仓库

Docker默认只信任 TLS 加密的仓库地址,所有非 https 仓库默认无法登陆也无法拉取镜像。


insecure-registries 字面意思为不安全的仓库,通过添加这个参数对非 https 仓库进行授信。可以设置多个 insecure-registries 地址,以数组形式书写,地址不能添加协议头 http

{
 "insecure-registries": ["<IP>:<PORT>","<IP>:<PORT>"] 
}

3.4 Docker存储驱动

OverlayFS 是一个新一代的联合文件系统,类似于 AUFS ,但速度更快,实现更简单。Docker为 OverlayFS 提供了两个存储驱动程序:旧版的overlay,新版的 overlay2 (更稳定)。


启用 overlay2 条件:Linux内核版本4.0或更高版本。

{ "storage-driver": "overlay2", "storage-opts": ["overlay2.override_kernel_check=true"] }

3.5 日志驱动

容器在运行时会产生大量日志文件,很容易占满磁盘空间。通过配置日志驱动来限制文件大小与文件的数量。


日志等级分为 debug|info|warn|error|fatal ,默认为 info

{
 "log-level": "warn",
 "log-driver": "json-file", 
"log-opts": { 
   "max-size": "100m", 
   "max-file": "3"
  }, 
}

3.6 数据存储路径

默认路径为 /var/lib/docker
{ 
"data-root": "/home/docker" 
}

3.7 Demo

这里提供一个经常使用的配置模板
{
 "insecure-registries": ["192.168.2.2:8080"],
 "oom-score-adjust": -1000,
 "exec-opts": ["native.cgroupdriver=systemd"],
 "registry-mirrors": ["https://ucjisdvf.mirror.aliyuncs.com"],
 "storage-driver": "overlay2",
 "storage-opts": ["overlay2.override_kernel_check=true"], 
"log-level": "warn", 
"log-driver": "json-file", 
"log-opts": { 
     "max-size": "100m", 
     "max-file": "3" 
},
"data-root": "/home/docker" 
}


4、Docker命令

Docker命令的详细使用方法请参考 官网或者 docker --help 进行查询,这里只记录部分常用命令。


Commands

pull

从镜像仓库中拉取或者更新指定镜像,在未声明镜像标签时,默认标签为latest。

Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST] 
Options: 
    -a 拉取某个镜像的所有版本
    --disable-content-trust 跳过校验,默认开启

run

创建并启动一个容器

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options:
  -d, --detach 后台运行容器,并输出容器ID
  -e, --env list 设置环境变量,该变量可以在容器内使用
  -h, --hostname string 指定容器的hostname
  -i, --interactive 以交互模式运行容器,通常与-t同时使用
  -l, --label list 给容器添加标签
  --name string 设置容器名称,否则会自动命名
  --network string 将容器加入指定网络
  -p, --publish list 设置容器映射端口
  -P,--publish-all 将容器设置的所有exposed端口进行随机映射
  --restart string 容器重启策略,默认为不重启
    on-failure[:max-retries]:在容器非正常退出时重启,可以设置重启次数。
    unless-stopped:总是重启,除非使用stop停止容器
    always:总是重启
  --rm 容器退出时则自动删除容器
  -t, --tty 分配一个伪终端
  -u, --user string 运行用户或者UID
  -v, --volume list 数据挂载
  -w, --workdir string 容器的工作目录
  --privileged 给容器特权

build

通过 Dockerfile 构建镜像

Usage: docker build [OPTIONS] PATH | URL | -
Options:
    -f, --file string 指定Dockerfile,默认为当前路径的Dockerfile
    -q, --quiet 安静模式,构建成功后输出镜像ID
    -t, --tag list 给镜像设置tag,name:tag

commit

通过容器创建一个新镜像
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options:
    -a, --author string 作者
    -m, --message string 提交信息

cp

在容器和宿主机之间拷贝文件

Usage:
    docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
    -a, --archive 保留文件权限

exec

向正在运行的容器下发命令

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Options:
    -d, --detach 在后台运行命令
    -e, --env list 设置环境变量
    -i, --interactive 以交互模式运行
    -t, --tty 分配一个伪终端
    -u, --user string 执行命令的用户
    -w, --workdir string 工作目录

export

将容器导出为一个tar包

Usage: docker export [OPTIONS] CONTAINER
Options:
    -o, --output string tar包名称

images

列出镜像

Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
Options:
  -a, --all 显示所有镜像
  -f, --filter filter 使用过滤器过滤镜像
    dangling true or false, true列出没有标签的,false相反
    label (label=<key> or label=<key>=<value>),如果镜像设置有label,则可以通过label过 滤
    before (<image-name>[:<tag>], <image id> or <image@digest>) - 某个镜像前的镜像
    since (<image-name>[:<tag>], <image id> or <image@digest>) - 某个镜像后的镜像
    reference (pattern of an image reference) - 模糊查询,例:-- 
    filter=reference='busy*:*libc' 
  --format string 格式化输出
    .ID 镜像ID
    .Repository 镜像仓库
    .Tag 镜像tag
    .Digest Image digest
    .CreatedSince 创建了多久
    .CreatedAt 镜像创建时间
    .Size 镜像大小
-q, --quiet 只显示镜像ID

import

通过导入tar包的方式创建镜像

Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
Options:
   -m, --message string 设置提交信息

kill

杀死一个或多个容器

Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...]

load

从tar包加载一个镜像

Usage: docker load [OPTIONS]
Options:
   -i, --input string 指定tar包
   -q, --quiet 只显示ID

login

登录Docker镜像仓库

Usage: docker login [OPTIONS] [SERVER]
Options:
  -p, --password string 密码
  -u, --username string 账户

logout

退出Docker镜像仓库

Usage: docker logout [SERVER]

logs

显示容器日志

Usage: docker logs [OPTIONS] CONTAINER
Options:
  --details 显示详细日志
  -f, --follow 跟随日志输出
  --tail string 显示行数
  -t, --timestamps 显示时间戳

ps

列出容器  

Usage: docker ps [OPTIONS]
Options:
  -a, --all 列出所有容器
  -f, --filter filter 使用过滤器过滤
  --format string 格式化输出
  -n, --last int 显示最后创建的n个容器
  -l, --latest 显示最后一个创建的容器
  -q, --quiet 只显示容器ID
  -s, --size 显示大小

push

将容器推送到镜像仓库

Usage: docker push [OPTIONS] NAME[:TAG]

rename

给容器重命名

Usage: docker rename CONTAINER NEW_NAME

restart

重启一个或多个容器

Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...]

rm

删除一个或多个容器

Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
Options:
  -f, --force 强制删除
  -v, --volumes 同时删除数据卷

rmi

删除一个或多个镜像
Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
Options:
  -f, --force 强制删除

save

将一个或多个镜像保存为tar包

Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Options:
  -o, --output string tar包名称

search

查找镜像

Usage: docker search [OPTIONS] TERM

start

启动一个或多个容器

Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]

stats

显示容器资源使用情况

Usage: docker stats [OPTIONS] [CONTAINER...]
Options:
  -a, --all 显示所有容器,默认只显示正在运行的容器

stop

停止一个或多个容器

Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]

tag

给镜像设置新的tag

Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

inspect

获取容器或镜像的元数据

Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]


5、Dockerfile


Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。


ARG

设置参数,该参数值可以从 --build-arg <varname>=<value> 接收值


在FROM之前的ARG参数只在FROM语句中生效,若在FROM之后想要继续使用ARG,需要再次设置

Usage:
  ARG <name>[=<default value>]
例:ARG version="1.0.0"

FROM

指定基础镜像,FROM必须为Dockerfile非注释行的第一行。

Usage:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
例:FROM ubuntu:14.04

LABEL

设置镜像标签

Usage:
  LABEL <key>=<value> <key>=<value> <key>=<value> ...
例:LABEL maintainer="demo@demo.com"

ENV

设置环境变量

  • 建议:不论用哪种书写方式,在实际使用中,一行都只写一个环境变量,方便阅读。
  • 特别地:在使用docker run命令添加参数 --env 时,若有相同的环境变量,以run命令为准。
Usage:
  ENV <key> <value>
  ENV <key>=<value> ...
ENV <key> <value>此方法一次只能设置一个
ENV <key>=<value> ... 该方法一次可以设置多个环境变量
例:ENV JAVA_HOME=/home/jdk-8

ADD

添加文件,将宿主机的文件添加到容器中。
Usage:
  ADD [--chown=<user>:<group>] <src>... <dest>
  ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
例:ADD ${WORKSPACE}/target /usr/local/tomcat/webapps/ROOT

COPY

添加文件,将宿主机的文件添加到容器中。

Usage:
  COPY [--chown=<user>:<group>] <src>... <dest>
  COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

USER

指定运行容器的用户

Usage:
  USER <user>[:<group>]
  USER <UID>[:<GID>]
例:USER root

WORKDIR

工作目录,进入容器后,以 WORKDIR 为当前路径

Usage:
  WORKDIR /workdir
例:WORKDIR /home

EXPOSE

说明容器暴露的端口,默认协议为 tcp ,若是 udp 协议,则需要在后面添加 udp ,如 80/udp

Usage:
  EXPOSE <port> [<port>/<protocol>...]
例:EXPOSE 8080,表明容器在运行时提供8080端口,在启动该容器时需端口映射。

VOLUME

设置挂载点,将容器内的路径挂载到宿主机,该挂载方式是将容器内的路径挂载到docker数据路径下

Usage: 
  VOLUME <url>
例:VOLUME /var/log

RUN

执行命令并创建新的镜像层,通常用于更新或安装软件。
Usage:
  RUN <command>
  RUN ["executable", "param1", "param2"]
例:RUN yum -y install git

CMD

设置容器启动后默认执行的命令,CMD命令会被docker run的参数覆盖。

Usage:
  CMD <command>
  CMD ["executable","param1","param2"]
例:CMD systemclt start docker.service //启动容器时启动docker服务

ENTRYPOINT

和CMD一样,设置容器启动后默认执行的命令,但是该命令不会被docker run覆盖,会始终执行,CMD会被docker run传入的命令覆盖。

Usage:
  ENTRYPOINT <command>
  ENTRYPOINT ["executable", "param1", "param2"]
例:ENTRYPOINT /usr/local/apache-tomcat-8.5.33/bin/startup.sh

Demo

FROM tomcat:9.0
LABEL maintainer="demo@demo.com"
ADD ${WORKSPACE}/target/cip-file-1.0.0-SNAPSHOT /opt/apache-tomcat- 9.0.12/webapps/file
ENV LC_ALL en_US.UTF-8 EXPOSE 8080
ENTRYPOINT /opt/apache-tomcat-9.0.12/bin/startup.sh && tail -f /opt/apache- tomcat-9.0.12/logs/catalina.out


6、docker-compose


docker-compose 是docker的原生编排技术,你可以定义一个或多个应用在 docker-compose.yaml 里面,然后使用 docker-compose 命令行来启动你的应用。

6.1 安装

使用以下命令安装指定版本的 docker-compose ,若下载太慢,可通过浏览器手动下载指定版本后添加到系统环境变量中。


GitHub地址: docker-compose

sudo curl -L"https://github.com/docker/compose/releases/download/1.26.2/docker- compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

6.2 Commands

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help
Options:
  -f, --file FILE 指定docker-compose.yaml,默认为当前路径下docker-compose.yaml
  -p, --project-name NAME 指定项目名称

config

验证 docker-compose.yaml 文件编写是否正确

Usage: config [options]
Options:
  -q, --quiet 安静模式,不输出任何信息,除非文件错误
  --services 显示服务名称
  --volumes 显示挂载卷名称
特别地:这个命令不能指定yaml文件,默认为docker-compose.yaml或docker-compose.yml

down

停止容器并且删除容器,网络,数据卷,镜像

Usage: down [options]
Options:
  --rmi type 删除镜像
    all:删除service用到的所有镜像
    local:只删除没有自定义标签的镜像
  -v, --volumes 删除volumes定义的数据卷
  --remove-orphans 删除未定义在docker-compose.yaml里面的容器

pull

拉取 docker-compose.yaml 里面定义的镜像

Usage: pull [options] [SERVICE...]
Options:
  --ignore-pull-failures 当有失败时,继续执行其它镜像拉取
  --parallel 开启并行拉取
  --no-parallel 禁止并行拉取
  -q, --quiet 安静模式
  --include-deps 拉取依赖项

restart

重启一个或多个service
Usage: restart [options] [SERVICE...]

start

启动service

Usage: start [SERVICE...]

stop

停止service

Usage: stop [options] [SERVICE...]

up

构建,创建,启动某个service的容器

Usage: up [options] [--scale SERVICE=NUM...] [SERVICE...]
Options:
  -d, --detach 后台运行
  --quiet-pull 安静模式 --force-recreate 重新创建容器,即使镜像没有任何改动
  --no-recreate 当容器存在时不重新创建
  --no-build 不要构建镜像,即使镜像不存在
  --no-start 创建之后不要启动service.
  --build 在启动容器前创建镜像
  --abort-on-container-exit 当有一个容器停止时,停止其他容器
  --remove-orphans 删除未定义在compose file中的容器
  --scale SERVICE=NUM 设置服务运行的容器个数


7、FAQ


WARNING: No swap limit support

  • 原因cgroups 中的swap account未开启
  • 解决

编辑文件 /etc/default/grub ,找到 GRUB_CMDLINE_LINUX 修改为以下内容

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

修改完之后执行

sudo update-grub && sudo reboot

Permission denied (socket: /run/docker.sock)

  • 原因:没有把当前用户加入到docker组
  • 解决

1、将当前用户加到docker组

gpasswd -a {user} docker

2、更新用户组

newgrp docker

3、修改权限

chmod 666 /var/run/docker.sock
chown root:docker /var/run/docker.sock

Docker容器网络不通

  • 原因:docker网桥故障
  • 解决

在修改配置并重启 docker 后若网络还不通,可能是 docker network 的故障,需要自定义网桥

# 停止docker
systemctl stop docker.service
# 添加网桥
brctl addbr br0
# 添加IP网段
ip addr add 172.16.0.1/24 dev br0
# 启用网桥br0
ip link set dev br0 up

修改 docker 默认网桥,在配置文件 /etc/docker/daemon.json 中新增以下配置

"bridge":"br0"

重启 docker

systemctl start docker.service

WARNING: IPv4 forwarding is disabled. Networking will not work.

  • 原因:未开启转发
  • 解决:开启转发
# 编辑文件/etc/sysctl.conf
vim /etc/sysctl.conf
# 新增配置
net.ipv4.ip_forward=1
# 重启网络和docker
systemctl restart network
systemctl restart docker


致谢:感谢本文投稿作者 samoye。

评论列表
sss 2021-10-19 09:29:15
这好啊这
1/ 1