Closed8

できるだけ公式ドキュメントに沿って Amazon Linux 2 に Docker / Docker Compose をインストールする

まちゅけんまちゅけん

Docker (Docker Engine) を Ubuntu や Debian, Centos, Feodra などの Linux ディストリビューションにインストールするには、Docker 公式ドキュメントのインストール手順[1]を参照すればパッケージマネージャーを介して容易に行える。

しかし、クラウドの Amazon EC2 で利用できる Linux ディストリビューションである Amazon Linux 2 へのインストールについては Docker のドキュメント内で説明がされていない。
検索する所によると[2] sudo yum install docker だけでインストールできるようだが、このスクラップでは一次情報からまとめることで他の Linux ディストリビューションとの違いを理解して Amazon Linux 2 に Docker をインストールする。

また、マルチコンテナーを用いる為によく利用される Docker プラグインである Docker Compose のインストールについても併せて記載する。

脚注
  1. https://docs.docker.com/engine/install/ ↩︎

  2. https://www.google.co.jp/search?q=amazon+linux+2+docker ↩︎

まちゅけんまちゅけん

公式ドキュメント

AWS のドキュメントを漁ったところ、Amazon Linux 2 への Docker のインストール手順を説明は、Amazon Linux 2 の実行基盤である Amazon EC2 のドキュメントではなく、コンテナ管理サービスである Amazon ESC の方のドキュメントに存在している。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-container-image.html#create-container-image-install-docker

  1. 最新の Docker Engine パッケージをインストールします。
sudo amazon-linux-extras install docker

このコマンドで Docker がインストールできる。
インストールするだけならこれに従うだけで十分なので、検索して出てくる情報の sudo yum install docker と公式ドキュメントの sudo amazon-linux-extras install docker の違いは何なのか理解していく。

amazon-linux-extras について

まず amazon-linux-extras コマンドとは何なのか、というと Amazon EC2 のドキュメントに説明がある。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html#extras-library

Amazon Linux 2 では、Extras Library を使用してアプリケーションおよびソフトウェア更新をインスタンスにインストールできます。このようなソフトウェア更新は、トピックと呼ばれます。特定のバージョンのトピックをインストールしたり、最新バージョンを使用するためにバージョン情報を省略したりすることができます。

実際に amazon-linux-extras list と打って、Extras Library のトピック一覧を表示してみる。

[ec2-user ~]$ amazon-linux-extras list
…
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]

確かに docker というトピックがあり、しかもこれはインスタンス起動直後何も変更していない状態だが一覧の中 docker トピックは enabledになっており、他の殆どは available になっている。

状態が enabled になっている為なのか yum search dockeryum list | grep docker をしてみると、docker パッケージがヒットする。

[ec2-user ~]$ yum search docker
…
docker.x86_64 : Automates deployment of containerized applications
…
[ec2-user ~]$ yum list | grep docker
…
docker.x86_64                          20.10.13-2.amzn2               amzn2extra-docker
…

sudo yum install docker でもインストール可能のようだ。(この場合は N でキャンセルした)

[ec2-user ~]$ sudo yum install docker========================================================================================================================
 Package                  Arch                 Version                            Repository                       Size
========================================================================================================================
Installing:
 docker                   x86_64               20.10.13-2.amzn2                   amzn2extra-docker                40 M
Installing for dependencies:
 containerd               x86_64               1.4.13-2.amzn2.0.1                 amzn2extra-docker                23 M
 libcgroup                x86_64               0.41-21.amzn2                      amzn2-core                       66 k
 pigz                     x86_64               2.3.4-1.amzn2.0.1                  amzn2-core                       81 k
 runc                     x86_64               1.0.3-2.amzn2                      amzn2extra-docker               3.0 M

Transaction Summary
========================================================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 67 M
Installed size: 280 M
Is this ok [y/d/N]:

では sudo amazon-linux-extras install dockersudo yum install docker どちらを使えばいいのだろうか?
試しに sudo amazon-linux-extras disable docker で状態を available にし sudo yum install docker すると、enabled でない為 amazon-linux-extras install コマンドからインストールするよう促されるようになる。

[ec2-user ~]$ sudo amazon-linux-extras disable docker20  docker                   available    \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ][ec2-user ~]$ sudo yum install docker
…
No package docker available.
Error: Nothing to do


docker is available in Amazon Linux Extra topic "docker"

To use, run
# sudo amazon-linux-extras install docker

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras

