Docker 不仅在卷中写入数据
Docker writes data not only in volume
这是我的设置:
- 4 项服务:Worker、数据库 (Postgis)、Rest-API 和 Mapserver
- 1 个数据库卷
docker volume inspect pgdata
[
{
"CreatedAt": "0001-01-01T00:00:00Z",
"Driver": "local-persist",
"Labels": {},
"Mountpoint": "/mnt/pgdata",
"Name": "pgdata",
"Options": {
"mountpoint": "/mnt/pgdata"
},
"Scope": "local"
}
]
2 disks/partitions:
df -h
Filesystem Size Used Avail Use% Mounted on
udev 63G 0 63G 0% /dev
tmpfs 13G 856K 13G 1% /run
/dev/sda1 939G 10G 889G 2% /
tmpfs 63G 0 63G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 63G 0 63G 0% /sys/fs/cgroup
s3fs 16E 0 16E 0% /codede
tmpfs 13G 0 13G 0% /run/user/1000
/dev/sdb1 46T 24K 44T 1% /mnt/pgdata
如您所见,安装在 /mnt/pgdata 的分区有 44TB 存储空间,我希望存储在数据库中的所有数据都存储在那里,因为它会变得非常快。
但是当我开始向数据库中添加数据时,1TB 磁盘随后会被填满,我的系统将 fail/stop。
database:
image: DB_IMAGE
volumes:
- pgdata:/var/lib/postgresql/data
command: postgres -c 'max_connections=500'
ports:
- "6543:5432"
secrets:
- postgres-user
- postgres-password
environment:
POSTGRES_USER_FILE: /run/configs/postgres-user
POSTGRES_PASSWORD_FILE: /run/secrets/postgres-password
POSTGRES_DB: ts
deploy:
placement:
constraints: [node.role == manager]
workers 在节点上 运行,mapserver 和 Rest-API 预计对硬盘的影响非常小。
所以唯一影响存储的服务运行应该是数据库。
为什么它仍然会填满较小的磁盘space 而不是只填满大磁盘?
编辑:
显然我的容器在磁盘上仍然需要大量的 space。容器是 ts_database 容器。
编辑2:
所以我发现了为什么它那么大:日志记录。我的ID-json.log文件占用了630GB,查了文档https://docs.docker.com/config/containers/logging/json-file/希望能解决问题
你有没有描述里面的体积docker-compose.yml
?
它是 should be described 即使已经在外部创建:
version: "3.9"
# service description
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
# volume description
volumes:
myapp:
external: true
或
volumes:
pgdata:
external: true
你的情况
根据评论中的信息更新答案:
So apparently inside my /var/lib/docker-directory there is a subfolder with 125GB of disk space usage
/var/lib/docker/volumes
是 docker 个卷的默认路径。
看起来您的容器使用了不同的 pgdata
体积。也许你没有正确描述它(见我上面的回答)。根据提供的信息,这里很难猜测发生了什么。
如果确实正确描述了音量但仍然无法正常工作,我可能会推荐两种解决方法:
使用不带卷的直接装载:
volumes:
- /mnt/pgdata:/var/lib/postgresql/data
将第二个驱动器安装到 /var/lib/docker
以默认将所有 docker 数据存储在大磁盘上:
# stop docker
service docker stop
# unmount current folder
umount /mnt/pgdata
# rename old docker folder
mv /var/lib/docker /var/lib/docker_old
# create new folder
mkdir /var/lib/docker
# mount
mount /dev/sdb1 /var/lib/docker
# copy docker files to new position
cp -pr /var/lib/docker_old/* /var/lib/docker/
# check for hidden files starting from `.` if exists and copy it too
ls -la /var/lib/docker_old/
# remove old folder
rm -fr /var/lib/docker_old
# mount /dev/sdb1 to /var/lib/docker as permanent storage using /etc/fstab file
# start docoker and enjoy
service docker start
这是我的设置:
- 4 项服务:Worker、数据库 (Postgis)、Rest-API 和 Mapserver
- 1 个数据库卷
docker volume inspect pgdata
[
{
"CreatedAt": "0001-01-01T00:00:00Z",
"Driver": "local-persist",
"Labels": {},
"Mountpoint": "/mnt/pgdata",
"Name": "pgdata",
"Options": {
"mountpoint": "/mnt/pgdata"
},
"Scope": "local"
}
]
2 disks/partitions:
df -h
Filesystem Size Used Avail Use% Mounted on
udev 63G 0 63G 0% /dev
tmpfs 13G 856K 13G 1% /run
/dev/sda1 939G 10G 889G 2% /
tmpfs 63G 0 63G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 63G 0 63G 0% /sys/fs/cgroup
s3fs 16E 0 16E 0% /codede
tmpfs 13G 0 13G 0% /run/user/1000
/dev/sdb1 46T 24K 44T 1% /mnt/pgdata
如您所见,安装在 /mnt/pgdata 的分区有 44TB 存储空间,我希望存储在数据库中的所有数据都存储在那里,因为它会变得非常快。
但是当我开始向数据库中添加数据时,1TB 磁盘随后会被填满,我的系统将 fail/stop。
database:
image: DB_IMAGE
volumes:
- pgdata:/var/lib/postgresql/data
command: postgres -c 'max_connections=500'
ports:
- "6543:5432"
secrets:
- postgres-user
- postgres-password
environment:
POSTGRES_USER_FILE: /run/configs/postgres-user
POSTGRES_PASSWORD_FILE: /run/secrets/postgres-password
POSTGRES_DB: ts
deploy:
placement:
constraints: [node.role == manager]
workers 在节点上 运行,mapserver 和 Rest-API 预计对硬盘的影响非常小。 所以唯一影响存储的服务运行应该是数据库。
为什么它仍然会填满较小的磁盘space 而不是只填满大磁盘?
编辑:
显然我的容器在磁盘上仍然需要大量的 space。容器是 ts_database 容器。
编辑2: 所以我发现了为什么它那么大:日志记录。我的ID-json.log文件占用了630GB,查了文档https://docs.docker.com/config/containers/logging/json-file/希望能解决问题
你有没有描述里面的体积docker-compose.yml
?
它是 should be described 即使已经在外部创建:
version: "3.9"
# service description
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
# volume description
volumes:
myapp:
external: true
或
volumes:
pgdata:
external: true
你的情况
根据评论中的信息更新答案:
So apparently inside my /var/lib/docker-directory there is a subfolder with 125GB of disk space usage
/var/lib/docker/volumes
是 docker 个卷的默认路径。
看起来您的容器使用了不同的 pgdata
体积。也许你没有正确描述它(见我上面的回答)。根据提供的信息,这里很难猜测发生了什么。
如果确实正确描述了音量但仍然无法正常工作,我可能会推荐两种解决方法:
使用不带卷的直接装载:
volumes: - /mnt/pgdata:/var/lib/postgresql/data
将第二个驱动器安装到
/var/lib/docker
以默认将所有 docker 数据存储在大磁盘上:# stop docker service docker stop # unmount current folder umount /mnt/pgdata # rename old docker folder mv /var/lib/docker /var/lib/docker_old # create new folder mkdir /var/lib/docker # mount mount /dev/sdb1 /var/lib/docker # copy docker files to new position cp -pr /var/lib/docker_old/* /var/lib/docker/ # check for hidden files starting from `.` if exists and copy it too ls -la /var/lib/docker_old/ # remove old folder rm -fr /var/lib/docker_old # mount /dev/sdb1 to /var/lib/docker as permanent storage using /etc/fstab file # start docoker and enjoy service docker start