Dockerってなんか聞いたことあるなぁ…って方と学ぶUbuntuでDocker
Dockerというワードを聞いた事があるけどよぅわからん…という方が多分この記事を見つけてくれたのではないかなと思います。実は僕もよぅわかってません(^-^;
という事で今回は「そもそもDockerって何なの?」という所を掘り下げ、簡単なサンプルでDockerを動かしてみようと思います。
Dockerとは?
Dockerを一言で言うと「作ったアプリケーションをいろんなOSで動かす仕組み」です。
例えばUbuntuでC++で実行ファイルを作ったとします。ターミナルでこの実行ファイルを叩くと「Hello World!」と表示されます。では、この実行ファイルをWindowsで動かす事はできるでしょうか?これはUbuntuの実行ファイルとWindowsのそれとで内部構造がまるで違うため、実行すらできません。
ところが、Dockerを通すと双方の環境で実行できるようになります。これはDockerがUbuntuとWindowsの違いを吸収してくれるからです。もちろんDockerを通せばMac OSでも動きます。
このようにDockerはOSの垣根を超えて同じアプリケーションを動作させる事が可能な、魔法のような仕組みなんです。
仮想マシンと何が違うの?
色々なOSで動かすと言うと「仮想マシン」を思い浮かべる人もいるかと思います。仮想マシンを使うと、例えばWindows OS上でUbuntuを丸ごと動かす事が出来ます。ですからUbuntuで作成した実行ファイルをそこでも実行できます。
仮想マシンとDocker、どちらも似たような働きをしています。双方の違いは仮想マシンがOSを丸ごとエミュレートしているのに対し、Dockerは動作させているOSのカーネル(基本機能)を利用してアプリケーションを動かしている所です。
仮想マシンのOSイメージは非常にサイズが大きく、またエミュレートコストも高いので、アプリケーションの動作は重くなりがちです。一方DockerはOSのカーネルを直接叩くため動作が軽量です。その為単一のアプリケーションを動かす目的であればDockerの方が好まれます。
とりあえずDockerをUbuntuに入れる
Dockerの概要をぼんやりイメージできたかなと思いますので、さっそくDockerを使ってみるべくUbuntuにインストールしてみましょう。
Dockerの公式ページにUbuntuへのインストール手順がありますので、基本それに従います:
大きく3ステップでインストール出来ます。一見ごちゃっとしていますが、ただコマンドを入れて進めれば良いだけなので簡単です(^-^)
オフィシャルじゃないDockerをアンインストール
最初に、お使いのUbuntuによっては非公式のDockerが入っている場合があるようです。公式のDockerをインストールする際にそれらと干渉してうまくいかない場合があるため、一番最初にそれらパッケージを削除します:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
pkgの中に格納しているdocker.ioとかdocker-docなどが対象です。それらパッケージが入っていればこれで削除されます。
Dockerのaptリポジトリを登録
Ubuntuにアプリケーションをインストールする時には「apt」というパッケージ管理アプリケーションを使います。日頃使っている方も多いのではないでしょうか。
Ubuntuにインストール可能なアプリケーションの情報をリポジトリと言います。リポジトリにはUbuntu公式のものとサードパーティのものがあり、公式のは「/etc/apt/sources.list」というファイル内に、サードパーティのは「/etc/apt/sources.list.d/」というディレクトリの下にそれぞれリストアップされています。
Dockerはサードパーティアプリケーションなので、インストールする前にこのリポジトリリストへ登録する必要があるんです。その手順は以下の通り:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
一行ずつ手入力しても良いのですが、かなり面倒なのと打ち間違いするとパニくるのでww、適当なテキストエディタにこれらをコピペして「register_docker_to_apt.sh」というシェルスクリプトとして保存しましょう。そして、端末でこのスクリプトのディレクトリ位置まで行き、スクリプトを実行しましょう:
最初にsudoのパスワードを求められますので、自身のUbuntuログインパスワードを入れて下さい。また途中でパッケージを入れる確認を問われるので「y」で進めて下さい。
この作業は1回限りですし、先のコマンド列の意味を知るのはきつい所がありますので、まぁ…そういうもんかというくらいで十分かと思います。
処理が成功するとDockerがaptのリポジトリリストにサードパーティとして登録されるので、インストール可能となります。
Dockerをインストール
aptのリポジトリリストに登録が出来たら、あとはDockerをaptを通してインストールするだけです。コマンドは以下のとおり:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Dockerは単独のアプリケーションというよりは関連するいくつかのパッケージで構成されるアプリなので、複数のパッケージがインストールされます。
Dockerの動作をテスト
インストール処理が終わったら、Dockerがちゃんと動くかテストしましょう。これは公式のお作法があり、以下のコマンドを打ち込みます:
sudo docker run hello-world
Dockerが正しくインストールされていれば、諸々の処理が走りこんな感じのメッセージが表示されるはずです:
これでDockerを使うことができるようになりました!
ミニマムなアプリでDockerを体験してみよう
早速Dockerを通して自分で作ったアプリケーションを動かしてみましょう。
pythonで「Hello World!」と表示するプログラムを作る
動くアプリの例としてpythonで「Hello World!」を表示するプログラムを作ってみましょう。
まず作業用のフォルダとして「HelloWorld」というワークフォルダをどこかに作ります。場所も名前も別に何でも良いです(^-^;:
テキストエディタやVS Codeなどのエディタでこのフォルダ内にpythonのコードであるhello_world.pyを作成します。コードの内容は以下の通りです:
print( "Hello World!" )
dockerfileを記述する
アプリが出来たら、次にこのhello_world.pyをDockerの「コンテナ」という箱に登録します。この際、dockerfileというちょっとしたスクリプトが必要になります。
まずコンテナについて。DockerにはDockerコンテナというアプリケーションが動作するのに必要な物が詰まった箱が定義されています。例えば先に作ったpythonコードは、これだけだと単なるテキスト文なので、うんともすんとも動きません。これがプログラムとして動くのは「pythonエンジン」がコードを解釈してくれるからです。なのでDockerコンテナの中にはhello_world.pyコードと一緒にこのエンジンも詰め込んでしまうんです。これによりコンテナ単体で動作する仕組みがパッキングされるんですね。またエンジンも乗っけてしまうので、他のOS上でも動作する…。そういうイメージです。
dockerfileはそのコンテナに何を詰め込むかを記述したスクリプトです。今回のhello_world.pyの場合、こんなスクリプトになります:
# Pythonの公式イメージをベースに使用
FROM python:3.9-slim
# 作業ディレクトリを設定
WORKDIR /app
# 作成したhello_world.pyをコンテナにコピー
COPY hello_world.py /app/hello_world.py
# Pythonスクリプトを実行するコマンドを設定
CMD ["python", "hello_world.py"]
このスクリプトを「dockerfile」という名前で先程作ったhello_world.pyがあるフォルダ内に保存して下さい。これはこの場所じゃないとうまくいきません。
スクリプトで最初に記述するのは「イメージベース」というコンテナの土台です。コンテナにも色々な型みたいなのがありまして、中に詰める物(動かす物)によって選択する必要があります。今回はpythonを動かしたいのでpythonのイメージを使うよう指定しています。
次にコンテナ内に作業用のディレクトリを追加しています。コンテナは言ってみればフォルダとほぼ一緒です。仮想的なルートフォルダがあるので、そこにappフォルダを追加しています。
続いて作ったappワークフォルダ内に先程作ったhello_world.pyをコピーします。
最後にコンテナが実行された時に何をするかをCMDというコマンドで指定します。上の場合はpythonエンジンに対して「hello_world.pyを実行せよ」というコマンドを発行していますね。これはローカルでも、
python hello_world.py
とコマンドを打つとプログラムが走るので、やっている事は一緒ですね。
Dockerコンテナのイメージをビルド
dockerfileを作ったら、このスクリプトをDockerに食わせてDockerコンテナのイメージを作ります。イメージとはコンテナファイルの事です。
次のコマンドを実行して下さい:
sudo docker build -t python_hello_world .
これがDockerのビルドコマンドになります。-tフラグはタグの事で、コンテナに名前を付けるようなイメージです。
その後ろに「.」があるのを見逃さないで下さいね。これはカレントディレクトリにあるファイルを参照するよ〜という意味です。今カレントディレクトリにはhello_world.pyがありますよね。もしdockefileが別のフォルダにあるときには、対象となるフォルダパスをここで指定するんです。
このコマンドを叩くと何やら色々動き出して、最終的にビルドが成功するはずです。
python_hello_worldイメージを実行してみる
さて、ビルドに成功したらpython_hello_worldというファイルができるのか…というと、実はそうではないんです。DockerコンテナはDockerが内部で保持管理していまして、ビルドしただけではファイル的なものにはならないんです。この辺りがコンテナをファイルじゃなくて「イメージ」と呼んでいる所以かもしれません。
先程ビルドしたものがちゃんと存在するかを確認してみましょう。以下のコマンドを打ってみて下さい:
sudo docker images
これで現在管理されているDockerコンテナが一覧表示されます:
REPOSITORYの所にちゃんと「python_hello_world」がありますね。よかった、ビルドできてましたね(^-^;
という事でこのDockerイメージを動かしてみましょう:
sudo docker run python_hello_world
すると…
Hello World!がターミナルに表示されました!内部のpythonコードがちゃんと動いたんですね!
DockerイメージをWindowsのDockerで動かす
Dockerの良さはアプリを他のOSでも動かせる所です。そこで先程作ったpython_hello_worldイメージをWindowsで動かしてみましょう。
イメージをファイルにエクスポート
まずDockerが管理しているコンテナイメージを別のOSに持っていくためファイルにエクスポートします。これはsaveコマンドを使います:
sudo docker save python_hello_world -o docker_python_hello_world.tar
saveに続けてイメージ名、-o(出力)フラグの後に出力ファイル名を記載します。出力はtar形式になるため拡張子を付けておきましょう。
これでイメージファイルができあがりますので、これをWindowsに持っていきます。
Windowsの場合、2024.12現在ではDocker DesktopというDockerの統合環境を使う事が推奨されているようです。個人利用の範疇では無償で使用できます。今回はWindowsのDocker Desctopのインストール云々は解説を省き、すでに使える状態からお話を進めます。
Windowsに先程エクスポートしたdocker_python_hello_worldファイルを適当なフォルダに移したら、コマンドプロンプトで次のようにしてインポート(ロード)します:
docker load -i .\docker_python_hello_world.tar
これでイメージがDockerの管理下になりますので、実行できます!
Hello World!が出ました!Ubuntuで作ったコンテナがWindowsでもちゃんと動作しています!
という事で、今回は「Dockerってなんぞや?」という方にDockerを体験してもらいました。コンテナの中に動作環境も含め入れ込む事でマルチプラットフォームで動くアプリを作れるというのは魅力的です。
次回はUbuntuで作成したC++アプリケーションをDockerイメージに組み入れてみます。
ではまた(^-^)/