従って、デフォルトで Extras library の docker トピックは enabled になっている為に sudo yum install docker でインストール可能のようではあるが、sudo amazon-linux-extras install docker コマンドであれば「docker トピックを enabled にして docker パッケージをインストール」してくれるので、先の Amazon ECS のドキュメントにあるようにこちらのコマンドを使うのが確実だろう。

まちゅけんまちゅけん

Docker 公式ドキュメントにあるインストール方法との違いについて

CentOS の Docker インストール手順[1]では yum-config-manager --add-repo してから yum install している。
これは Docker が管理しているリポジトリを CentOS の Yum パッケージマネージャーに追加してインストールしており、APT 系ディストリビューションについても同様に Docker のリポジトリを追加してインストールしている。

これに対して Amazon Linux 2 では Extras Library を有効にしてインストールしているので、Amazon が管理しているリポジトリから Docker をインストールしているといった違いがある。

脚注
  1. https://docs.docker.com/engine/install/centos/#install-using-the-repository ↩︎

まちゅけんまちゅけん

インストール手順まとめ

Amazon ECS ドキュメント[1]より

  1. パッケージの更新

インスタンスでインストールされているパッケージとパッケージキャッシュを更新します。

sudo yum update -y
  1. Docker Engine のインストール

最新の Docker Engine パッケージをインストールします。

sudo amazon-linux-extras install docker

Docker ドキュメント[2]より

  1. Docker を起動

Start Docker.

sudo systemctl start docker
  1. hello-world イメージを実行して、Docker Engine が正しくインストールされていることの確認

Verify that Docker Engine is installed correctly by running the hello-world image.

sudo docker run hello-world

(オプション) Docker ドキュメント[3]より

  1. sudo なしで実行できるように docker グループに追加

Add your user to the docker group.

sudo usermod -aG docker $USER
脚注
  1. https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-container-image.html#create-container-image-install-docker ↩︎

  2. https://docs.docker.com/engine/install/centos/#install-using-the-repository ↩︎

  3. https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user ↩︎

まちゅけんまちゅけん

docker コマンドの Tab 入力補完が効かない

このスクラップで紹介した手順 Amazon Linux 2 に Docker をインストールできたが、docker コマンドの Tab 入力補完が効かない。

Docker の公式ドキュメントに沿ってインストールした Feodra では、docker と入力したあとに Tab キーを押下すると以下のようにサブコマンドを表示してくれる。

Fedora
[fedora ~]$ docker
attach     context    export     info       logs       port       rm         service    system     version
build      cp         help       inspect    manifest   ps         rmi        stack      tag        volume
builder    create     history    kill       network    pull       run        start      top        wait
commit     diff       image      load       node       push       save       stats      trust
config     events     images     login      pause      rename     search     stop       unpause
container  exec       import     logout     plugin     restart    secret     swarm      update

Amazon Linux 2 ではそれが効いていないので、カレントディレクトリの内容が表示されてしまう。

Amazon Linux 2
[ec2-user ~]$ docker .
./             ../            .bash_logout   .bash_profile  .bashrc        .cache/        .ssh/

この機能は bash-completion パッケージによるものだが、Amazon Linux 2にはデフォルトでインストールされている。

Amazon Linux 2
[ec2-user ~]$ yum list installed | grep bash-completion
bash-completion.noarch                1:2.1-6.amzn2                    installed

なぜ入力補完が効かないのか、Fedora 環境と比べて原因を調査してみる。

/etc/bash_completion.d/

定石としては、OSS では bash-completion を作用させる為に /etc/bash_completion.d/ にファイルを格納する指示がよくあるのでそのディレクトリの中を調べてみた。

Feodra
[fedora ~]$ ls /etc/bash_completion.d/
redefine_filedir

関係ないパッケージのファイルしかなかった。
恐らく別の場所にインストールされているはずである。

/usr/share/bash-completion

rpm -q --list コマンドを使うとそのパッケージでインストールしたファイルの一覧を取得できるので、どのファイルが bash-completion に作用しているか調べる。

Fedora
[fedora ~]$ rpm -q --list docker-ce-cli | grep bash
/usr/share/bash-completion/completions/docker

/usr/share/bash-completion/completions/dockerbash-completion 用とみられるファイルが格納されている。
検索すると、GitHub リポジトリの https://github.com/docker/cli/blob/master/contrib/completion/bash/docker と同一のファイルのようである。
ドキュメントに入力補完に関する説明はないが、これが作用しているファイルだと状況証拠から断定できる。

Amazon Linux 2 側でも同様に調べてみる。

