限制容器日志大小
Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加。以下方式可以控制日志文件大小:
- 启动容器时,通过参数来控制日志文件的个数和大小
# 设置容器日志文件最大10MB,最大日志文件数量为3
docker run -it --log-opt max-size=10m --log-opt max-file=3 redis
- 全局日志配置,创建或修改文件
/etc/docker/daemon.json
,并增加以下配置
{
"log-driver":"json-file",
"log-opts":{
"max-size" :"50m","max-file":"1"
}
}
然后重启docker服务即可生效。但是已经存在的容器不会生效
限制容器可以使用的内存资源
默认情况下,容器最多可以使用的最大内存为宿主机的内存。比如4GB内存的虚拟机,查看每个容器的内存限制如下
采用默认配置的情况下,如果某个容器内存消耗过大,占满宿主机内存资源,那么就会导致其他容器内存资源不足,影响其他容器的运行。所以一般情况下我们要限制容器的内存,可以在启动容器时用-m
参数指定
# 限制容器可用最大内存为500MB
docker run -d -m 500MB redis:5
指定容器时区
Docker容器默认的时区为UTC时区。在运行容器前,推荐指定容器时区为东八区,否则在容器内部执行一些时间函数(比如MySQL容器的sysdate()或JDK容器的时间api)得到的结果将比北京时间早8个小时
如果我们要给docker容器统一时区,有以下几种方案:
- 如果是自己用dockerfile构建的镜像,那么可以在dockerfile中构建镜像时指定好时区
# 设置容器时区
RUN echo 'Asia/Shanghai' > /etc/timezone
-
如果是镜像已经存在,我们可以在启动容器时指定时区:
-
将时区设置为与宿主机相同
# 将宿主机的时区相关目录映射到容器中 docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime
-
通过设置环境变量
TZ
指定时区# 指定容器时区,不指定的话mysql的时间函数执行结果会不正确 docker run -p 3306:3306 --name mysql5.7 -e TZ="Asia/Shanghai" -d mysql:5.7
-
-
如果是在
docker-compose
中,同样可以给容器设置环境变量来指定时区
version: "3.2"
services:
mysql5:
container_name: mysql01
image: mysql:5.7
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- TZ=Asia/Shanghai # 设置时区
数据卷的推荐映射方式
容器数据卷映射到宿主机一般有两种方式,第一种方式如下:
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
但要注意通过这种方式指定数据卷时,假设指定的宿主机目录是空的,那么数据卷映射建立后,容器中对应的映射目录也会被清空。如果容器中对应的目录原来有内容(比如一些默认的配置文件),并且你想保留,那么就不能用这种方式直接创建数据卷。此时要先创建不带数据卷映射的容器,进入容器将想要保留的内容拷贝出来到宿主机的目录,然后再重新建立这个已经包含拷贝出来文件的宿主机目录与容器目录进行映射的容器,十分麻烦
为了解决上述问题,推荐使用下面这种方式:
docker run -v 自定义数据卷名称:/容器内目录 镜像名
比如
docker run -d -p 8080:8080 --name tomcat02 -v baobao:/usr/local/tomcat/webapps tomcat:8.0-jre8
这里baobao
代表一个数据卷的名称,名称可以随便写,docker会在创建这个数据卷同时自动将其映射到宿主机中的/var/lib/docker/volumes
目录中。同时在启动容器时,会自动将baobao
对应的容器目录中的全部内容复制到baobao
映射的宿主机目录中
评论区