Docker 常用配置
镜像仓库的使用
之前我们使用的镜像都是从 DockerHub 公共仓库拉取的,我们也学习了如何制作自己的镜像,但是通过 tar 包的方式实现镜像的备份恢复迁移对于团队协作开发并不是特别友好,我们也可以将镜像推送至 DockerHub 仓库方便使用。
温馨提示:如果构建的镜像内携带了项目数据,建议还是使用私有仓库比较好。
- 前往 官网 注册账号
登录账号
通过
docker login
命令输入账号密码登录 DockerHub。
推送镜像至仓库
为了方便测试,我们将
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
查看仓库
测试拉取镜像
docker pull mrhelloworld/test-hello-world:1.0.0
退出账号
[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
详细步骤
打开 .bashrc
vim /root/.bashrc
添加 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
使别名生效
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。
修改 docker.service 文件,添加监听端口
-H tcp://0.0.0.0:2375
vi /usr/lib/systemd/system/docker.service
找到 ExecStart,在最后面添加
-H tcp://0.0.0.0:2375
,如下图所示
重启 docker
systemctl daemon-reload systemctl start docker
- 如果我们有防火前记得添加防火墙策略或者关闭防火墙。
数据目录
为啥要改?
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 包文件保存到本地。此时只需要拷贝或移动该镜像到我们想要的机器上,恢复该镜像并运行容器即可。