Amazon Linux 2
[ec2-user ~]$ rpm -q --list docker | grep bash
/usr/share/bash-completion/docker
  • 中身は同様のファイル
  • パスが bash-completion/completions/ の中にあるのか、bash-completion/ 直下にあるのかの違いがある

bash-completion/ 直下にあるのは Amazon Linux 2 の間違いではないだろうか?
bash-completion/completions/ にシンボリックリンクを貼ってみる。

Amazon Linux 2
[ec2-user ~]$ sudo ln -sf /usr/share/bash-completion/docker /usr/share/bash-completion/completions/docker

入力補完が効くようになった。

Amazon Linux 2
[ec2-user ~]$ docker
attach     context    export     info       logs       port       rm         service    system     version
build      cp         help       inspect    manifest   ps         rmi        stack      tag        volume
builder    create     history    kill       network    pull       run        start      top        wait
commit     diff       image      load       node       push       save       stats      trust
config     events     images     login      pause      rename     search     stop       unpause
container  exec       import     logout     plugin     restart    secret     swarm      update
まちゅけんまちゅけん

Docker Compose

Amazon Linux 2 に Docker (Docker Engine) をインストールしたが、マルチコンテナーを用いる為のプラグインツール Docker Compose はインストールされてないので、別途インストールが要る。

検索する所に、他の Linux ディストリビューションでも別途インストールが要るという情報があるが、最新の Docker ドキュメントの手順[1]でインストールすると docker-compose-plugin パッケージもインストールしている。
Docker ドキュメントにある Linux ディストリビューションについては、別の手順を踏まずに利用可能のようである。

docker-compose-plugin パッケージ

しかしこの docker-compose-plugin パッケージは docker のサブコマンドとしてプラグイン化された docker compose コマンドである。
よく見かける docker-compose コマンドではない。
Docker Compose は元々 docker-compose コマンドとしてバイナリとして配布されていたようだが、Docker Compose V2 からは CLI のプラグインとして docker compose で利用できるようになっている[2]ようだ。

Fedora
[fedora ~]$ docker compose version
Docker Compose version v2.3.3

docker-compose コマンドの方がよく見かけるが、ソフトウェアの観点として最新バージョンを使う方が好ましいので、Docker Compose V2 のインストールを進める。

Amazon Linux 2 の場合

Amazon Linux 2 の場合は Extras Library リポジトリにも Docker Compose をインストールするパッケージはないので、これについては Compose ドキュメントのインストール手順の Linux Standalone binary -> Install the binary manually に沿って行う。

https://docs.docker.com/compose/install/#install-compose

Run this command to download the current stable release of Docker Compose:

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux->x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose

This command installs Compose for the active user under $HOME directory. To install Docker Compose for all users on your system, replace ~/.docker/cli-plugins with /usr/local/lib/docker/cli-plugins.

GitHub リリースからバイナリをダウンロードしてきて、所定の cli-plugins/ にバイナリを格納するといった手順になっている。
インストールコマンド例は単一ユーザー向けとなっていて、システムワイドに適用するにはバイナリは /usr/local/lib/docker/cli-plugins に格納しろと書いてる。

しかし、そんなものはなかった。

Amazon Linux 2
[ec2-user ~]$ ls /usr/local/lib/docker/cli-plugins
ls: cannot access /usr/local/lib/docker/cli-plugins: No such file or directory
[ec2-user ~]$ ls /usr/local/lib/docker
ls: cannot access /usr/local/lib/docker: No such file or directory

Compose ドキュメントではなく GitHub リポジトリの README を確認してみる。

https://github.com/docker/compose#linux

Or copy it into one of these folders for installing it system-wide:

  • /usr/local/lib/docker/cli-plugins OR /usr/local/libexec/docker/cli-plugins
  • /usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins

こちらには4か所候補が書かれている。
Amazon Linux 2 どこに cli-plugins ディレクトリがあるのか確認する。

Amazon Linux 2
[ec2-user ~]$ rpm -q --list docker | grep cli-plugins
/usr/libexec/docker/cli-plugins
/usr/libexec/docker/cli-plugins/buildx

/usr/libexec/docker/cli-plugins が当たりのようだ。
では、リリースページ[3]から最新バージョンの docker-compose-linux-x86_64 バイナリをダウンロードしてそちらに格納する。

Amazon Linux2
[ec2-user ~]$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/libexec/docker/cli-plugins/docker-compose
[ec2-user ~]$ sudo chmod +x /usr/libexec/docker/cli-plugins/docker-compose
[ec2-user ~]$ docker compose version
Docker Compose version v2.5.0

