2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Dockerでしておいた方が良い設定Tips

Last updated at Posted at 2023-04-17

はじめに

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設定。

/etc/apt/apt.conf.d/apt.conf
Acquire::http::Proxy "http://your-proxy-ip:your-proxy-port";
Acquire::https::Proxy "http://your-proxy-ip:your-proxy-port";

CurlのProxy設定。

~/.curlrc
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などとしている)

/etc/systemd/system/docker.service.d/http-proxy.conf
[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設定。

/etc/yum.conf
proxy=http://your-proxy-ip:your-proxy-port

CurlのProxy設定。(不要かも)

~/.curlrc
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などとしている)

/etc/systemd/system/docker.service.d/http-proxy.conf
[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.jsoninsecure-registryの設定が必要です。ドメインは適宜読み替えてください。

/etc/docker/daemon.json
{
  "insecure-registries" : ["myregistrydomain.com:5000"]
}

default-address-pools

default-address-poolsはdockerがデフォルトで使用するネットワーク範囲を指定できる。この設定を入れることで、既存システムと重複しないサブネットでコンテナを起動することができる。既に存在しているネットワークとコンテナのネットワーク範囲が被るとトラブルが起きる可能性が高いので、必要に応じて変えておく必要がある。

/etc/docker/daemon.jsonに設定が必要。設定例を以下に示す。

/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はログファイルの世代数を定義している。

/etc/docker/daemon.json
{
  "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 環境を構築する際にしておくと良い設定を紹介しました。
ログ上限の設定などは意外と盲点かと思うので、知っておくと不要なインシデントを回避できるかもしれません。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?