Docker 常用配置

镜像仓库的使用

之前我们使用的镜像都是从 DockerHub 公共仓库拉取的,我们也学习了如何制作自己的镜像,但是通过 tar 包的方式实现镜像的备份恢复迁移对于团队协作开发并不是特别友好,我们也可以将镜像推送至 DockerHub 仓库方便使用。

温馨提示:如果构建的镜像内携带了项目数据,建议还是使用私有仓库比较好。

  1. 前往 官网 注册账号
  2. 登录账号

    通过 docker login​ 命令输入账号密码登录 DockerHub。

  3. 推送镜像至仓库

    为了方便测试,我们将 hello-world​ 镜像拉取至本地,然后再上传至 DockerHub 仓库中。

    先给镜像设置标签

    # 语法:docker tag local-image:tagname new-repo:tagname
    docker tag hello-world:latest mrhelloworld/test-hello-world:1.0.0

    再将镜像推送至仓库

    # 这里的 new-repo 一般是你 DockerHub 的用户名
    # 语法:docker push new-repo:tagname
    docker push mrhelloworld/test-hello-world:1.0.0

  4. 查看仓库

  5. 测试拉取镜像

    docker pull mrhelloworld/test-hello-world:1.0.0

  6. 退出账号

    [root@localhost ~]# docker logout
    Removing login credentials for https://index.docker.io/v1/

设置 docker compose 别名

Docker Compose 命令变化导致无法联想,tui,太难受了。

快速添加

sed -i '$a # 新增 docker compose 别名\nalias docker-compose="docker compose"' /root/.bashrc && \
source /root/.bashrc

详细步骤

  1. 打开 .bashrc

    vim /root/.bashrc
  2. 添加 docker-compose 别名

    # .bashrc
    
    # User specific aliases and functions
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    # 新增 docker compose 别名
    alias docker-compose='docker compose'
    
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
  3. 使别名生效

    source /root/.bashrc

镜像加速

为啥要改?

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。

修改方式

vim /etc/docker/daemon.json

加入以下配置信息:

{
    "registry-mirrors": [
        "https://ung2thfc.mirror.aliyuncs.com",
        "https://registry.docker-cn.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
    ]
}
镜像加速器镜像加速器地址备注
Docker 中国官方 {: colspan="1"}https://registry.docker-cn.com {: colspan="1"}
阿里云https://{your_id}.mirror.aliyuncs.com
七牛云https://reg-mirror.qiniu.com
网易云http://hub-mirror.c.163.com推荐
腾讯云https://mirror.ccs.tencentyun.com

保存退出后,重启 docker 服务:

sudo systemctl daemon-reload && \
sudo systemctl restart docker

开启远程连接访问

首先我们要开启 docker 的远程连接访问。保证不是 docker 所在的服务器,也能够远程访问 docker。

  1. 修改 docker.service 文件,添加监听端口 -H tcp://0.0.0.0:2375

    vi /usr/lib/systemd/system/docker.service

    找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375​,如下图所示

    图片

  2. 重启 docker

    systemctl daemon-reload
    systemctl start docker
  3. 如果我们有防火前记得添加防火墙策略或者关闭防火墙。

数据目录

为啥要改?

Docker 安装后默认下载的位置在 /var/lib/docker​ ,如果 /var ​分区没有独立分出来,Linux 下默认是与 / ​根分区在一起。一般我们装 Linux 系统的时候,除了做邮件服务器外,都不会把/var 分区独立分出来,而且/分区一般不会太大,比如我现在用的这台根分区 50G 的,在拉镜像的时候提示硬盘空间不足的问题,而其它分区还有很大空间。基于此情此景,我们都要把这个目录改一下

查看当前 Docker 目录位置

# 展示当前docker的配置信息
docker info

-------------------------------------------------------------------
# 在信息找到Docker Root Dir,对应的就是了,默认为:
Docker Root Dir: /var/lib/docker

修改方式

vim /etc/docker/daemon.json

加入以下配置信息:

{
  "data-root": "/home/hellxz/docker-home"
}

保存退出后,重启 docker 服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

