本記事では、IT未経験から転職した私がDockerを知り、理解するまでのステップを解説します。
初学者だから感じる生の声・ツッコミを織り交ぜ、IT未経験者に寄り添い、共に伴走する立ち位置で記事執筆をしています。
したがって、IT初心者はもちろん、その上司にも初心者の気持ちを理解するという意味で幾分か参考になればと考えています。ぜひ、最後まで読んでいただけると幸いです。
はじめまして。私はIT業界未経験から転職したとあるITエンジニアです。本記事を執筆している段階で入社から3か月弱が経ちました。 簡単なバックグランドは以下の通りです。
このように、ITのIの字もない経歴をしております。
最初に私がDockerを耳にしたのは入社面接の場でした。 未経験で入社が不安だった私は面接官に
「何か勉強すべきものはあるか?」
と聞き、面接官から以下の回答を受けました。
「Dockerは使うと思うので勉強しておくとよい。」
当時は感謝の言葉を述べ、つかの間のやる気を見せていましたが、面接終了後には解放感で記憶ごと解放してしまいました。
次に出会ったのが、実際に開発プロジェクトに参画し始めた入社2か月目のころです。
「まずプロジェクト(のリポジトリ)をクローンして、そのあとREADMEを見て環境構築をしてほしい。」
「環境構築時にはDockerが必要なので、Dockerの利用申請をしてほしい。」
何かをしてほしいということだけ理解し、社会人経験からかろうじて推察可能であった「利用申請」という四字熟語を頼りに取り掛かったのを覚えています。
参照元:pexels,https://www.pexels.com/ja-jp/photo/1095814/
Geminiに聞いてみると以下のように返ってきます。
Dockerは、一言で言うと「アプリケーションを、どこでも同じように動かせる『箱(コンテナ)』に詰め込む技術」です。 開発環境では動いたのに、本番サーバーに持っていくと動かない…といった「環境の差異」によるトラブルを解決するために広く使われています。
このままではよく理解できなかったので、環境の差異とは何かを聞くと、少しずつわかってきました。
「環境の差異」というのは、アプリを動かそうとしているPCごとに、OSの種類やバージョン、インストールされているライブラリの組み合わせがバラバラであることを指します。
その後、もちろんOSやライブラリなどもピンと来ていないので、何ラリーかしたあと、私は以下のようにDockerを解釈しました。
以上のように整理したうえで、だとしたらDockerの構成にはこれが必要だろうというのを推測してみました。
1.特定のOS、ライブラリなど指定するパーツ
2.開発したアプリのプログラムを1の環境で動かす仕組み
(イメージとしては、私たちは普段PCにあるOSやライブラリを無意識に使っていますが、それをどうにかして指定するといった感覚です。)
実際に調べてみると、Dockerの実態について以下のことがわかりました。
開発者が「Dockerfile」を用意する
まず、アプリの構成を書いたDockerfileという名前の設計図を作成する
ベースとなる環境を指定する
設計図の中で、土台となるOS(Linuxなど)や、動かしたい言語のライブラリ(PythonやNode.jsなど)を指定する
アプリのプログラムを組み込む
作成したプログラムを設計図の中にコピーするよう指示し、アプリが動く「専用のパッケージ」を作る準備をする
「Dockerイメージ」を作成(ビルド)する
Dockerfileをもとに、「Dockerイメージ」を生成する
※イメージとは:
アプリを実行するために必要なすべて(OS・ライブラリ・プログラム)を一つにまとめた「スナップショット」や「金型」のようなもの
※コンテナとは:
イメージという金型から作られた「実体」。このコンテナの中でWebアプリの起動コマンドが実行され、実際にユーザーがアクセスできる状態になる
私の推測は粒度が粗いものの、実はDockerの構成はおおむね推察通りの単純な構造であることがわかりました。
次章では実際にDockerfileを書き、イメージをビルドしてコンテナを起動してみます。
参照元:pexels,https://www.pexels.com/ja-jp/photo/3077882/
なんとなくのイメージはつかんだものの、いざコードを書こうとすると初心者はたちまち手が止まってしまいます。
そのため、理解を進めるために初心者でも手が付けやすい単純な最小構成でDockerを使用してみました。
まずはDocker公式ページからDocker Desktopをダウンロードします。
ダウンロード後、Dockerを起動し、任意のターミナル(OSのコマンドラインツールやVSCodeなど)で以下のコマンドを打ちます。バージョン番号が表示されればインストール完了です。
# インストール確認用コマンド
docker --version
# 正常にインストールが完了している際の結果
Docker version XX.X.X(バージョン番号), build XXXXXXX(ビルド番号)
この時点では、Docker Desktopを開いても以下のうに起動前の「Starting the Docker Engine」という画面が表示されます。
画面キャプチャ: Docker Desktop
次に最小構成の開発プログラムをDockerを使用して起動するための最小コードを書いてみます。今回はPythonを使用しています。
# 用意するファイルとディレクトリ構造
project
├── Dockerfile
├── docker-compose.yml
└── app
└── main.py
①まずは、app/main.pyファイルに以下の「Hello Docker World!」と表示するプログラムを作成します。
# app/main.py
# FastAPIはPython用のWebフレームワーク
from fastapi import FastAPI
# URL "/" にアクセスしたときに、「Hello Docker World!」と表示されるコード
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "Docker World!"}
※Webフレームワーク
WebサイトやWebアプリを開発するために必要な共通機能がまとめられた土台・骨組み
②次に、Dockerfileファイルに以下のコードを記載します。 前述の「Dockerによるアプリ公開の流れ」で述べたように、OSやライブラリの設定、開発したプログラムをコピーします。最後にはWebアプリとして公開する命令文が記載されています。
# Dockerfile
# ベースとなるOS(Pythonが入った軽量版Linux)
FROM python:3.9-slim
# コンテナ内の作業ディレクトリを決定
WORKDIR /app
# 必要なライブラリをインストール
# FastAPIはPython用のWebフレームワーク
# uvicornはFastAPIを動かすためのサーバ
RUN pip install fastapi uvicorn
# 自分のPCのファイルをコンテナにコピー(開発プログラムのコピー)
COPY . .
# アプリを起動
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8081"]
# コンテナ内のツリー構造
app
└── app
└── main.py
③最後に、docker-compose.ymlファイルに以下のコードを記載します。ここでは、ポートの紐付けをしています。
Docker内のアプリは8081で動いていますが、外側の8080からアクセスします。この「トンネル」をこちらのYAMLで定義しています。
これでどのPCでDockerを起動しても、8080ポートからアクセスすると、同じ環境でアプリを動作できます。
# docker-compose.yml
services:
web:
# 「カレントディレクトリ(.)にある Dockerfile を使って、
# イメージを作成(build)しなさい」という命令
build: .
# ポート転送設定
# 左側(8080)が「ホスト(あなたのPC)」に来た通信を
# 右側(8081)が「コンテナ(Docker内部)」に転送
ports:
- "8080:8081"
最後に、以下のコマンドでDockerのコンテナを作成し、起動します。
以下記載の正常起動時の出力結果が表示されれば、正常に起動されていますので、実際にhttp://localhost:8080にアクセスして出力結果を見てみましょう。
# Dockerの起動コマンド
docker compose up --build
# 正常起動時の出力結果
[+] up 1/1
✔ Container project-web-1 Started
Dockerの起動がうまくいくとDocker Desktopは以下のように、コンテナ名と起動中を表す緑色の〇マークが画面に表示されます。
画面キャプチャ: Docker Desktop
http://localhost:8080にアクセスすると、「Hello Docker World!」と表示されることが確認できます。
画面キャプチャ 「Hello Docker World!」出力結果
今回私が学んだことはDockerの基礎のみならず、実際に手を動かして理解を深める重要性です。
単語を拾うだけでは中々イメージできないものも、実際に手を動かしてみると、理解しやすくなります。 また、普段われわれが実際にはシンプルなものを難しく捉えがちであることもよくわかりました。
特に、IT分野は横文字が多く、日常生活では使わない言葉にありふれているので、単語とにらめっこするよりも、まずは最も簡単な構成を自分で実験してみることが理解促進に効果的だと思いました。
本記事では、IT未経験から転職した私がDockerを知り、理解するまでのステップを解説しました。
整理すると、Dockerとは特定のOS、ライブラリなど指定した環境を作り、どのPC(人間)でも同じ環境を使用してアプリ開発をするための技術です。
本記事では、Dockerの導入・理解の部分にとどめますが、さらなる発展として、「Dockerを実際に使用してみた」項のプログラムをより複雑化したり、データベースと連携することでより実際の開発に近い構成ができると考えます。
次の目標として、私はデータベースとの連携を加えてデータの保存・更新・削除が行える簡単なWebアプリをDockerで起動させてみたいと思います。
最後までご拝読いただきありがとうございました。