Docker笔记
| 【容器】用途 | 指令 |
|---|---|
| 查看Docker版本 | docker --version |
| 查看Docker内部系统版本 | docker exec <container_id> cat /etc/os-release |
| 进入容器 | docker exec -it <container_id> /bin/bash |
| 不进入容器删除文件 | docker exec -it <container_id> rm <file_path> |
| 不进入容器删除文件 | docker exec -it <container_id> rm -rf <file_path> |
| 资源监控工具 | docker stats |
| 启动Docker中所有已停止的容器 | docker start $(docker ps -a -q) |
| 导出日志 | docker logs - -since “2024-01-01T00:00:00” - - until “2024-01-01T23:59:59” 【容器名字】 > 【日志文件名字】 |
| 删除容器 | docker rm <container_id> |
| 清理此容器的网络占用 | 格式:docker network disconnect --force 网络模式 容器名称 |
| 清理此容器的网络占用 | 示例:docker network disconnect --force bridge gitlab |
| 端口映射 【<宿主机端口>:<容器端口>】 | docker run -p 8080:80 -d nginx |
| 容器目录挂载 【主机上的目录路径:容器内的目标路径】 | docker run -v /app/nginhtml:/usr/share/nginx/html |
| 删除所有未使用的镜像 | docker image prune -f |
| 删除所有未使用的悬空镜像(没有标签的镜像) | docker image prune -f --filter dangling=true |
| 删除带有指定标签的Docker镜像 | docker image prune -a --filter label= |
| 删除所有停用的镜像 | docker rmi $(docker images -a -q) |
| 删除镜像 | docker rmi <image_id> |
| 删除镜像多个版本 | docker rmi image_name:tag1 image_name:tag2 |
| 删除所有具有给定前缀的像版本 | docker rmi $(docker images -q "image_name:prefix*") |
| 提交镜像 | docker commit |
| 保存镜像 | docker save |
| 拉取镜像 | docker pull |
| 加载镜像 | docker load |
【悬空镜像】其他镜像不会引用「悬空镜像」,因此可以安全的删除「悬空镜像」。
REPOSITORY TAG IMAGE_ID CREATED SIZE
<none> <none> 7848fcc70e7b 4 days ago 362MB
安装
//CentOS 使用官方安装脚本自动安装
curl -fsSL [<https://get.docker.com>](<https://get.docker.com/>) | bash -s docker --mirror Aliyun
-
镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
//科大镜像 <https://docker.mirrors.ustc.edu.cn/> //网易 <https://hub-mirror.c.163.com/> //七牛云加速器 <https://reg-mirror.qiniu.com> //Centos8 编辑/etc/docker/daemon.json文件,没有则创建,添加以下内容 { "registry-mirrors": [ "<http://hub-mirror.c.163.com>", "<https://docker.mirrors.ustc.edu.cn>" ] } -
Docker远程服务 编辑/etc/docker/daemon.json文件,没有则创建,添加以下内容:
{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }替换/usr/lib/systemd/system/docker.service的ExecStart=..................行
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock重启docker
sudo systemctl daemon-reload sudo systemctl restart docker
镜像日志
Docker 默认使用的是 json-file 日志驱动。日志会一直写,一直写,一直写……没有限制、没有轮转、没有清理!
主要通过日志轮询方式处理。下面介绍三种方式设置日志轮询
-
运行容器时设置轮转策略(推荐)
docker run -d \ --name myapp \ --log-driver json-file \ --log-opt max-size=10m \ --log-opt max-file=3 \ myapp:latest参数解释: •
max-size=10m:单个日志文件最大 10MB •max-file=3:最多保留 3 个轮转文件(最多 30MB) 容器总日志控制在 30MB 内,绝不爆炸! -
修改Docker配置
该配置适用于所有容器。编辑配置文件
/etc/docker/daemon.json:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "5" } }重启 Docker 服务:systemctl restart docker 注意:只对之后创建的容器生效!
-
正在运行的容器
你可以这样快速清理日志(生产环境慎用! ):
echo "" > $(docker inspect --format='{{.LogPath}}' <container-id>)或者更稳一点:
-
docker stop停掉容器 -
docker rm删除容器 -
使用轮转参数重新 run容器
-
-
禁用日志输出
这个操作慎用,有可能影响应用运行,而且不方便后续排查
docker run --log-driver=none 容器名 -
日志快速清理 仅推荐在磁盘告急时临时使用!
find /var/lib/docker/containers -name *-json.log -exec truncate -s 0 {} \; -
实战建议
根据不同场景推荐配置值。
场景 建议参数 开发环境 max-size=5m max-file=3 测试环境 max-size=10m max-file=5 生产环境 max-size=50m max-file=10 Docker 日志默认设置太坑,一定要手动配置! 最佳实践: • 用
json-file+max-size+max-file• 修改daemon.json设置全局默认 • 老容器要么清理日志,要么重启带轮转参数
现有镜像打成新镜像
-
docker commit
docker commit命令允许你从正在运行的容器中创建一个新的镜像。这个方法比较直接,但不推荐用于生产环境,因为它不提供构建过程的可重现性。
# 1. 启动一个容器(如果你还没有一个运行的容器): docker run -d --name my_container existing_image_name # 2. 对容器进行更改(例如,安装软件包或修改配置文件): docker exec -it my_container bash # 在容器内执行需要的命令,例如安装软件包: # apt-get update && apt-get install -y some-package # 3. 创建一个新的镜像: docker commit my_container new_image_name -
使用Dockerfile
硬件信息
| 查看系统 | uname -a |
|---|---|
| 查看CPU | lscpu |
Docker问题
问题1:Error response from daemon: endpoint with name gitlab already exists in network bridge
#1.清理此容器的网络占用
格式:`docker network disconnect --force 网络模式 容器名称`
示例:`docker network disconnect --force bridge gitlab`
#2.如果清除网络占用后,启动报
docker: Error response from daemon: Conflict. The container name "/gitlab" is already in
use by container "98a83b26615c732c91a8ad6e4653122a9cc54a24de48f27081f803af2d75b84b".
You have to remove (or rename) that container to be able to reuse that name.
#3.则先删除已停止的容器
docker rm $(docker ps -a -q)
#4.在清除一次网络占用,最后再启动