Docker Compose も利用できるようになった。

脚注
  1. https://docs.docker.com/engine/install/centos/#install-docker-engine ↩︎

  2. https://docs.docker.com/compose/#compose-v2-and-the-new-docker-compose-command ↩︎

  3. https://github.com/docker/compose/releases ↩︎

まちゅけんまちゅけん

docker compose コマンドも Tab 入力補完が効かない

残念ながら、docker compose コマンドも Tab 入力補完が効かない。

Amazon Linux 2
[ec2-user ~]$ docker compose [TAB…]

Issues

Issues を漁ってみると、 Docker Compose V2 は入力補完が対応していないようである。

https://github.com/docker/compose/issues/8550

Compose ドキュメント

Compose ドキュメントの CLI リファレンスには入力補完の説明がある。

https://docs.docker.com/compose/completion/

Place the completion script in /etc/bash_completion.d/.

sudo curl \
    -L https://raw.githubusercontent.com/docker/compose/v2.5.0/contrib/completion/bash/docker-compose \
    -o /etc/bash_completion.d/docker-compose

しかしcurl するファイル https://raw.githubusercontent.com/docker/compose/v2.5.0/contrib/completion/bash/docker-compose は...

404: Not Found

404になっていて、ドキュメントの説明が成立していない。
contrib/completion/bash/docker-compose は Compose V2 になった時点でファイルツリーにない。

https://github.com/docker/compose/tree/v2.0.0

つまりは、V2 はまだ入力補完に対応してないということであろうか。

まちゅけんまちゅけん

docker-compose のインストールと入力補完の有効化

インストール

Compose ドキュメントは既に V2 のインストール方法に置き換わっている。
Compose の GitHub リポジトリの 1.29.2 版 README では殆ど説明がない。

Docker ドキュメントの GitHub リポジトリは docker/docker.github.io のようなので、説明が置き換わる PR[1] を調べて、その 1 つ前の PR[2] マージ時点での compose/install.md を参照する。

https://github.com/docker/docker.github.io/blob/832a1397328ec9f904e60c31a30f3a711b355ac2/compose/install.md#install-compose-on-linux-systems

Run this command to download the current stable release of Docker Compose:

$ sudo curl -L "https://github.com/docker/compose/releases/download/{{site.compose_version}}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

単純にバイナリを /usr/local/bin/docker-compos に格納するだけのようだ。

Amazon Linux 2
[ec2-user ~]$ sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
[ec2-user ~]$ sudo chmod +x /usr/local/bin/docker-compose
[ec2-user ~]$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

docker-compose コマンドをインストールできた。

入力補完の有効化

上記と同じ時点の compose/completion.md だが

https://github.com/docker/docker.github.io/blob/832a1397328ec9f904e60c31a30f3a711b355ac2/compose/completion.md#linux

Place the completion script in /etc/bash_completion.d/.

$ sudo curl \
    -L https://raw.githubusercontent.com/docker/compose/{{site.compose_version}}/contrib/completion/bash/docker-compose \
    -o /etc/bash_completion.d/docker-compose

現状の整合の取れていないドキュメント[3]と変わりないので、バージョンを 1.29.2 に変更だけして手順を実施する。

Amazon Linux 2
[ec2-user ~]$ sudo curl \
    -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \
    -o /etc/bash_completion.d/docker-compose

bash を再起動して

Amazon Linux 2
[ec2-user ~]$ docker-compose
build    create   events   help     kill     pause    ps       push     rm       scale    stop     unpause  version
config   down     exec     images   logs     port     pull     restart  run      start    top      up

docker-compose コマンドは TAB 入力補完を有効にできた。

まとめ

ここまでを全て行うと docker composedocker-compose がインストールされている状態だが、それぞれ独立しているのでどちらも利用できる。

Amazon Linux 2
[ec2-user ~]$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
[ec2-user ~]$ docker compose version
Docker Compose version v2.5.0

まとめると

  • docker compose は推奨される最新版で通常の Linux ディストリビューションなら同時にインストールされるが、まだ現状入力補完が利用できない
  • docker-compose はよく見かけるコマンドで入力補完が利用できるが、このバージョンは将来的には非推奨となるとみられる
脚注
  1. https://github.com/docker/docker.github.io/pull/14614 ↩︎

  2. https://github.com/docker/docker.github.io/pull/14602 ↩︎

  3. https://docs.docker.com/compose/completion/ ↩︎

このスクラップは2022/05/06にクローズされました