日志大小

为啥要改?

docker 容器在运行一定时间后会产生大量的日志,导致磁盘空间问题出现。

修改方式

vim /etc/docker/daemon.json

加入以下配置信息:

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3" 
    }
}
参数说明
max-size容器日志文件上限大小
max-file表示容器有三个日志
第一个满了 10M 之后就写第二个
第二个满了 10M 就写第三个
如果第三个满了,就清空第一个日志文件,重新写第一个日志文件。

保存退出后,重启 docker 服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

注意:新创建的容器会生效,原有容器不生效。

手动清理

# 查看各个容器的log文件大小 找到容器的containerId-json.log文件,并清理(治标不治本,log迟早还会大的)
find /var/lib/docker/containers/ -name *-json.log |xargs du -sh

# 返回如下:
4.0K    /var/lib/docker/containers/5cd59b0843552ec0799f09d48dafa1a92d893838b6e87229f005f619f78e1bec/5cd59b0843552ec0799f09d48dafa1a92d893838b6e87229f005f619f78e1bec-json.log
0       /var/lib/docker/containers/e3f7daf3cd1f05774d3f41ea560ebe006a614a09861ee6e67da47e46310d8401/e3f7daf3cd1f05774d3f41ea560ebe006a614a09861ee6e67da47e46310d8401-json.log
8.3M    /var/lib/docker/containers/e31c318ec9425a550cc9b8b9513c412a1a535f204484a35970aef8247aceadbd/e31c318ec9425a550cc9b8b9513c412a1a535f204484a35970aef8247aceadbd-json.log
4.0K    /var/lib/docker/containers/a98b3da1e5d045d3ab85adf49a3d407448c9f641899fb110e73d55aa7f078002/a98b3da1e5d045d3ab85adf49a3d407448c9f641899fb110e73d55aa7f078002-json.log
8.0K    /var/lib/docker/containers/b1015a7b6cd4623ae20303dd630f8332500f6abc49ebdd5206af01f81c2763f1/b1015a7b6cd4623ae20303dd630f8332500f6abc49ebdd5206af01f81c2763f1-json.log
4.0K    /var/lib/docker/containers/0943021a60d01d9b8b94597ab1c9344bb70ad97f4fd1d446e27fd40451bd6c56/0943021a60d01d9b8b94597ab1c9344bb70ad97f4fd1d446e27fd40451bd6c56-json.log
8.0K    /var/lib/docker/containers/c7847618a253685e9535f4942b0e289ba336ac74b6cd895f4ffdb717a296a19e/c7847618a253685e9535f4942b0e289ba336ac74b6cd895f4ffdb717a296a19e-json.log
4.0K    /var/lib/docker/containers/05e589307b38d2b79d57d106eb84e24516a6687c57dff6644c98038b752864af/05e589307b38d2b79d57d106eb84e24516a6687c57dff6644c98038b752864af-json.log
4.0K    /var/lib/docker/containers/0d7ac2229fc1f88dacad0e01db7499f0b924fcb525987cf298a03f5b1729f47d/0d7ac2229fc1f88dacad0e01db7499f0b924fcb525987cf298a03f5b1729f47d-json.log
41G     /var/lib/docker/containers/392d160b11e4c5f9d78806a92cbd475a32f8189e28e167c8054a464b7e1b7d6c/392d160b11e4c5f9d78806a92cbd475a32f8189e28e167c8054a464b7e1b7d6c-json.log
0       /var/lib/docker/containers/d59e26993caff21cc592d7a150960843c3f41173d1f2ea8b1945e92066a03527/d59e26993caff21cc592d7a150960843c3f41173d1f2ea8b1945e92066a03527-json.log
0       /var/lib/docker/containers/d933631dda48aeab5832212a6d7bfb202699ae7338f5ad4e0314ec3b1d702854/d933631dda48aeab5832212a6d7bfb202699ae7338f5ad4e0314ec3b1d702854-json.log

