はじめに
Docker環境の運用をしていく過程でハマったポイントなどを紹介します。
Docker バージョン
- Docker version 23.0.2
Docker インストール
Ubuntu と CentOSの両方を記載しています。
インストールするパッケージの名前などが変わる可能性もあるので、必ず公式の手順を確認するようにしましょう。
Proxy環境下でのインストールを想定しています。
Ubuntu 20.04
Proxyのセット
環境変数としてセット。
export http_proxy="http://your-proxy-ip:your-proxy-port"
export HTTP_PROXY=${http_proxy}
export https_proxy=${http_proxy}
export HTTPS_PROXY=${http_proxy}
aptのProxy設定。
Acquire::http::Proxy "http://your-proxy-ip:your-proxy-port";
Acquire::https::Proxy "http://your-proxy-ip:your-proxy-port";
CurlのProxy設定。
proxy="http://your-proxy-ip:your-proxy-port"
Docker セットアップ
# Uninstall old versions
sudo apt-get remove docker docker-engine docker.io containerd runc
# Install using the apt repository
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Configure Docker to start on boot with systemd
sudo systemctl enable docker.service
sudo systemctl status docker.service
# Manage Docker as a non-root user
# ⇒ dockerコマンドをsudoなしで実行できるようになる(任意)
sudo usermod -aG docker $USER
# If you’re running Linux in a virtual machine,
# it may be necessary to restart the virtual machine for changes to take effect.
# ⇒ 仮想マシンの場合は再起動が必要になるケースがある。
sudo reboot
特定のバージョンを指定してインストールすることも可能。
# List the available versions:
apt-cache madison docker-ce | awk '{ print $3 }'
インストール可能なバージョン一覧が出力される。
5:20.10.16~3-0~ubuntu-jammy
5:20.10.15~3-0~ubuntu-jammy
5:20.10.14~3-0~ubuntu-jammy
5:20.10.13~3-0~ubuntu-jammy
以下のように特定のバージョンを指定してインストールする。
VERSION_STRING=5:20.10.13~3-0~ubuntu-jammy
sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
DockerのProxy設定
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
NO_PROXYの設定は環境に応じて適切なIPやドメインなどを入れると良い。(例ではexmaple.co.jpなどとしている)
[Service]
Environment="HTTP_PROXY=http://your-proxy-ip:your-proxy-port"
Environment="HTTPS_PROXY=http://your-proxy-ip:your-proxy-port"
Environment="NO_PROXY=localhost,.example.co.jp"
Dockerのリスタートをする。
sudo systemctl daemon-reload
sudo systemctl restart docker
CentOS 7
Proxyのセット
環境変数としてセット。
export http_proxy="http://your-proxy-ip:your-proxy-port"
export HTTP_PROXY=${http_proxy}
export https_proxy=${http_proxy}
export HTTPS_PROXY=${http_proxy}
yumのProxy設定。
proxy=http://your-proxy-ip:your-proxy-port
CurlのProxy設定。(不要かも)
proxy="http://your-proxy-ip:your-proxy-port"
Docker セットアップ
# Set up the repository
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# Install Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Start Docker
sudo systemctl start docker
# Configure Docker to start on boot with systemd
sudo systemctl enable docker.service
sudo systemctl status docker.service
# Manage Docker as a non-root user
# ⇒ dockerコマンドをsudoなしで実行できるようになる(任意)
sudo usermod -aG docker $USER
# If you’re running Linux in a virtual machine,
# it may be necessary to restart the virtual machine for changes to take effect.
# ⇒ 仮想マシンの場合は再起動が必要になるケースがある。
sudo reboot
特定のバージョンを指定してインストールすることも可能。
yum list docker-ce --showduplicates | sort -r
インストール可能なバージョン一覧が出力される。
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
以下のように特定のバージョンを指定してインストールする。
VERSION_STRING="18.09.1"
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
DockerのProxy設定
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
NO_PROXYの設定は環境に応じて適切なIPやドメインなどを入れると良い。(例ではexmaple.co.jpなどとしている)
[Service]
Environment="HTTP_PROXY=http://your-proxy-ip:your-proxy-port"
Environment="HTTPS_PROXY=http://your-proxy-ip:your-proxy-port"
Environment="NO_PROXY=localhost,.example.co.jp"
Dockerのリスタートをする。
sudo systemctl daemon-reload
sudo systemctl restart docker
必須 or あると嬉しい設定
insecure-registry(プライベートレジストリ(HTTP)の利用では必要)
レジストリのセキュリティを無視するように Docker を構成します。プライベートレジストリなどをHTTPで利用する場合、デフォルではDockerセキュリティ設定に引っかかり、イメージのPull/Pushができません。
HTTPのプライベートレジストリを利用するためには、/etc/docker/daemon.json
にinsecure-registry
の設定が必要です。ドメインは適宜読み替えてください。
{
"insecure-registries" : ["myregistrydomain.com:5000"]
}
default-address-pools
default-address-pools
はdockerがデフォルトで使用するネットワーク範囲を指定できる。この設定を入れることで、既存システムと重複しないサブネットでコンテナを起動することができる。既に存在しているネットワークとコンテナのネットワーク範囲が被るとトラブルが起きる可能性が高いので、必要に応じて変えておく必要がある。
/etc/docker/daemon.json
に設定が必要。設定例を以下に示す。
{
"default-address-pools":[
{"base":"172.18.0.0/16", "size":24}
]
}
コンテナのログ上限設定
下記引用に書かれている通り、デフォルトのままだとログが吐かれ続けると、Dockerホストのストレージが逼迫する可能性がある。実際、筆者が運用していた環境では大量のログが吐かれてストレージがパンクしかけてホストにログインできなくなるような事象が発生した。
コンテナのお作法として、アプリのログはstdoutへ出力することで、Dockerのロギング機能に任せることができる。
ただし、Dockerのデフォルトだとサイズ制限は無いので、上限設定を行っていないとホストのストレージを使い切ってしまうので注意。
引用:[Docker]コンテナ実行時にlog-optsでログサイズ上限とローテート数を設定してホストのストレージが溢れないようにする
/etc/docker/daemon.json
に設定が必要。設定例を以下に示す。
max-size
はログの上限サイズ、max-file
はログファイルの世代数を定義している。
{
"log-opts": {
"max-size": "1g",
"max-file": "5"
}
}
Docker リスタート
/etc/docker/daemon.json
を作成・編集したら、デーモンのリロードとDockerのリスタートが必要になるので、以下を実行する。これにより、上記insecure-registry、default-address-pools、ログの上限設定などが反映される。
sudo systemctl daemon-reload
sudo systemctl restart docker
まとめ
Docker 環境を構築する際にしておくと良い設定を紹介しました。
ログ上限の設定などは意外と盲点かと思うので、知っておくと不要なインシデントを回避できるかもしれません。