启动 | 停止 docker 服务
#启动docker服务:
systemctl start docker
service docker start
#停止docker服务:
systemctl stop docker
service docker stop
#重启docker服务:
systemctl restart docker
service docker restart
#查看docker服务状态:
systemctl status docker
service docker status
#设置开机启动docker服务:
systemctl enable docker
# 彻底卸载dokcer
yum list installed | awk '/docker/{print $1}' | xargs -r yum -y remove
rpm -qa | grep docker | xargs -r yum -y remove
镜像
镜像操作命令
查看本地镜像
docker images # 查看本地docker镜像
# REPOSITORY TAG IMAGE ID CREATED SIZE
# 镜像的仓库源 镜像的标签 镜像ID 镜像创建时间 镜像大小
# 同一个仓库源可以有多个TAG,表示这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果不指定一个镜像的版本标签,例如只使用tomcat,docker将默认使用tomcat:latest镜像
docker images -a # 列出本地所有的镜像
docker images -p # 只显示镜像ID
docker images --digests # 显示镜像的摘要信息
docker images --no-trunc # 显示完整的镜像信息
搜索和获取镜像
docker search 镜像名称 # 从Docker Hub上查找某个镜像
docker search -s 30 镜像名称 # 从Docker Hub上查找关注度大于30的某个镜像
docker pull 镜像名称:标签 # 从Docker Hub参考下载某个镜像。等价于:docker pull 镜像名:latest
docker push 镜像名称:标签 # 推送一个镜像到Docker Hub仓库
创建镜像
docker commit [OPTIONS] 容器名称或ID [镜像名称[:TAG]]
# [OPTIONS]:
-a, --author # string 作者信息
-c, --change # list 使用Dockerfile创建
-m, --message # string 提交信息
-p, --pause # 提交时暂停容器运行
# 基于容器创建一个新的镜像
docker commit -m "提交的描述信息" -a "作者" 容器名称或ID [镜像名称[:标签]]
# 示例:docker commit -m "新的tomcat" -a "lizq" f9e29e8455a5 mytomcat:1.2
docker build [OPTIONS] . # 通过 Dockerfile 创建镜像
# [OPTIONS]主要参数如下:
-f # 指定Dockerfile路径,默认为当前目录
-t # 指定生成镜像的标签信息
--rm # 设置镜像成功后删除中间容器
--no-cache # 创建镜像的过程不使用缓存
# 示例:通过当前目录下的 Dockerfile 创建一个名为soar/centos:7.1的镜像。最后的.表示当前目录
docker build -t soar/centos:7.1 .
删除镜像
docker rmi 镜像名称:标签(镜像ID或部分ID) # 删除某个镜像
docker rmi -f 镜像ID或镜像名称 # 强制删除某个镜像
docker rmi -f $(docker images -p) # 通过 docker images -p 查询到的镜像ID来删除所有镜像
docker rmi -f 镜像ID或镜像名称1 镜像ID或镜像名称2 # 强制删除镜像1和镜像2
其他命令
docker tag 镜像id 仓库:标签 # 为镜像创建一个新的标签
# 将一个或多个镜像保存成tar镜像库存储文件文件
docker save 镜像名称:标签(镜像ID或部分ID) > 文件名.tar
docker save -o 文件名.tar 镜像名称:标签(镜像ID或部分ID)
docker save --output 文件名.tar 镜像名称:标签(镜像ID或部分ID)
# 从tar镜像库存储文件文件加载成镜像(不能对载入的镜像重命名)
docker load < 文件名.tar
docker load -i 文件名.tar
docker load --input 文件名.tar
# 将一个或多个容器导出为tar容器快照文件
docker export 容器名或容器ID > 文件名.tar
docker export -o 文件名.tar 容器名或容器ID
docker export --output 文件名.tar 容器名或容器ID
# 从tar容器快照文件加载成镜像(可以为镜像指定新名称)
docker import 文件名.tar 镜像名称:标签
Dockerfile
指令说明
指令 | 说明 |
---|---|
FROM | 指定所创建镜像的基础镜像 |
MAINTAINER | 维护者信息 |
RUN | 运行命令 |
CMD | 启动容器时默认执行命令 |
LABEL | 标签信息 |
EXPOSE | 声明镜像内服务所监听的端口 |
ENV | 环境变量 |
ADD | 复制宿主机指定路径<src> 下的内容到容器中的<dest> 路径下,<src> 可以为URL,也可以是文件路径,如果为 tar 文件,会自动解压 |
COPY | 复制宿主机指定路径<src> 下的内容到容器中的<dest> 路径下 |
USER | 运行容器时的用户名 |
WORKDIR | 配置工作目录 |
ARG | 指定镜像内使用的参数 |
容器操作命令
查看容器
docker ps # 列出当前所有正在运行的容器
docker ps -a # 列出所有的容器
docker ps -l # 列出最近创建的容器
docker ps -n 3 # 列出最近创建的3个容器
docker ps -q # 只显示容器ID
docker ps --no-trunc # 显示当前所有正在运行的容器完整信息
删除容器
docker rm 容器ID或名称 # 删除容器
docker rm -f 容器ID或名称 # 强制删除容器
docker rm -f $(docker ps -a -q) # 删除多个容器
创建、启动容器
docker create 参数 镜像名称:标签 # 创建一个新的容器但不启动它
# 常用的参数如下:
--name # 为容器指定一个名称,启动多个时容器别名不能重复
-d # 后台运行容器,并返回容器ID,也即启动守护式容器,默认为false
-i # 以交互模式运行容器,默认为false,通常与-t同时使用
-t # 为容器重新分配一个伪输入终端,默认为false,通常与-i同时使用
-P # 随机端口映射
-p # 指定端口映射,有以下四种格式:
# ip:hostPort:containerPort
# ip::containerPort
# hostPort:containerPort
# containerPort
# 示例:docker create -it ubuntu
docker start 容器ID或名称 # 启动容器
docker restart 容器ID或名称 # 重新启动容器
docker update --restart=always 容器id # 更新容器运行参数(总是自动重启)
docker run [OPTIONS] IMAGE # 根据镜像新建并启动容器。IMAGE是镜像ID或镜像名称
# 等价于先执行 docker create 命令,再执行 docker start 命令,并且如果没有这个镜像,会先下载镜像
# OPTIONS常用参数同docker create
进入和退出容器
docker exec 参数 容器ID或名称 执行命令 # 启动一个伪终端以交互式的方式进入某个容器(使用exit退出后容器不停止运行)
# 主要参数:
# -i 打开标准输入接受用户输入命令
# -t 分配伪终端
# 示例:进入到容器中,并启动一个bash
docker exec -it 容器ID或名称 bash
docker exec -it 容器ID或名称 /bin/bash
docker attach 容器ID # 进入某个容器(使用exit退出后容器也跟着停止运行)
exit # 退出并停止容器
Ctrl+p+q # 只退出容器,不停止容器
终止容器
docker stop 容器ID或名称 # 停止容器
docker kill 容器ID或名称 # 强制停止容器
其他命令
docker rename 容器ID或名称 # 重命名一个容器
docker pause 容器ID或名称 # 暂停一个或多个容器的所有进程
docker unpause 容器ID或名称 # 恢复一个或多个容器内所有被暂停的进程
docker inspect 容器ID或名称 # 查看容器信息
docker stats 容器ID或名称 # 显示一个容器的实时资源占用
docker top 容器ID或名称 # 查看容器内运行的进程
docker logs -f -t --since --tail 容器ID或名称 # 查看容器日志
# 示例::docker logs -f -t --since=”2018-09-10” --tail=10 f9e29e8455a5
-f # 查看实时日志
-t # 查看日志产生的日期
--since # 此参数指定了输出日志开始日期,即只输出指定日期之后的日志
--tail=10 # 查看最后的10条日志
docker cp 容器ID:容器内的文件路径 宿主机路径 # 从容器内拷贝文件到宿主机
# 示例:docker cp f9e29e8455a5:/tmp/yum.log /root
命令参数详解
docker run
参考:https://www.h3399.cn/202001/749890.html
1, 格式
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
创建一个新的容器并运行一个命令,IMAGE是镜像ID或镜像名称
2, OPTIONS 参数
简写, 名称参数 | 默认参数 | 描述 |
---|---|---|
--add-host | 添加自定义主机到 IP 的映射(host:ip) | |
--attach , -a | 附加到 STDIN,STDOUT 或 STDERR | |
--blkio-weight | IO(相对权重),介于 10 到 1000 之间,或者为 0 禁用(默认为 0) | |
--blkio-weight-device | 块 IO 重量(相对设备重量) | |
--cap-add | 添加 Linux 功能 | |
--cap-drop | 放弃 Linux 功能 | |
--cgroup-parent | 容器的可选父 cgroup | |
--cidfile | 将容器 ID 写入文件 | |
--cpu-count | CPU 数量(仅 Windows) | |
--cpu-percent | CPU 百分比(仅 Windows) | |
--cpu-period | 限制 CPU CFS(完全公平的调度程序)期限 | |
--cpu-quota | 限制 CPU CFS(完全公平的调度程序)配额 | |
--cpu-rt-period | 限制 CPU 实时时间(以微秒为单位) | |
--cpu-rt-runtime | 限制 CPU 实时运行时间(以微秒为单位) | |
-c, --cpu-shares | CPU 份额(相对重量) | |
--cpus | CPU 数量 | |
--cpuset-cpus | 允许执行的 CPU(0-3,0,1) | |
--cpuset-mems | 允许执行的 MEM(0-3,0,1) | |
-d, --detach | 在后台运行容器并打印容器 ID | |
--detach-keys | 覆盖分离容器的键序列 | |
--device | 将主机设备添加到容器 | |
--device-cgroup-rule | 将规则添加到 cgroup 允许的设备列表中 | |
--device-read-bps | 限制从设备读取的速率(每秒字节数) | |
--device-read-iops | 限制从设备读取的速率(每秒 IO) | |
--device-write-bps | 限制对设备的写入速率(每秒字节数) | |
--device-write-iops | 限制对设备的写入速率(每秒 IO) | |
--disable-content-trust | true | 跳过图像验证 |
--dns | 设置自定义 DNS 服务器 (例如: 8.8.8.8) | |
--dns-opt | 设定 DNS 选项 | |
--dns-option | 设定 DNS 选项 | |
--dns-search | 设置自定义 DNS 搜索域 | |
--domainname | 容器 NIS 域名 | |
--entrypoint | 覆盖图像的默认 ENTRYPOINT | |
-e, --env | 设置环境变量 | |
--env-file | 读入环境变量文件 | |
--expose | 公开一个或多个端口 (8080,8081) | |
--gpus | API 1.40+GPU 设备添加到容器中(“全部” 传递所有 GPU) | |
--group-add | 添加其他群组即可加入 | |
--health-cmd | 运行命令以检查运行状况 | |
--health-interval | 运行检查之间的时间(ms | |
--health-retries | 需要连续报告不健康状况 | |
--health-start-period | API 1.29+ 容器在开始运行状况重试倒计时(ms | |
--health-timeout | 允许执行一次检查的最长时间(ms | |
--help | 打印用量 | |
-h, --hostname | 容器主机名 (例如: 例如: localhost) | |
--init | API 1.25+ 在容器内运行一个初始化程序,以转发信号并获取进程 | |
-i, --interactive | 即使未连接 STDIN 也保持打开状态(交互式执行容器) | |
--io-maxbandwidth | 系统驱动器的最大 IO 带宽限制(仅 Windows) | |
--io-maxiops | 系统驱动器的最大 IOps 限制(仅 Windows) | |
--ip | IPv4 地址(例如 172.30.100.104) | |
--ip6 | IPv6 地址(例如 2001:db8 :: 33) | |
--ipc | 使用的 IPC 模式 | |
--isolation | 集装箱隔离技术 | |
--kernel-memory | 内核内存限制 | |
-l, --label | 在容器上设置元数据 | |
--label-file | 读入行分隔的标签文件 | |
--link | 将链接添加到另一个容器 | |
--link-local-ip | 容器 IPv4 / IPv6 链接本地地址 | |
--log-driver | 容器的日志记录驱动程序 | |
--log-opt | 日志驱动程序选项 | |
--mac-address | 容器 MAC 地址(例如 92:d0:c6:0a:29:33) | |
-m,--memory | 内存限制 | |
--memory-reservation | 内存软限制 | |
--memory-swap | 交换限制等于内存加交换:“-1” 以启用无限交换 | |
--memory-swappiness | -1 | 调整容器内存交换(0 到 100) |
--mount | 将文件系统挂载附加到容器 | |
--name | 为容器分配一个名称 | |
--net | 网络模式 (host, bridge) | |
--net-alias | 为容器添加网络范围的别名 | |
--network | 网络名 (可以多个容器公用一个网络名, 这样多容器会在同一个网络环境下) | |
--network-alias | 网络别名 (未知) | |
--no-healthcheck | 禁用任何容器指定的健康检查 | |
--oom-kill-disable | 禁用 OOM 杀手 | |
--oom-score-adj | 调台主持人的 OOM 首选项(-1000 至 1000) | |
--pid | 使用的 PID 名称空间 | |
--pids-limit | 调整容器 pids 限制(将 - 1 设置为无限制) | |
--platform | 实验(守护程序)API 1.32+ 如果服务器具有多平台功能,请设置平台 | |
--privileged | 赋予此容器扩展的特权 | |
-p, --publish | 将容器的端口发布到主机(主机端口:容器端口) | |
-P, --publish-all | 将所有公开的端口发布到随机端口 | |
--read-only | 将容器的根文件系统挂载为只读 | |
--restart | no | 容器退出时重新启动策略以应用 no 默认策略,在容器退出时不重启容器 on-failure 在容器非正常退出时(退出状态非0),才会重启容器 on-failure:n 在容器非正常退出时重启容器,最多重启n次 always 在容器退出时总是重启容器 |
--rm | 退出时自动删除容器 | |
--runtime | 用于此容器的运行时 | |
--security-opt | 安全选项 | |
--shm-size | / dev / shm 的大小 | |
--sig-proxy | true | 代理接收到该过程的信号 |
--stop-signal | SIGTERM | 停止容器的信号 |
--stop-timeout | API 1.25+ 超时(以秒为单位)以停止容器 | |
--storage-opt | 容器的存储驱动程序选项 | |
--sysctl | Sysctl 选项 | |
--tmpfs | 挂载 tmpfs 目录 | |
-t, --tty | 分配伪 TTY(虚拟终端) | |
--ulimit | Ulimit 选项 | |
-u, --user | 用户名或 UID(格式:< 名称 | |
--userns | 要使用的用户名称空间 | |
--uts | 使用的 UTS 名称空间 | |
-v,--volume | 绑定挂载卷(主机目录:容器目录) | |
--volume-driver | 容器的可选音量驱动器 | |
--volumes-from | 从指定的容器挂载卷 | |
-w,--workdir | 容器内的工作目录 |
3,Command 和 Args:进程的命令和参数
# 指定了容器进程的命令为: /kube-dns,并指定了三个参数:--domain=cluster.local. --dns-port=10053 和 -v 2
docker run --name=kubedns nginx:latest /kube-dns --domain=cluster.local. --dns-port=10053 -v 2
4,案例
# 使用镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为mynginx
docker run --name mynginx -d nginx:latest
# 使用镜像 nginx:latest 以后台模式启动一个容器,并将容器的80端口映射到主机随机端口
docker run -P -d nginx:latest
# 使用镜像 nginx:latest 以后台模式启动一个容器,将容器的 80 端口映射到主机的 8080 端口,主机的目录 /data 映射到容器的 /data
docker run -p 8080:80 -v /data:/data -d nginx:latest
# 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
# 复制‘ubuntu’容器并且重命名为test且运行,然后以伪终端交互式方式进入容器,运行bash
docker run --name test -ti ubuntu /bin/bash
# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it nginx:latest /bin/bash
# 以镜像soar/centos:7.1创建名为test的容器,并以后台模式运行,并做端口映射到宿主机2222端口,P参数重启容器宿主机端口会发生改变
docker run -d -p 2222:22 --name test soar/centos:7.1
# echo "hello world" 会覆盖 hello_jmz 的 CMD
docker run -it hello_jmz echo "hello world"
# 后台运行并打印容器 iD, 将容器的 8080 端口映射到主机的 8081, 将当前的 hosts 文件挂载到容器的 /etc/hosts, 已只读的方式挂载. 结束自动删除容器
docker run -d -p 8081:8080 -v ./hosts:/etc/hosts:ro --rm playgateway
# 容器挂掉时总是重启, 容器名为 platformui , 使用网络 my_net, 没有会创建
docker run --restart=always --network=my_net --name platformui platformpcweb
# 已交互的形式 进入 CentOS 容器, 退出后, 删除容器
docker run -it --rm CentOS bash
docker update
更新一个或多个运行中容器的配置
OPTIONS 说明:
名称 | 描述 |
---|---|
--blkio-weight | 阻塞IO (相对权重),介于10到1000之间,0表示禁用(默认禁止) |
--cpu-period | 限制CPU CFS(完全公平的调度程序)期限 |
--cpu-quot | 限制CPU CFS(完全公平的调度程序)配额 |
--cpu-rt-period | API 1.25+ ,将CPU实时时间限制为微秒 |
--cpu-rt-runtime | API 1.25+ ,将CPU实时运行时间限制为微秒 |
--cpu-shares, -c | CPU份额(相对权重) |
--cpus | API 1.29+ ,CPU数量 |
--cpuset-cpus | 允许执行的CPU(0-3,0,1) |
--cpuset-mem | 允许执行的MEM(0-3,0,1) |
--kernel-memory | 内核内存限制 |
--memory-swap | 交换限制等于内存加交换,“-1”以启用无限交换 |
--memory-reservatio | 内存软限制 |
--memory, -m | 内存限制 |
--pids-limit | API 1.40+ ,调节容器pids限制(-1表示无限制) |
--restart | 容器退出时重新启动策略以应用 |
实例
# 更新容器的重启策略
docker update --restart=always 容器ID或名称
# 更新 CPU 共享数量
docker update --cpu-shares 512 容器ID或名称
# 更新容器内存
docker update -m 500M 容器ID或名称
docker system 命令
# 查看 Docker 整体磁盘使用率的概况,包括镜像、容器和(本地)volume
docker system df
# 删除所有关闭的容器以及dangling镜像
docker system prune
# 注意:This will remove:
# - all stopped containers # 清理停止的容器
# - all networks not used by at least one container # 清理没有使用的网络
# - all dangling images # 清理废弃的镜像
# - all build cache # 清理构建缓存
# 强制深度清理。删除除开真正在使用的镜像,容器,数据卷以及网络的其他所有docker相关的东西
docker system prune -af
# -a 所有的
# -f 强制
# 注意:生产环境使用该命令需谨慎,因为一些备用镜像(用于备份,回滚等)有时候需要用到如果这些镜像被删除了,则运行容器时需要重新下载
# 删除悬空没有 tag 标记的镜像。慎用-a选项,将删除当前没有关联运行容器的镜像
docker image prune
# 删除停止运行的容器
docker container prune
# 删除不被容器引用的网络资源
docker network prune
# 删除不被引用的本地数据卷
docker volume prune
其他命令
docker -v 或者 docker --version # 查看docker版本号
docker version # 查看docker版本详情
docker info # 查看docker详细信息
docker --help # 查看docker命令
策略方案
容器自动重启
docker-重启linux机器后Docker服务及容器自动启动
1、docker服务自动重启
systemctl enable docker
# 或
systemctl enable docker.service
2、容器重启,首先要保证已经设置docker服务自动重启
2.1 在启动容器时,添加--restart=always参数,如
docker run --restart=always
2.2 如果容器已经启动,可以使用命令更新参数
docker update --restart=always 容器id或名称