ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

FedoraやCentOS 8でDockerを使う

CentOS 8ではPodmanというコンテナーソフトウェアが利用できます。しかしどうしてもDockerを使いたい場合があるかもしれません。 そんな時に役立ちそうなネタです。ちなみにFedoraやCentOS 7でも同様に導入可能です。RHELでも可能ですが、外部リポジトリーの利用は自己責任になりますし、サポート対象外となりますので注意してください。

4/7/2021 追記

Docker 20.10以降はCentOS 8をサポートしています。手元の環境では安定して動作するのを確認しています。

docs.docker.com

前書き

CentOS 8向けには現時点でもDocker CEのパッケージは提供されていません。Web検索するとCentOS 7向けのパッケージを無理やり入れる方法を解説しているページが多く見られます。インストールできたとしても、その後のパッケージ依存関係の解決はどうするつもりなんでしょうか(yumコマンド実行ごとに--nobestとかが必要になったりしますよ)。アップデートパッチ適用のたびに何か起こりそうです。

さて、Canonicalという会社がLinuxの新しいパッケージシステムとしてsnapdというものを開発しているのはご存知の方も多いと思います。snapdは元々IoT機器向けのUbuntuディストリビューション向けに開発したパッケージ管理システムですが、その後Ubuntu DesktopやUbuntu Serverなどにも標準バンドルされて、最近のUbuntuではいくつかのソフトウェアがsnapパッケージに移行されています。

その後、Ubuntu以外のディストリビューションでもsnapパッケージが利用できるようになっています。CentOSも同様にsnapdを使ってアプリケーションの導入が可能になっています。

snapcraft.io

snapパッケージ版DockerをCentOS 8に導入する

ちなみにsnapパッケージのDockerは次のページに説明があります。右側にインストールに使われているOSの一覧があります。結構多くのディストリビューションで使われているのがわかると思います。

snapcraft.io

CentOS 8では次のようにセットアップしてください。なお、事前にepel-releaseのインストールが必要です。なおsnapdは2020年3月20日現在のバージョンはSELinuxが有効な状態ではサービスを起動できませんので注意が必要です。

$ sudo yum install epel-release
$ sudo yum install snapd
$ sudo systemctl enable --now snapd
$ sudo snap install docker --stable

「snap install docker」を実行した時に次のようなメッセージが出ます。インストール直後のセッションはパスが通っていないのでセッションの切り替えが必要だそうです。ログアウト&ログインするか、再起動します。

Warning: /var/lib/snapd/snap/bin was not found in your $PATH. If you've not restarted your session
         since you installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469
         for more details.

ちなみに、グローバルなパスの設定は従来なら/etc/profileに設定するところですが、そのファイルを開くと書かれているように、/etc/profile.d/ の下にシェルスクリプトでそれぞれのパスを設定するほうが推奨されているようです。 こんな設定が追加されているのを確認しました。

$ sudo cat /etc/profile.d/snapd.sh 

# shellcheck shell=sh

# Expand $PATH to include the directory where snappy applications go.
snap_bin_path="/var/lib/snapd/snap/bin"
if [ -n "${PATH##*${snap_bin_path}}" -a -n "${PATH##*${snap_bin_path}:*}" ]; then
    export PATH=$PATH:${snap_bin_path}
fi

# Ensure base distro defaults xdg path are set if nothing filed up some
# defaults yet.
if [ -z "$XDG_DATA_DIRS" ]; then
    export XDG_DATA_DIRS="/usr/local/share:/usr/share"
fi

# Desktop files (used by desktop environments within both X11 and Wayland) are
# looked for in XDG_DATA_DIRS; make sure it includes the relevant directory for
# snappy applications' desktop files.
snap_xdg_path="/var/lib/snapd/desktop"
if [ -n "${XDG_DATA_DIRS##*${snap_xdg_path}}" -a -n "${XDG_DATA_DIRS##*${snap_xdg_path}:*}" ]; then
    export XDG_DATA_DIRS="${XDG_DATA_DIRS}:${snap_xdg_path}"
fi

sudoを実行した時に「sudo: docker: command not found」と言われてしまいます。この対策方法としては「visudo」コマンドを実行した後、「Defaults secure_path」行に「/var/lib/snapd/snap/bin」を追加すれば良いそうです。sudoあるあるネタ何でしょうか。

kamihikouki.hatenablog.com

snapパッケージ版Dockerを使う

基本的に使い方は普通のDockerと一緒です。

$ sudo docker container run -it busybox sh

daemon.jsonは以下のパスを編集します。

/var/snap/docker/current/config/daemon.json

サービスの再起動は次のように行います。systemctlコマンドではないです。

$ sudo snap restart docker

サービスの有効化、無効化は enable , diasbleを指定します。

$ sudo snap enable docker

[追記]

RHEL 8.1やCentOS 8.1にはFirewalldに何か問題があるようです。もし、コンテナー内でドメインの名前引きができない場合は以下を参考にファイアウォールルールを許可してみてください。この問題はFedoraは対象外です。

serverfault.com

Dockerなら

sudo firewall-cmd --zone=trusted --add-interface=docker0

Podmanなら

sudo firewall-cmd --zone=trusted --add-interface=cni-podman0

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。