Amazon Linux 2023 ARM64 EC2にDockerとDocker Composeをインストールする過程を示す代表画像

概要

Amazon Linux 2023ベースのEC2でDockerとDocker Composeを動作させるための最小限のインストール手順をまとめます。

パッケージのインストール

dnfはRHEL系(例:Fedora、RHEL、Amazon Linux 2023)で使用されるパッケージマネージャーです。

Ubuntu/Debianのapt-getやCentOSのyumと同じ役割を果たします。

リポジトリからパッケージをダウンロードしてインストールし、依存関係を自動的に処理します。

パッケージの更新

1sudo dnf update -y

Dockerのインストール

1sudo dnf install -y docker

基本設定

Dockerサービスの有効化

Dockerデーモン(dockerd)が実際に実行されていないと、dockerコマンドは動作しません。

enable --now今すぐ起動し、再起動後も自動起動するように登録します。

1sudo systemctl enable --now docker

現在のユーザーにDocker権限を付与

デフォルトでは、Dockerソケット(/var/run/docker.sock)にはroot権限が必要です。

dockerグループにユーザーを追加すると、毎回sudoを付けなくてもDockerを使用できます。

newgrp docker現在のセッションにグループ変更を即座に反映するためのコマンドです。

ログアウト後に再ログインしても同様に適用されます。

1sudo usermod -aG docker $USER
2newgrp docker

Dockerの動作確認

1docker version

Amazon Linux 2023環境では、Dockerのインストールだけでdocker composeが一緒に提供される場合があります。

1docker compose version

Docker Composeを別途インストールする必要がある場合

docker compose versionが失敗した場合は、以下の方法でCLIプラグインをインストールします。

ディレクトリの作成

1mkdir -p ~/.docker/cli-plugins

インストール:ARM64(aarch64)

1curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-aarch64 \
2	-o ~/.docker/cli-plugins/docker-compose

x86_64の場合

1curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 \
2	-o ~/.docker/cli-plugins/docker-compose

実行権限の追加

1chmod +x ~/.docker/cli-plugins/docker-compose

Docker Composeのインストール確認

1docker compose version

よくある問題

permission denied while trying to connect to the Docker daemon socket

usermod -aG dockerは実行したものの、現在のシェルにグループが反映されていない状態です。

1# 現在のシェルが認識しているグループを確認
2id -nG

リストにdockerがなければ、newgrp dockerで現在のシェルに反映します。newgrpはそのシェルにのみ適用されるため、新しくSSHセッションを開くか、ログアウト後に再接続すれば以降は自動的に適用されます。

no matching manifest for linux/arm64/v8

ARM64インスタンスでamd64専用イメージを実行したときに発生します。A1やGraviton系でよく遭遇します。

まず、そのイメージがarm64に対応しているか確認します。

1docker manifest inspect {イメージ名} | grep architecture

選択肢は3つあります。

  • arm64に対応したタグを使用する。ほとんどの公式イメージはマルチアーキテクチャに対応しています。
  • docker buildxで自分でマルチアーキテクチャイメージをビルドする。
  • --platform linux/amd64でエミュレーション実行する。QEMUエミュレーションが必要でパフォーマンス低下が大きいため、一時的な対処としてのみ使用します。

再起動後にコンテナが起動しない

systemctl enable --now dockerはDockerデーモンのみを自動起動します。コンテナには別途再起動ポリシーを指定する必要があります。

1docker run -d --restart unless-stopped {イメージ名}

Composeを使う場合は、サービスにrestart: unless-stoppedを指定します。

運用前に整理しておくとよいこと

コンテナログ容量の制限

デフォルトのjson-fileドライバーは、ログを無制限に蓄積します。これはEC2のディスクが一杯になるよくある原因です。

1# /etc/docker/daemon.json
2{
3  "log-driver": "json-file",
4  "log-opts": {
5    "max-size": "10m",
6    "max-file": "3"
7  }
8}

設定後、デーモンを再起動します。すでに実行中のコンテナには適用されないため、再作成する必要があります。

1sudo systemctl restart docker

Docker Composeのバージョン固定

先ほど使用したreleases/latestのアドレスは、ダウンロードする時点によって異なるバージョンを取得します。再現可能な環境が必要な場合は、バージョンを固定します。

1# リリースページで確認したバージョンを指定します
2COMPOSE_VERSION={使用するバージョン}
3
4curl -SL https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-aarch64 \
5	-o ~/.docker/cli-plugins/docker-compose
6
7chmod +x ~/.docker/cli-plugins/docker-compose
8docker compose version

ディスクの整理

1# 使用量の確認
2docker system df
3
4# 未使用リソースの整理
5docker system prune
6
7# 未使用イメージまで整理
8docker system prune -a

prune -aは、実行中でないコンテナが参照しているイメージまで削除します。運用サーバーでは、削除対象を確認してから実行してください。

参考