# 执行清理
# 语法:cat /dev/null > /var/lib/docker/containers/容器id/容器id-json.log
cat /dev/null > /var/lib/docker/containers/d933631dda48aeab5832212a6d7bfb202699ae7338f5ad4e0314ec3b1d702854/d933631dda48aeab5832212a6d7bfb202699ae7338f5ad4e0314ec3b1d702854-json.log

注意:这里没有使用 rm​ 方式来删除文件。使用 rm -rf​ 方式删除日志后,通过 df -h​ 会发现磁盘空间并没有释放。原因是在 Linux 或者 Unix 系统中,通过 rm -rf​ 或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。正确姿势是 cat /dev/null > *-json.log​ ,当然你也可以通过 rm -rf​ 删除后重启 docker。

脚本清理

#!/bin/sh 

echo "======== start clean docker containers logs ========"  

logs=$(find /var/lib/docker/containers/ -name *-json.log)  

for log in $logs  
        do  
                echo "clean logs : $log"  
                cat /dev/null > $log  
        done  

echo "======== end clean docker containers logs ========"

给脚本添加权限:

chmod +x clean_docker_log.sh

执行脚本的命令:

./clean_docker_log.sh

大家可以把执行脚本的命令加到 Linux 的定时任务中就可以了。

查看、导出容器日志

命令格式

$ docker logs [OPTIONS] CONTAINER
  Options:
        --details        显示更多的信息
    -f, --follow         跟踪实时日志
        --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
        --tail string    从日志末尾显示多少行日志, 默认是all
    -t, --timestamps     显示时间戳
        --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

基础用法

  • 查看指定 docker 容器的日志:

    docker logs 『容器名字或者ID』
  • 查看指定时间后的日志,只显示最后 100 行:

    docker logs -f -t --since="2018-02-08" --tail=100 『容器名字或者ID』
  • 查看最近 30 分钟的日志:

    docker logs --since 30m 『容器名字或者ID』
  • 查看某时间之后的日志:

    docker logs -t --since="2018-02-08T13:23:37" 『容器名字或者ID』
  • 查看某时间段日志:

    docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" 『容器名字或者ID』

进阶用法

如果需要找其中包含某些内容(如 xxx)的所有行,可以

docker logs 『容器名字或者ID』 2>&1 | grep xxx

注:这里的 2>&1 代表 把标准错误(文件描述符 2)重定向(>)到标准输出(文件描述符 1)的位置(&)。

如果需要导出日志文件,可以

# grep 的 -i 表示不区分大小写 
docker inspect 『容器名字或者ID』 | grep -i logpath

然后可以看到一个文件路径,把这个文件拷贝下来就可以啦。

镜像的备份恢复迁移

为了备份该镜像,我们有以下几个选择:

  • 我们可以将指定镜像保存成 tar 归档文件,需要使用时将 tar 包恢复为镜像即可;
  • 登录 DockerHub 注册中心,将镜像推送至 DockerHub 仓库方便使用;
  • 搭建私有镜像仓库,将镜像推送至私有镜像仓库方便使用。

接下来我们通过 tar 归档文件的方式实现镜像的备份恢复迁移。

镜像备份

使用 docker save​ 将指定镜像保存成 tar 归档文件。

docker save [OPTIONS] IMAGE [IMAGE...]
docker save -o /root/mycentos7.tar mycentos:7
  • ​​-o​:镜像打包后的归档文件输出的目录。

镜像恢复

使用 docker load​ 导入 docker save 命令导出的镜像归档文件。

docker load [OPTIONS]
docker load -i mycentos7.tar
  • ​​--input, -i​:指定导入的文件;
  • --quiet, -q:精简输出信息。

镜像迁移

镜像迁移同时涉及到了上面两个操作,备份和恢复。

我们可以将任何一个 Docker 镜像从一台机器迁移到另一台机器。在迁移过程中,首先我们要把容器构建为 Docker 镜像。然后,该 Docker 镜像被作为 tar 包文件保存到本地。此时只需要拷贝或移动该镜像到我们想要的机器上,恢复该镜像并运行容器即可。

posted @ 2023-03-14 13:23:00 猎隼丶止戈 阅读(37) 评论(0)
发表评论
昵称
邮箱
网址