Docker02-容器和镜像的使用
Docker
查看docker信息
docker version 查看docker版本
docker info 查看docker版本
docker --help 查看docker帮助
docker events 用于实时输出Docker服务器中的发生的事件
--since="1610585455" 输出时间戳之后的事件
--until="1569415441" 输出时间戳之前的事件
镜像
镜像的表示方法
镜像的典型表示方法
Remote-dockerhub.com/namespace/bar:latest
Remote-dockerhub.com,Remote docker hub 集中存储镜像的web服务器地址
namespace,Namespace 命名空间,是一个用户或组织中所有镜像的集合
bar,Repository 镜像仓库,用来放置同一类镜像的不同版本
latest,Tag标签,用来区分镜像的不同版本
上传/下载镜像
docker pull 镜像名:标签
#不指定标签,默认标签为latest,即下载最新版本
docker push <仓库地址>/<镜像名称>:<标签>
#向私有仓库上传镜像时需要先创建标签
docker push busybox # 上传
docker pull nginx: 1.13.7 # 下载
列出镜像列表
docker images nginx
--digests 显示镜像的细节信息 # 多一个sha256校验值
--no-trunc 显示镜像/容器的完整ID
查看镜像
docker history nginx # 查看镜像的制作历史
docker inspect 镜像名 # 查看镜像的底层信息
docker inspect -f '{{}}' # 查看镜像的指定底层信息,-f 过滤信息
删除镜像
docker rmi nginx # 删除镜像,默认标签是latest
#当某镜像有基于自身生成的容器时,无法删除
导出/导出镜像
docker save
docker save busybox:latest > busybox.tar # 导出
docker save busybox:latest -o busybox.tar # 导出
docker save [image1] [image2] [image3] > images.tar # 导出多个镜像
# docker save会保存该镜像和所有历史记录
# docker save保存的是镜像的tar包
docker load
docker load < busybox.tar # 导入
docker load -i busybox.tar # 导入
#docker load用来载入镜像包,不能重命名
docker export
# docker export用来导出容器
# 不会保留容器的历史记录,即没有commit历史
docker import
#docker import用来导入容器(的归档),可以重命名
修改镜像的名称和标签
docker tag 旧镜像:旧标签 新镜像:新标签
docker tag centos:latest cen:v1
创建(提交)镜像
# 首先需要运行一个容器,基于该容器修改后再提交为新镜像
docker run -itd --name mynginx nginx:latest /bin/bash
docker commit -m="custom image" -a="me" mynginx custom/nginx:v1
-m #指定描述信息,可通过命令"docker inspect 镜像名" comment字段查看
-a #指定作者
mynginx #基础容器,也可用id代替
custom/nginx:v1 #新的镜像名称和标签
-e #指定容器的环境变量 -e MYHOST=/root/test
使用Dockerfile构建镜像
# 读取指定目录(包括子目录)下的dockerfile
docker bulid --no-cache -t my-nginx/test /path/to/dockerfile
--no-cache # 禁用缓存
-t # 指定生成的镜像标签
另外,可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker 忽略路径下的目录和文件。
查找镜像
docker search busybox
docker search -s 30 nginx # 点赞数超过30的nginx镜像
容器
标记容器
标记本地镜像,将其归入某一仓库。
docker tag <原镜像名称>:<原标签> <仓库URL>/<目标镜像名称>:<目标标签>
docker tag ubuntu:15.10 runoob/ubuntu:v3
删除容器
docker rm mynginx # 删除容器
-f,--force=false # 强行终止并删除一个运行中的容器
-1,--link=false # 删除容器的连接,但保留容器
-v,--volumes=false # 删除容器挂载的数据卷
docker ps -qa | xargs docker rm # 删除多个容器
#正在运行的容器无法删除,需要关闭后删除
运行容器
docker run -itd --name mynginx nginx:latest /bin/bash
-i (interactive) 交互式 # 单独指定该选项将没有命令提示符
-t (tty) 伪终端 # 单独指定该选项将不能交互,打的命令没反应,exit也不能退出镜像
-d 放入后台 # 单独指定该选项将不能启动容器
--rm # 容器终止后会立即删除,--rm和-d不能同时使用
--privileged # 启动docker特权模式,该模式下的容器对宿主机有root权限
1.如果不指定镜像的标签,则按默认标签处理,如果没有最新的nginx,命令会下载
2.不关闭容器退出用 ctrl+p ctrl+q
3.如果要让docker容器在后台运行,就必须有一个前台的进程。容器运行的命令如果不是像top tailf 这样一直挂起的命令,容器启动后就会自杀。例如:运行“docker run -d containerID”,用“docker ps”看不到容器信息
start/stop/restart容器
docker start mynginx # 启动
docker restart mynginx # 重新启动容器
docker stop mynginx # 停止容器
说明:
# docker start 会保留容器第一次启动时的所有参数
# docker start 启动后的容器是在后台运行
# docker restart 可以重启容器,就是依次执行docker stop 和 docker start
pause/unpause容器
可用于要对容器的文件系统打个快照,或者docker host的CPU不足的情况
# 暂停容器,暂停的容器不会占用CPU
docker pause mynginx
# 解除暂停容器
docker unpause mynginx
映射容器端口
docker run -d -P nginx
docker run -d -p 80:80 nginx
-p # -p 本机端口:容器端口
-P # 将容器的端口映射被本机端口(随机49000-49900)
查看容器
docker ps # 显示正在运行的容器,包含id,name等
docker ps -a # 显示所有容器(包括曾经启动过的)
docker ps -q # 显示正在运行的容器的id
docker ps -qa # 显示所有容器的id
docker port 容器ID # 查看有端口映射的容器的端口信息
docker ps --format "{{.ID}}\t{{.Names}}" # 查看容器ID和容器名
--no-trunc 显示镜像/容器的完整ID
容器的重启策略
重启策略包括always, unless-stopped和on-failed
建议在运行容器时配置好重启策略
always策略会一直尝试重启处于停止状态的容器。除非容器被明确停止,比如通过docker container stop命令。
当docker daemon重启的时候,停止的容器也会被重启。
unless-stopped和always的最大区别,就是处于stopped (Exited)状态的容器,不会在Docker daemon重启的时候被重启。
on-failure策略会在退出容器并且返回值不是0的时候,重启容器。就算容器处于stopped状态,在Docker daemon重启的时候,容器也会被重启。
docker container run --name web1 -d --restart=always nginx
docker container run --name web2 -d --restart=unless-stopped nginx
docker container run --name web3 -d --restart=on-failure nginx
docker container run --name web3 -d --restart=on-failure:3 nginx # 最多重启3次
更新容器的重启策略
# 通过命令行修改
docker container updata --restart=always
# 通过修改配置文件,需要将容器停止后修改
vim /var/lib/docker/containers/容器ID/hostconfig.json
"RestartPolicy":{"Name":"always","MaximumRetryCount":0}
配置容器的DNS
# 在创建容器时指定dns
docker run --dns=x.x.x.x image
# 通过修改Docker配置文件,修改默认的dns
vim /etc/docker/daemon.json
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
容器四种状态
运行 已暂停 重新启动 已退出
连接容器
docker attach
docker attach mynginx # 进入容器
#attach连接容器。exit退出,会关闭容器,所以用ctrl+p、ctrl+q退出不关闭
docker exec
docker exec -it mynginx /bin/bash
#-t分配伪终端后,执行/bin/bash,也能进入容器
#连接的容器也可以用id来代替名称
#exec的实际用途是从容器外部运行容器内部命令
#exec连接容器,exit退出,不会关闭容器
# 列出容器内部的/etc目录
docker exec mynginx ls /etc
指定/更新容器配额(内存、CPU)
# 更新
docker update [OPTIONS] CONTAINER [CONTAINER...]
# 指定
docker run [OPTIONS] CONTAINER [CONTAINER...]
# 限制内存的选项
-m, --memory bytes 限制使用的内存
--cpuset-mems string 允许使用的内存块(如0-3, 0,1)
--memory-swap bytes 内存加上缓存区的限制,-1表示为对缓冲区无限制
--memory-reservation bytes 内存软限制
--kernel-memory bytes 限制使用的内核内存
# 限制CPU的选项
-c, --cpu-shares int 限制CPU 使用份额(相对权重)
--cpu-period int 限制CPU调度器CFS(Completely Fair Scheduler)使用时间,单位为微秒,最小1000
--cpu-quota int 限制CPU调度器CFS配额,单位为微秒,最小1000;
--cpu-rt-period int 限制CPU调度器的实时周期,单位为微秒
--cpu-rt-runtime int 限制CPU调度器的实时运行时,单位为微秒
--cpus decimal 限制CPU个数
--cpuset-cpus string 允许使用的CPU核(如0-3, 0,1)
# 其他选项
--pids-limit int 调整容器pid限制(设置-1为无限)
限制容器的磁盘IO
bps 每秒读写数据量
iops 每秒IO次数
--blkio-weight uint16 更新block IO 权重(优先级),10 ~ 1000,默认值为0,代表着无限制
读取带宽限制(--device-read-bps):
docker run --device-read-bps /dev/sda:1mb -d your_image_name
这将限制容器从 /dev/sda 设备读取的带宽为 1MB/s
写入带宽限制(--device-write-bps):
docker run --device-write-bps /dev/sda:1mb -d your_image_name
这将限制容器向 /dev/sda 设备写入的带宽为 1MB/s
限制 IOPS
读取 IOPS 限制(--device-read-iops):
docker run --device-read-iops /dev/sda:100 -d your_image_name
这将限制容器从 /dev/sda 设备读取的 IOPS 为 100
写入 IOPS 限制(--device-write-iops):
docker run --device-write-iops /dev/sda:100 -d your_image_name
这将限制容器向 /dev/sda 设备写入的 IOPS 为 100
容器压力测试
使用progrium/stress镜像,是一个用于在容器中生成负载的工具。
它基于 stress 工具,这是一个简单的负载生成工具,可以在 Linux 系统上用来测试系统的稳定性和性能
docker run --rm progrium/stress --cpu 2 --vm 1 --vm-bytes 280M --io 4
--vm 1 启动1个内存工作线程(1 个虚拟内存(VM)实例)
--vm-bytes 280M 每个线程(实例)分配280M内存
--cpu 2 生成占用 4 个 CPU 核心的负载
--io 4 生成占用 4 个 I/O 工作线程的负载
限制容器的内核能力
# 删除容器的内核能力
docker run --cap-drop=NET_ADMIN --cap-drop=SYS_ADMIN -it ubuntu
# 添加容器的内核能力
docker run --cap-add=NET_ADMIN -it ubuntu
# 常见的 Linux 能力
CAP_CHOWN: 允许更改文件的所有者。
CAP_DAC_OVERRIDE: 忽略文件读、写和执行权限检查。
CAP_FOWNER: 忽略文件所有者 ID 检查。
CAP_NET_ADMIN: 允许执行网络管理操作。
CAP_SYS_ADMIN: 允许执行系统管理操作。
CAP_SETUID: 允许更改进程的用户 ID。
# 运行一个Ubuntu容器,并打印出所有可能的能力。通过这种方式,你可以决定需要删除哪些能力来减少容器的权限
docker run --rm --cap-drop=ALL --cap-add=all ubuntu capsh --print
capsh --print: 在容器内运行 capsh 命令并打印当前进程的能力。
# capsh 命令的典型输出
Current capabilities: 当前进程的能力。
Bounding set: 能力的边界集,表示进程可以获取的能力范围。
Ambient set: 环境集,影响子进程继承的能力。
Effective set: 当前有效的能力。
Permitted set: 允许集,进程可以启用的能力。
Inheritable set: 继承集,子进程可以继承的能力。
限制容器日志大小
将日志文件内容清空
truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log
限制nginx容器日志大小为5G,重启容器生效
nginx:
image: nginx:1.12.1
restart: always
logging:
driver: "json-file"
options:
max-size: "5g"
-------------------------------
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
max-size=500m,意味着一个容器日志大小上限是500M,
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。
查看容器
docker logs -f mynginx # 查看容器日志
docker top mynginx # 查看容器进程
拷贝容器文件
docker cp /etc/hosts mynginx:/tmp/ # 拷贝主机的/etc/host到容器的/tmp目录
docker cp mynginx:/etc/hosts /tmp/ # 拷贝容器的文件到本机
#注意目标路径的结尾有/,没有/表示改名
#不指定主机文件的路径,则以当前路径作为默认路径
比较容器文件
docker diff mynginx # 列出正在运行的容器中修改的文件列表,比较的标准是创建容器的镜像
# A /data # 增加
# C /etc/hosts # 修改
# D /usr/local/nginx。 # 删除
其他命令
docker kill $(docker ps -qa) # 杀死所有容器
docker rm $(docker ps -qa) # 删除所有容器
docker rmi $(docker image –fq dangling) # 删除所有未打dangling标签的镜像
docker rmi $(docker images -q) # 删除所有镜像
docker image prune # 删除所有未被 tag 标记和未被容器使用的镜像
docker image prune -a # 删除所有未被容器使用的镜像
docker container prune # 删除所有停止运行的容器
docker volume prune # 删除所有未被挂载的卷
docker network prune # 删除所有网络
docker system prune # 删除 docker 所有资源
docker system prune # 删除所有未使用数据
docker volume prune # 只删除未使用的volums
分类:
Docker
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)