[Raspberry Pi] ラズパイの/var/logをRamdisk にして安心していたらDockerのログがSDカード側に書かれていた件について

Docker

SDカードの寿命を伸ばすために /var/log は Ramdisk に置くように設定しました。ですが、Dockerのログは /var/lib/docker/containers に出力されるので、ぜんぜん対策になっていなかったという当たり前の話。

試した環境

Raspberry Pi 4 (8GB RAM)
Ubuntu 20.10 64bit

$ cat /etc/fstab
LABEL=writable / ext4 defaults 0 0
LABEL=system-boot /boot/firmware vfat defaults 0 1
tmpfs /tmp tmpfs defaults,size=128m 0 0
tmpfs /var/tmp tmpfs defaults,size=128m 0 0
tmpfs /var/log tmpfs defaults,size=64m 0 0

対処内容

Dockerのロギング・ドライバの設定を変更します。詳しくは公式サイトを確認しましょう。
参考:ロギング・ドライバの設定

設定方法は、Dockerデーモンのデフォルトを変更する方法(/etc/docker/daemon.jsonに書き込む方法)と、各コンテナごとに、ロギング・ドライバの設定をする方法があります。

自分のDocker環境では、docker-compose を使って、Wordpressとメールサーバを動しているだけなので、各コンテナ毎(docker-compose.yml)に設定を行う方法をとりました。

現在動いているDockerデーモンのロギング・ドライバの設定を確認するには、下記のコマンドを実行します。

$ docker info --format '{{.LoggingDriver}}'
json-file

デフォルトは、json-file形式での出力となっていて、/var/lib/docker/containers/[container_id] の下にログが出力されています。運用に必要なログは、ホストの/var/logに出力するようにしているので、ロギング・ドライバには none を設定し、出力を止めてしまいます。

設定例

メールサーバの設定。赤字の部分が今回追記したところ。

version: '3'

services:
  mailserver:
    image: docker.io/mailserver/docker-mailserver:latest
    hostname: ${HOSTNAME}
    domainname: ${DOMAINNAME}
    container_name: ${CONTAINER_NAME}
    env_file: mailserver.env
    ports:
      - "25:25"
      - "143:143"
      - "587:587"
      - "993:993"
    volumes:
      - maildata:/var/mail
      - mailstate:/var/mail-state
      - /var/log/mailserver/mail:/var/log/mail/
      - /var/log/mailserver/supervisor/:/var/log/supervisor/
      # - maillogs:/var/log/mail
      - ./config/:/tmp/docker-mailserver/
      - /etc/letsencrypt/:/etc/letsencrypt/
    cap_add: [ "NET_ADMIN", "SYS_PTRACE" ]
    restart: always
<strong><span class="bold-red">    logging:
      driver: none</span></strong>

volumes:
  maildata:
  mailstate:
  #  maillogs:

WordPressの設定。同じく赤字の部分を追記。

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
<span class="bold-red">    logging:
      driver: none</span>
    ports:
      - 127.0.0.1:8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wp
    volumes:
      - ./html:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini
    depends_on:
      - db

  db:
    image: mysql/mysql-server:latest
    # image: mysql:5.7
    restart: always
<span class="bold-red">    logging:
      driver: none
</span>    environment:
#      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      MYSQL_DATABASE: wp
    volumes:
      - db:/var/lib/mysql

volumes:
  db:

データは永続化されているので、 docker-compose down/up をしてコンテナを構築、ログング・ドライバの設定を反映します。下記のコマンドで、コンテナ毎のロギング・ドライバの設定値を確認できます。

$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' fc4503182c41
none

none になっていれば設定完了です。

わし
わし

SDカードはケアしてないと1年ぐらいで壊れてしまうので、細かいコトだけどラズパイサーバにとっては大事な設定です。

わし
わし

ログがRAMDISKにのっていなかったり、マッピングしたポートはファイアウォールの設定を無視して外部に公開されてしまったり、Docker関連での運用ミスが続いております。

コメント