できるだけ公式ドキュメントに沿って 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 のインストールについても併せて記載する。
公式ドキュメント
AWS のドキュメントを漁ったところ、Amazon Linux 2 への Docker のインストール手順を説明は、Amazon Linux 2 の実行基盤である Amazon EC2 のドキュメントではなく、コンテナ管理サービスである Amazon ESC の方のドキュメントに存在している。
- 最新の 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 のドキュメントに説明がある。
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 docker
や yum 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 docker
と sudo 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 docker
…
20 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]より
Amazon ECS ドキュメント- パッケージの更新
インスタンスでインストールされているパッケージとパッケージキャッシュを更新します。
sudo yum update -y
- Docker Engine のインストール
最新の Docker Engine パッケージをインストールします。
sudo amazon-linux-extras install docker
[2]より
Docker ドキュメント- Docker を起動
Start Docker.
sudo systemctl start docker
-
hello-world
イメージを実行して、Docker Engine が正しくインストールされていることの確認
Verify that Docker Engine is installed correctly by running the hello-world image.
sudo docker run hello-world
[3]より
(オプション) Docker ドキュメント-
sudo
なしで実行できるように docker グループに追加
Add your user to the docker group.
sudo usermod -aG docker $USER
-
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-container-image.html#create-container-image-install-docker ↩︎
-
https://docs.docker.com/engine/install/centos/#install-using-the-repository ↩︎
-
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 ~]$ 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 ではそれが効いていないので、カレントディレクトリの内容が表示されてしまう。
[ec2-user ~]$ docker .
./ ../ .bash_logout .bash_profile .bashrc .cache/ .ssh/
この機能は bash-completion
パッケージによるものだが、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/
にファイルを格納する指示がよくあるのでそのディレクトリの中を調べてみた。
[fedora ~]$ ls /etc/bash_completion.d/
redefine_filedir
関係ないパッケージのファイルしかなかった。
恐らく別の場所にインストールされているはずである。
/usr/share/bash-completion
rpm -q --list
コマンドを使うとそのパッケージでインストールしたファイルの一覧を取得できるので、どのファイルが bash-completion
に作用しているか調べる。
[fedora ~]$ rpm -q --list docker-ce-cli | grep bash
/usr/share/bash-completion/completions/docker
/usr/share/bash-completion/completions/docker
に bash-completion
用とみられるファイルが格納されている。
検索すると、GitHub リポジトリの https://github.com/docker/cli/blob/master/contrib/completion/bash/docker と同一のファイルのようである。
ドキュメントに入力補完に関する説明はないが、これが作用しているファイルだと状況証拠から断定できる。
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/
にシンボリックリンクを貼ってみる。
[ec2-user ~]$ sudo ln -sf /usr/share/bash-completion/docker /usr/share/bash-completion/completions/docker
入力補完が効くようになった。
[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 ~]$ 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 に沿って行う。
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
に格納しろと書いてる。
しかし、そんなものはなかった。
[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 を確認してみる。
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
ディレクトリがあるのか確認する。
[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
バイナリをダウンロードしてそちらに格納する。
[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 も利用できるようになった。
docker compose
コマンドも Tab 入力補完が効かない
残念ながら、docker compose
コマンドも Tab 入力補完が効かない。
[ec2-user ~]$ docker compose [TAB…]
Issues
Issues を漁ってみると、 Docker Compose V2 は入力補完が対応していないようである。
Compose ドキュメント
Compose ドキュメントの CLI リファレンスには入力補完の説明がある。
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
を参照する。
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
に格納するだけのようだ。
[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
だが
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
に変更だけして手順を実施する。
[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 を再起動して
[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 compose
と docker-compose
がインストールされている状態だが、それぞれ独立しているのでどちらも利用できる。
[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
はよく見かけるコマンドで入力補完が利用できるが、このバージョンは将来的には非推奨となるとみられる