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

# はじめに

Docker環境の運用をしていく過程でハマったポイントなどを紹介します。

# Docker バージョン
- Docker version 23.0.2

# Docker インストール

Ubuntu と CentOSの両方を記載しています。

:::note
インストールするパッケージの名前などが変わる可能性もあるので、必ず公式の手順を確認するようにしましょう。
:::

:::note
Proxy環境下でのインストールを想定しています。
:::

## Ubuntu 20.04

- [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
- [Linux post-installation steps for Docker Eng](https://docs.docker.com/engine/install/linux-postinstall/)

### Proxyのセット
環境変数としてセット。
```bash
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設定。
```conf:/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設定。
```bash:~/.curlrc
proxy="http://your-proxy-ip:your-proxy-port"
```

### Docker セットアップ
```bash
# 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
```

:::note
***特定のバージョンを指定してインストールすることも可能。***
```bash
# 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などとしている）
```conf:/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のリスタートをする。

```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```

## CentOS 7

- [Install Docker Engine on CentOS](https://docs.docker.com/engine/install/centos/)
- [Linux post-installation steps for Docker Eng](https://docs.docker.com/engine/install/linux-postinstall/)

### Proxyのセット
環境変数としてセット。
```bash
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設定。
```conf:/etc/yum.conf
proxy=http://your-proxy-ip:your-proxy-port
```
CurlのProxy設定。（不要かも）
```bash:~/.curlrc
proxy="http://your-proxy-ip:your-proxy-port"
```

### Docker セットアップ
```bash
# 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
```

:::note
***特定のバージョンを指定してインストールすることも可能。***
```bash
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などとしている）
```conf:/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のリスタートをする。

```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
# 必須 or あると嬉しい設定

## insecure-registry（プライベートレジストリ（HTTP）の利用では必要）

- [Deploy a plain HTTP registry](https://docs.docker.com/registry/insecure/#deploy-a-plain-http-registry)

レジストリのセキュリティを無視するように Docker を構成します。プライベートレジストリなどをHTTPで利用する場合、デフォルではDockerセキュリティ設定に引っかかり、イメージのPull/Pushができません。

HTTPのプライベートレジストリを利用するためには、`/etc/docker/daemon.json`に`insecure-registry`の設定が必要です。ドメインは適宜読み替えてください。

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

## default-address-pools

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

`/etc/docker/daemon.json`に設定が必要。設定例を以下に示す。
```json:/etc/docker/daemon.json
{
   "default-address-pools":[
        {"base":"172.18.0.0/16", "size":24}
   ]
}
```

## コンテナのログ上限設定

下記引用に書かれている通り、デフォルトのままだとログが吐かれ続けると、Dockerホストのストレージが逼迫する可能性がある。実際、筆者が運用していた環境では大量のログが吐かれてストレージがパンクしかけてホストにログインできなくなるような事象が発生した。

>コンテナのお作法として、アプリのログはstdoutへ出力することで、Dockerのロギング機能に任せることができる。
ただし、Dockerのデフォルトだとサイズ制限は無いので、上限設定を行っていないとホストのストレージを使い切ってしまうので注意。
引用：[[Docker]コンテナ実行時にlog-optsでログサイズ上限とローテート数を設定してホストのストレージが溢れないようにする](https://zaki-hmkc.hatenablog.com/entry/2020/09/09/211117)


`/etc/docker/daemon.json`に設定が必要。設定例を以下に示す。
`max-size`はログの上限サイズ、`max-file`はログファイルの世代数を定義している。

```json:/etc/docker/daemon.json
{
  "log-opts": {
    "max-size": "1g",
    "max-file": "5"
  }
}
```

## Docker リスタート

`/etc/docker/daemon.json`を作成・編集したら、デーモンのリロードとDockerのリスタートが必要になるので、以下を実行する。これにより、上記insecure-registry、default-address-pools、ログの上限設定などが反映される。

```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```

# まとめ

Docker 環境を構築する際にしておくと良い設定を紹介しました。
ログ上限の設定などは意外と盲点かと思うので、知っておくと不要なインシデントを回避できるかもしれません。