はじめに
Dockerfileを書く際に、Linuxインストールコマンドで困ったことがありませんか?
aptなの、apt-getなのか、dnfなのか、yumなのか。
毎回「どっちなんだい!!」と、なかばギャンブルのように試しては失敗しを繰り返していたのが筆者です。
AI時代が到来し、いよいよ我々が感知しない深淵の問題へと押し込まれそうな題材ですが、理解せずに放置するのも嫌なので、せっかくのなのでこの機会に調べてみました。
というわけで本記事では、Linuxの一般教養と、二度とインストールコマンドを間違えなくなるという特殊能力を読者に提供いたします。
(とりあえず結論が知りたい場合は、最後の結論だけかいつまんでいただければ!)
序論
本章では、エンジニアの一般教養として、Linuxの歴史や特徴をざっくりとまとめました。
Linuxとディストリビューション
Linux
言わずと知れたオープンソースのOSです。
変更と再配布が認められているのでさまざまな派生(ディストリビューション)が存在します。
じゃあその派生の大元はどこなんだ? と気になって調べたら、大きく分けて3層の呼称があるようです。
- Linuxカーネル
- 物理的にCPUを制御する、OSの最も心臓に近い部分
- 1991年に当時学生のリーナス・トーバルズさんが作った(Linux表示によく出てくるペンギンは、リーナスさんに似ているらしい)
- このカーネルだけではコマンドを実行できない
- GNU/Linux
- オープンソフトウェア開発を推し進めるGNUの各種ツールをLinuxカーネルと組み合わせたもの
-
ls,cdのようなコマンドが使える - 堅牢でバグが少ないため広く普及したらしい
- 派生(ディストリビューション)
- それぞれの特徴を持ったLinuxたち
- GNU/Linux がOSSなので、そこに多様なカスタマイズをしている
- パッケージ管理システムが違うので、
aptやdnfのようなコマンドも違ってくる
派生(ディストリビューション)
GNU/Linux が基盤になっていますが、GNUが「ソフトウェアはすべて、オープンで共用可能であるべき」という理念のもと動いているので、変更と再配布が可能になっています。
当時無償で高性能なOSなどなかったので、元のLinux含め、たくさんの派生が作られてきました。
現在、その潮流を大きく分けると3つになります。
- Debian 系
- Debian
- 一番メジャーで初心者から上級者まで誰でも使える王道。スタンダードともいえそう
- Ubuntu
- GUIが使えることで有名。Debianに比べて、初心者にも使いやすいようにチューニングされている
- Debian
- Red hat 系
- Red Hat Enterprise Linux
- Linuxの中では数少ない有料契約品
- サポートが手厚いらしい
- 現在はソースコードの一般公開を停止しており、コードはオープンであるべきという思想のGNUからは文句を言われている
- CentOS
- もともとはRed hatの潮流を組む無償OS
- 現在は保守開発が終了済
- かつてはLinuxサーバーとしてDebianに並んで使われていたが、保守体制終了によりこぞってDebian系への移行が進んだ。あまりに急だったので、当時荒れていたイメージ
- Fedora
- 無料提供
- Red hat関係のチームが運営しており、Red Hat Enterprise Linux の新機能を先んじて試している
- これに限らず、Red hat系のオープンOSは新機能の試験場やお試し版といった色が濃いようです
- Red Hat Enterprise Linux
- Slackware 系
- Slackware
- Debianと同様に30年以上の歴史をもつ
- シンプルで自由度が高い(高すぎて初心者には難しい)
- Slackware
- その他
- ここでは紹介しませんが、大手以外にもいくつかのディストリビューションが存在しています
擬人化
それぞれの人物像をGeminiに擬人化して貰いました。
左から、
- Debian: 堅牢で知識の集約が多い
- Red hat: サポートの面で頼りになるが、有償であったり、広く使われていたCentOSをサポート終了したりと、問題児感がある
- Slackware: 物好きで色々カスタマイズしたい感じ
という特徴をとらえていて、なるほどなぁと思いました。
本題
ここまでで一般教養的な話は終わりで、次は本題の「インストールコマンドは結局どれやねん!」という話をしていきます。
ディストリビューションとパッケージ管理ツール
ディストリビューションとインストールコマンドについて、覚えておくべきは2x2の図です。
debian系
apt-getが長い間使われていましたが、人間にはわかりにくかったり依存関係解決に問題があったりなどで、aptという正統進化版が作られました。aptが作られたのは2014年で、Linuxの技術にしては比較的新しい気がします。
ただし、aptはプログレスバー出力等が見やすい反面ログを大量に吐きだすので、スクリプト内ではapt-getが推奨されています。そのためか、Dockerfileビルドの文脈ではapt-getを使用する文化、傾向があるようです。
Red hat系
かつてはyumが使われていましたが、内部に存在した問題点を解決するために正統進化版のdnfが生まれました。dnfは2015から始まっています。
ただdnf対応のOSでyumを実行すると、内部的にはdnfが走るようです。
というわけなので、
- Debian系の場合
- 新しめのOS、かつコンソール上で手動インストールを行う場合は
aptを使えばよい - それ以外の場合はとりあえずapt-getを使っておけば問題さそう
- 新しめのOS、かつコンソール上で手動インストールを行う場合は
- Red hat系
- とりあえずyumを使えばよさそう
- OSが古ければyumが走る
- OSが新しければ、内部で勝手にdnfが走る
- とりあえずyumを使えばよさそう
という使い分けがよさそうでした。
結局、どっちなんだい!?
(ここだけ見ればいいかも)
最後に、有名なサービスとコマンドについてまとめます。
| サービス/OS/dockerイメージ | コマンド |
|---|---|
| Amazon Linux | yum/dnf |
| Oracle Linux | yum/dnf |
| Rocky Linux | yum/dnf |
| debian | apt-get |
| ubuntu | apt-get |
| alpine(※1) | apk |
| Gentoo Linux | emerge |
| その他非エンタープライズイメージ(※2) | だいたいapt-get |
※1 alpine は超軽量なLinuxディストリビューションです
※2 特殊なオプションが付かないDockerイメージは、大半がDebianを元にしています
つまり、
- 大手IaaSのLinuxならとりあえずyumを使う(dnf対応なら、内部ではdnfが走る)
- debian, ubuntu計ならapt-getを使う
- alpine(Dockerの軽量コンテナよくある)ならapk
- そのほか一般的なイメージはだいたいdebian系(無料なので)のため、とりあえずapt-getしとけばよい
- Gentoo Linux など、独立系のディストリビューションを使う際はコマンドに注意
という結論になりました。
参考


