Docker笔记

73 阅读2分钟

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 日志驱动。日志会一直写,一直写,一直写……没有限制、没有轮转、没有清理!

主要通过日志轮询方式处理。下面介绍三种方式设置日志轮询

  1. 运行容器时设置轮转策略(推荐)

    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 内,绝不爆炸!

  2. 修改Docker配置

    该配置适用于所有容器。编辑配置文件 /etc/docker/daemon.json

    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "5"
      }
    }
    

    重启 Docker 服务:systemctl restart docker 注意:只对之后创建的容器生效!

  3. 正在运行的容器

    你可以这样快速清理日志(生产环境慎用! ):

    echo "" > $(docker inspect --format='{{.LogPath}}' <container-id>)
    

    或者更稳一点:

    1. docker stop 停掉容器

    2. docker rm 删除容器

    3. 使用轮转参数重新 run容器

  4. 禁用日志输出

    这个操作慎用,有可能影响应用运行,而且不方便后续排查

    docker run --log-driver=none 容器名
    
  5. 日志快速清理 仅推荐在磁盘告急时临时使用!

    find /var/lib/docker/containers -name *-json.log -exec truncate -s 0 {} \;
    
  6. 实战建议

    根据不同场景推荐配置值。

    场景建议参数
    开发环境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
查看CPUlscpu

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.在清除一次网络占用,最后再启动