potpro (ぽとぷろ)
Full-stuck engineer(Not Full-stack)
JS/PHP/Go/Docker/Nginxなど。技術または趣味寄りの発信ブログです。
全 85 記事CentOS8でDocker CEを使うのは(現状は)やめとけという話 (追記アリ)
CentOS8でDocker CEを使うのは(現状は)やめとけという話 (追記アリ)
タイトルの通りです。ここ数日間、CentOS8とDocker CEで戦ってきました。
しかし問題が起きすぎて困ったので、現状はあまり使えないと思っていたほうがいいよ、そしてこれからも問題が起きるかもしれない(これに関しては推測でしかないですが)という記事。
追記 (2020/09/21)
ドキュメントではまだ7.xのままですが、2020/09/17にCentOS8(el8)用のstableにパッケージが追加されているようです。これがそのまま動作するかは試していないため定かではありませんが、サポートはされていると思われます。
https://download.docker.com/linux/centos/8/x86_64/stable/Packages/
よって、これ以降の文章に関してはもう問題なくなったかな、と思います。(読まなくていいです)
公式のパッケージが存在しない
CentOS 7 ではDocker CE公式でYumリポジトリ(dnfリポジトリと言っていいのかな?)が配布されていたため、インストールは簡単でした。
しかし、3月時点ではまだCentOS8でパッケージが存在しません。
https://download.docker.com/linux/centos/
docker-ce-19.03.8-3.el7.x86_64.rpmがstableの最新です。
当然ながらドキュメントもCentOS 7.xで動作すると書かれており、現時点ではCentOS8のサポートは行われてません。
CentOS — Docker-docs-ja 1.13.RC ドキュメント
Docker は CentOS 7.X で動作します。Scientific Linux のような EL7 バイナリ互換のディストリビューションでもインストールは可能かもしれませんが、Docker はこれらのディストリビューションでテストしておらず、サポートも行いません。
それでもDockerをインストールする
el7のパッケージを使ってインストールは出来ます。他の記事でもよく書かれていますが、--nobest
オプションを追加すればインストールできます。
dnf install --nobest docker-ce docker-ce-cli container.io
これでインストールできるんですが、最新版がうまく動作しないのか少し前のバージョン(18.06.3.ce-3.el7)がインストールされます。さらに不安ですね・・・。
ネットワーク周りがうまく動かない
インストールできて使えると思ったが、どうもうまくdocker network絡みが動かない。
例えば以下のようなdocker-compose.ymlを書いたんですが、ホストから全然アクセスが出来ないという結果に・・・。
version: '3'
nginx:
image: nginx:1.17
ports:
- 3000:80
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
curl http://localhost:3000
>curl: (56) Recv failure: Connection reset by peer
この結果も、Recv failure: Connection reset by peer
になってしまいます。
これはCentOS 8のファイアーウォールソフトウェアであるiptablesがnftablesになったことによるものです。
Dockerはコンテナの操作などをした時、実は裏でiptablesを書き換えています。書き換えているものの仕様が変わってしまったのでうまく動かなくなってしまったようです。
それでもiptablesをインストールする
CentOS 8では、iptablesをインストールすることもできます。
dnf install -y iptables-services
これで一見動作しているように見えますが、ネットワーク周りでDockerから生成されるルールがやっぱり変な形になってしまっていて、上手く動かず(もしかしたら自分の環境だけかもしれませんが)。
この記事によると、やっぱりiptables-nftとlegacyを混合させた状態はあまりよくないため、iptables-legacyだけ使うようにするのが確実とのこと。
Debian 10(buster) + ufw + Docker: Dockerコンテナが外部と通信できない問題の対処
しかしCentOS 8はnftablesが標準で、それをiptables-legacyに落とすというのも・・・という気持ちがあります。firewalldとも競合して管理が大変だし、うまく動く補償もないですからね・・・。
結論:やめとけ
上記の理由から、DockerだけではなくKubernetesなどもイマイチです。というか、この記事が一番詳しくうまくまとまっています。
Kubernetes 1.16 のクラスタを CentOS 8 と containerd で構築する
自分もk3sを試しました。k3sはcontainerdのためなのか、見た感じは動作していました。でもちょっと動くか確認したレベルなので、やっぱりネットワーク絡みで問題起きそうだな感。
代用案
Podmanを使う
Podmanは、redhatが開発しているコンテナエンジンです。Dockerの互換ソフトウェア。
ほぼコマンドはdockerと互換性を持っており、Dockerとの違いとしては、デーモンレス(デーモンを使用せず動作する)、ルートレス、KubernetesのPodを扱えるように改良をしているとのこと。
Versionは1に到達しており、既にGeneral Availabilityではあります。
dnf -y install podman-docker
これでインストール可能。
podman
コマンドで動作します。また互換のエンジンなので、docker
コマンドでも動きます。警告は出ますけど。
問題として、これで問題なく置き換えが出来ればいいのですが・・・
自分はdocker-composeを管理として使っていたので、それ相当のアプリケーションが無ければ厳しいです。なので探した結果、同じようにpodman-composeというOSSを見つけました。
しかしこれに関してはまだまだ開発中の感じが強く、インストールは簡単なのですが、ps
コマンドがまだ無かったり、ネットワークが動作しなかったり・・・
エコシステムの問題もあるので、サクっと置き換えるのは厳しいかなあと感じました。簡単なサービスを立ち上げるだけくらいのレベルなら使えるかも。
ソフトウェアがもっと成熟してくれば、ほぼ完全互換かつシェアすら入れ替わる、なんてこともあるかもしれないですが・・・。それ待ちですかね・・・。
CentOS8をやめる・サポートを待つ
自分は自宅サーバなので別にCentOS8に固執することもないと思ったので、Fedoraに変更しました。FedoraであればRPM系で操作感もそんなに変わらず、Docker CEサポートもされているので、これでいいかなあという気持ちです。
まだプロダクション等で使うとしたらCentOS7かなあ感。でもサポートもあるので、長く使う想定だと選択が難しいところですな・・・。
まあ、まだ出たばかりということもあるので、PodmanがDocker CEと同じ水準で使えるようになるかもしれないし、Docker CEのCentOS8サポートも来るかもしれません。
その時になれば、記事を更新しようかなと思います。