Docker 手册
- 2021-06-15 15:44:00
- samoye 原创
- 45586
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-downloads 和 max-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
重启一个或多个serviceUsage: 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。
联系人: | 王春生 |
---|---|
Email: | chunsheng@cnezsoft.com |