docker 使用

版本说明

  • 系统:CentOS Linux release 7.2.1511 (Core)
  • 内核:3.10.0-327.el7.x86_64
  • docker信息:
1
2
3
4
Server Version: 17.06.2-ce
Storage Driver: overlay
Backing Filesystem: xfs
Supports d_type: true

安装准备

在基于xfs文件系统使用overlay存储驱动时,需要格式化参数ftype=1。否则会出现容器内目录删除失败的问题,见issue#31283。但是CentOS 7.2安装中并未使用这个参数。这里使用一个空分区来重新格式化。

如下,/dev/sdb1是新的分区,用mkfs进行格式化:

1
mkfs.xfs -n ftype=1 /dev/sdb1

然后将此分区挂载到docker目录上(最好写入fstab中):

1
2
mkdir -p /var/lib/docker/
mount /dev/sdb1 /var/lib/docker/

可以使用以下命令验证

1
xfs_info /dev/sdb1 | grep ftype

使用extfs也不行,见issues#15314,和https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/7.2_release_notes/technology-preview-file_systems

安装docker

1
2
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.06.2.ce-1.el7.centos.x86_64.rpm
yum install -y docker-ce-17.06.2.ce-1.el7.centos.x86_64.rpm

也可以使用阿里源http://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-17.06.2.ce-1.el7.centos.x86_64.rpm

写入配置

1
2
3
4
5
6
7
8
9
10
11
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"insecure-registries": ["xxxx"],
"log-driver": "json-file",
"log-opts": {
"max-size": "200m",
"max-file": "1"
}
}
EOF

启动docker

1
2
systemctl enable docker
systemctl start docker

FAQ

Dockerfile中yum install失败

问题

在Overlay存储驱动下,镜像里如果吗,没有安装yum-plugin-ovl,会出现:

1
2
3
4
5
6
FROM centos:7.2.1511

RUN curl http://mirrors.aliyun.com/help/centos/7/CentOS-Base.repo > /etc/yum.repos.d/CentOS-Base.repo

RUN yum makecache && yum install -y perl
RUN yum makecache && yum install -y vim

docker build后出现错误:

1
Rpmdb checksum is invalid: dCDPT(pkg checksums): vim-filesystem.x86_64 2:7.4.160-2.el7 - u

分析

issure#10180

解决1:

添加RUN yum install -y yum-plugin-ovl

解决2

RUN touch /var/lib/rpm/* && RUN yum install -y <packages-to-installed>

问题

在Docker build或者pull时候,出现以下错误:

1
/data/docker/runtime/overlay/49d96405b7d1ab2cc1c9f815347cf9716c3088b2db10ca3d36a894948b1e1a5c/root/var/lib/yum/yumdb/p/cf1f195f6bf8d654d694b941ead72c4c51798536-pcre-8.32-15.el7_2.1-x86_64/checksum_type /data/docker/runtime/overlay/1044d44c019cdd45df59c6df727dfef476decdc976477ab1124c0a0bf5735e10/tmproot559734426/var/lib/yum/yumdb/p/cf1f195f6bf8d654d694b941ead72c4c51798536-pcre-8.32-15.el7_2.1-x86_64/checksum_type: too many links

分析

由于硬链接数超出限制,见issues#32732

解决

清理镜像,减少镜像层数。

RLimit

系统默认的是1024:4096。如果没有修改过,docker会调整到Hard Limit。如果想要更大的,可以:

  • 修改/etc/docker/daemon.json
1
2
3
4
5
6
7
8
9
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 2048,
"Soft": 1024
}
}
}

目前的版本中对这一配置有以下bug,见issues#1513

1
unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives don't match any configuration option: default-ulimits

已有PR#32547

  • 修改/usr/lib/systemd/system/docker.servicevice中添加
1
2
3
4
[Service]
LimitNOFILE=65535
LimitNPROC=65535
LimitCORE=infinity

重启docker

  • 添加启动参数
1
2
3
dockerd --default-ulimit nofile=65535:65535 --default-ulimit nproc=65535:65535

dockerd --default-ulimit nofile=65535 --default-ulimit nproc=65535
  1. 单个容器设置

上面都是设置全局的。也允许单个容器的是设置

1
docker run --ulimit nofile=65535 ...
显示 Gitment 评论