🐳
3年前に使っていたDocker ComposeとLinuxサービスファイルの備忘録
✅ はじめに
本記事では、3年前の開発環境で実際に使用していた Docker Compose 設定と、
Linux上でコンテナを自動起動する systemd のサービス定義を備忘録として残します。
使用目的は、SQL Server(MSSQL)コンテナを構成し、定期的に稼働させる開発用途です。
- OS:Ubuntu 20.04 LTS
- Docker:20.x 系(Docker Compose CLI)
- コンテナ:SQL Server 2022 on Linux(Microsoft公式)
✅ ディレクトリ構成(例)
project-root/
├── docker-compose.yml
├── .env
└── container-sqlserver.service
✅ .envファイル(Docker Compose用)
Docker Composeに渡す環境変数群です。パスワードや構成パラメータを分離管理していました。
以下の内容は当時(3年前)の設定です。
必要に応じて、現在のバージョンや環境に合わせて読み替えてください。
# Dockerイメージとタグ
REPOSITORY_DB=mcr.microsoft.com/mssql/server
TAG_DB=2022-RTM-CU2-ubuntu-20.04
# コンテナ名とポート設定
NAME_DB=sqlserver2022
IN_PORT_DB=1433
EX_PORT_DB=1433
# データパスとDB構成
DATA_DIR_APP=/datadrive/data/mssql
ENV_DB_SA_PASSWORD=yourStrong(!)Password
# タイムゾーンの設定
ENV_DB_TZ=Asia/Tokyo
# SQL Serverエディションの指定(以下から選択)
# {Developer|Express|Standard|Enterprise|EnterpriseCore}
ENV_DB_MSSQL_PID=Developer
# 言語ID(LCID)の指定:1041=日本語
ENV_DB_MSSQL_LCID=1041
# 照合順序(COLLATION)
ENV_DB_MSSQL_COLLATION=Japanese_BIN
# メモリ制限(MB単位)
ENV_DB_MSSQL_MEMORY_LIMIT_MB=2048
# SQL Server Agent有効化設定:{true|false}
ENV_DB_MSSQL_AGENT_ENABLED=false
# ログ設定
LOG_DRIVER=json-file
LOG_MAX_SIZE=10
LOG_MAX_FILE=1
☑️
.env
ファイルには機微情報(例:パスワード)が含まれるため、
バージョン管理では除外すべきです。
✅ docker-compose.yml(SQL Server構成)
version: "3.9"
services:
db:
container_name: ${NAME_DB}
image: "${REPOSITORY_DB}:${TAG_DB}"
ports:
- "${EX_PORT_DB}:${IN_PORT_DB}"
environment:
ACCEPT_EULA: "Y"
MSSQL_SA_PASSWORD: ${ENV_DB_SA_PASSWORD}
TZ: ${ENV_DB_TZ}
MSSQL_PID: ${ENV_DB_MSSQL_PID}
MSSQL_LCID: ${ENV_DB_MSSQL_LCID}
MSSQL_COLLATION: ${ENV_DB_MSSQL_COLLATION}
MSSQL_MEMORY_LIMIT_MB: ${ENV_DB_MSSQL_MEMORY_LIMIT_MB}
MSSQL_AGENT_ENABLED: ${ENV_DB_MSSQL_AGENT_ENABLED}
volumes:
- ${DATA_DIR_APP}:/var/opt/mssql
logging:
driver: ${LOG_DRIVER}
options:
max-size: "${LOG_MAX_SIZE}m"
max-file: "${LOG_MAX_FILE}"
✅ 補足
-
restart:
は記述していません。
systemdでコンテナを管理しているため、Compose側の再起動ポリシーは不要です。 -
logging.options
ではログの肥大化を防ぐため、最大サイズと履歴数を制限しています。
✅ systemdサービスファイル(自動起動設定)
Linuxの systemctl
により、docker-compose up
をバックグラウンドで実行します。
[Unit]
Description=SQL Server container using Docker Compose
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/docker/sqlserver/
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
[Install]
WantedBy=multi-user.target
systemctl link
を使う場合)
🧩 初期登録・起動の手順(# ① systemdリンクを貼る(.serviceファイルを/etcにコピーせず登録)
sudo systemctl link /opt/docker/sqlserver/container-sqlserver.service
# ② サービスを有効にする
sudo systemctl enable /opt/docker/sqlserver/container-sqlserver.service
# ③ サービスを起動する
sudo systemctl start container-sqlserver.service
📝 補足:Ubuntuバージョンに関する注意
-
systemctl link
は、.service
ファイルを /etc/systemd/system にコピーせずに systemd に認識させる方法です。 - Ubuntu 16.04 以降(systemd 採用以降)であれば基本的に使用可能とされていますが、環境やカスタム設定によって動作に差異がある場合があります。
- 一部の環境では
link
が期待通り動作せず、明示的なコピー(下記)を選択する方が確実な場合もあります。
🧭 従来の登録方法
(ファイルを /etc/systemd/system/
にコピー)
sudo cp container-sqlserver.service /etc/systemd/system/
sudo systemctl daemon-reload # ユニットファイル変更後に必要
sudo systemctl enable container-sqlserver.service
sudo systemctl start container-sqlserver.service
☑️ 確実性を重視する場合は、従来の「コピー方式」が推奨されます。
✅ まとめと教訓
-
.env
による構成管理で再利用性と可搬性を向上 -
docker-compose.yml
ではlogging.options
を明示し、ログ肥大化を予防 -
restart:
記述は systemd 管理下では不要 - systemd に登録することで、OS再起動後もコンテナ環境を復元
Discussion