「自分のパソコンでは動いたのに、友達のパソコンに入れたら動かない…」そんな経験、プログラミングをやってる人なら一度はぶつかったことがあるんじゃないかな。環境が違うだけで同じコードが動かなくなるって、本当に困るよね。そのモヤモヤをまるごと解決してくれるのが「Docker(ドッカー)」なんだ。この記事を読めば、Dockerが何者で、なぜエンジニアがこんなに使ってるのかが全部わかるよ!
- Dockerはアプリを動かすのに必要な環境ごとまとめた コンテナ を作れるツールだよ。
- 「自分のPCでは動くのに」問題(つまり 環境差異 の問題)をコンテナが解決してくれる。
- 仮想マシンより軽くて速く、 本番環境 にそのまま持ち出せるから開発効率がグッと上がる。
もうちょっと詳しく
Dockerが世界中に広まったのは2013年ごろのこと。それまでは仮想マシン(VMwareやVirtualBoxなど)でパソコンの中に別のOSを丸ごと立ち上げるのが主流だったんだ。でも仮想マシンはとにかく重い。OSをまるごと動かすから起動だけで数分かかることもあって、開発のテンポが落ちるんだよね。そこに登場したDockerのコンテナは「OSの核(カーネル)はホスト(もとのパソコン)と共有しつつ、アプリの実行空間だけ分離する」という方法で、軽量化を実現したんだ。起動は数秒。同じマシンの上でコンテナを何十個も並べて動かすことだって全然できる。「手軽に環境を分けたい」というエンジニアの悩みにぴったりはまったから、あっという間に業界標準になったんだよ。
仮想マシンは「家ごと建てる」、コンテナは「部屋を仕切るだけ」。だから軽くて速いんだ!
⚠️ よくある勘違い
→ Dockerはプログラミング言語じゃなくてツール(ソフトウェア)だよ。コードを「書く」ものじゃなくて、環境を「管理する」ものなんだ。
→ PythonでもGoでもRubyでも、どんな言語のアプリでもコンテナに入れられる万能な環境管理ツールなんだ。
[toc]
Dockerって結局なに?「コンテナ技術」をわかりやすく解説
Dockerを一言で表すなら「アプリをどこでも同じように動かせるようにする技術」だよ。もう少し正確に言うと、コンテナ型の仮想化技術、つまりアプリとその実行に必要な環境を「コンテナ」という単位にまとめて動かす仕組みなんだ。
「環境」って何のこと?
プログラムが動くには、プログラム本体のファイルだけじゃ足りないんだよ。たとえばPythonで作ったWebアプリなら、こんなものが必要になる。
- Pythonのバージョン(3.9なのか3.11なのか)
- 使ってるライブラリ(requestsやFlaskなど)とそのバージョン
- データベースの設定ファイル
- OSの種類(UbuntuなのかCentOSなのか)
これが全部そろって初めて「動く環境」になるんだ。友達や職場の人にアプリを渡したとき、相手のパソコンにこれが全部入ってるとは限らないよね。それが「自分のとこでは動くのに!」問題の正体なんだ。
コンテナはどう解決してくれるの?
Dockerのコンテナは、この「環境」ごとアプリをまるっと箱に詰め込む。コンテナの中にはアプリのコードも、必要なライブラリも、設定ファイルも全部入ってる。だから受け取った人は「Dockerが動くパソコン」さえ持っていれば、コマンド1行でそのコンテナを動かせるんだ。カップラーメンを渡すみたいに、お湯(Dockerの実行環境)さえあればどこでも同じ味が出る、ってイメージだよ。
Dockerの3つの重要キーワード:イメージ・コンテナ・Dockerfile
Dockerを使うときによく出てくるキーワードが3つあるよ。この3つさえわかればDockerの仕組みが見えてくる。
イメージ(Image):設計図のようなもの
Dockerイメージとは、コンテナの「設計図」または「金型」のことだよ。イメージ自体は動かない静的なファイルで、「どんな環境で・何のアプリを動かすか」が記録されている。料理のレシピに例えると、イメージがレシピ、コンテナがそのレシピを使って実際に作った料理、って感じだね。DockerHub(ドッカーハブ)というサイトには公式のイメージが大量に公開されていて、たとえば「nginxのイメージ」を引っ張ってくれば、設定ゼロでWebサーバーが立ち上がるんだよ。
コンテナ(Container):実際に動いてる箱
コンテナは、イメージを元にして実際に起動した「動いている実体」のことだよ。1つのイメージから何個でもコンテナを作れる。同じレシピから何杯もラーメンが作れるのと同じだね。コンテナは独立した空間になっていて、他のコンテナや外のパソコンと干渉しない。だから「コンテナAで動かしてるアプリ」と「コンテナBで動かしてるアプリ」が互いに影響し合うことがないんだ。
Dockerfile:イメージを作るための指示書
Dockerfileとは、「どんなイメージを作るか」を書いたテキストファイルのことだよ。たとえば「Ubuntu 22.04をベースにして、Pythonを入れて、このコードをコピーして、このコマンドで起動してね」という手順を1行1行書いていく。料理で言えば「材料一覧と調理手順」を書いたレシピカードだね。このDockerfileをもとにDockerがイメージを自動で作ってくれるんだ。
仮想マシンとDockerの違い:何がそんなに違うの?
「仮想マシンでよくない?」と思った人もいるかもしれないから、ちゃんと比べてみるよ。
仮想マシンの仕組みと弱点
仮想マシン(VM)は、1台のパソコンの中に「もうひとつの完全なパソコン」を作り出す技術だよ。OSごと丸ごとシミュレートするから、自分のパソコンの上でWindowsを動かしながら仮想マシンでUbuntuを動かす、なんてことができる。でもその分リソース(メモリやCPUの力)をたくさん使う。起動にも時間がかかって、仮想マシン1個が数百MB〜数GBの容量を食うことも珍しくないんだ。
Dockerコンテナの強み
Dockerのコンテナは、OSの核となる部分(カーネル、つまりOSの一番深いところにある基本機能のこと)をホストのパソコンと共有する。だから「OS丸ごと」を用意しなくていい分、めちゃくちゃ軽い。コンテナのサイズは数十MBで済むことも多いし、起動は1〜2秒。同じパソコンの上でコンテナを何十個も動かすことだってできるんだよ。
使い分けのポイント
「じゃあ仮想マシンはもう要らない?」かというと、そんなことはなくて、完全に別OSを動かしたい(MacでWindowsを動かすなど)なら仮想マシンが必要だよ。でも「アプリの開発・テスト・本番デプロイを効率よくやりたい」という目的なら、Dockerが圧倒的に向いてるんだ。
Dockerの基本的な使い方:コマンドを見てみよう
Dockerを実際に使うときは、主にコマンドラインから操作するよ。難しそうに見えるかもしれないけど、基本のコマンドはほんの数個覚えれば大丈夫だよ。
イメージを取ってくる:docker pull
docker pull nginx というコマンドを打つと、DockerHubから「nginxのイメージ」をダウンロードできる。nginxとはWebサーバーのソフトウェア、つまりWebページを配信するためのプログラムのことだよ。このコマンド1つで本格的なWebサーバーの準備が整うんだから、すごいよね。
コンテナを起動する:docker run
docker run -d -p 8080:80 nginx と打つと、nginxのコンテナが起動する。-dはバックグラウンドで動かすオプション、-p 8080:80は「パソコンの8080番ポートをコンテナの80番ポートにつなぐ」指定だよ。ブラウザで localhost:8080 にアクセスするとnginxのページが見える。たったこれだけでWebサーバーが立ち上がるんだ。
動いているコンテナを確認する:docker ps
docker ps は「今動いているコンテナ一覧」を表示するコマンドだよ。コンテナのID・名前・起動時間・ポート情報などが確認できる。docker stop コンテナID で停止、docker rm コンテナID で削除できる。
docker-composeで複数のコンテナをまとめて管理
実際のWebアプリは「Webサーバー」「データベース」「キャッシュサーバー」など複数のコンテナが連携して動くことが多い。それをまとめて管理するのがdocker-compose(ドッカーコンポーズ)だよ。docker-compose.ymlというファイルに「どのコンテナをどう起動するか」を書いておくと、docker-compose up の1コマンドで全部まとめて立ち上がるんだ。
Dockerを使うとどんないいことがあるの?現場での活用シーン
最後に、Dockerを使うと実際にどんなメリットがあるのかをまとめてみるよ。
開発環境の構築が一瞬で終わる
新しいプロジェクトに入ったとき、「環境構築だけで1日かかった」という話はエンジニアあるあるだよね。Dockerがあれば、Dockerfileやdocker-compose.ymlさえあればdocker-compose upの1コマンドで全員が同じ環境を手に入れられる。「私の環境では動くのに」という無駄な議論も消えるんだ。
本番環境への持ち出しが楽になる
開発したアプリをサーバーに置く作業のことをデプロイ(deploy)、つまり「実際に動かせる状態にする」ということだよ。Dockerを使えば、開発中のコンテナをそのまま本番サーバーに持っていくだけ。「開発環境と本番環境の差でバグが起きた」という厄介なトラブルが激減するんだ。
複数のバージョンを同時に扱える
コンテナはそれぞれ独立した空間を持つから、「Python 3.8で動かすアプリ」と「Python 3.11で動かすアプリ」を同じパソコンで同時に動かせる。バージョンが衝突する心配がないんだよ。これは開発者にとってかなり地味だけど嬉しいポイントだよ。
クラウドとの相性バツグン
AWS(Amazon Web Services)やGoogle Cloud、Azureといったクラウドサービス(つまりインターネット経由でコンピュータの力を借りるサービスのこと)は、Dockerコンテナを直接動かす機能を標準で持っているんだ。コンテナさえ作れれば、クラウドへの移行もスムーズにできる。大きなサービスでも小さな個人アプリでも、Dockerがあればスケールアップ(つまり規模を大きくすること)が格段に楽になるんだよ。
