はじめに
Dockerを最近学習していたので勉強がてら書いていきます。
かなり簡単に実施するので実際の現場で使うものとは違いますが、どんなことができるのか考え方について触れていきます。
やりたいこと
Dockerコンテナで、pythonのhttp.server
を使用して簡単なHTMLのページを表示する。
今回はコンテンツの内容ではなく、Dockerでウェブサーバーを構築する考え方や手順について記載していきます。
かなり初歩的な内容になりますのでご了承ください。
ファイル構造
全体のファイル構造としては以下です。
.
├── docker-compose.yml
├── dockerfile
├── index.html
└── server.py
server.py
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print(f"Serving at port {PORT}")
httpd.serve_forever()
import http.server
pythonの標準ライブラリの一つで、HTTPリクエストに対して同ディレクトリのHTMLファイルを返せるようになります。
import socketserver
これもpythonの標準ライブラリの一つで、PORTで指定したポート番号で待機し、クライアントからリクエストが来た際にTCP通信が可能になります。
今回ではDockerでコンテナを起動した際にこのファイルを実行させるようにしていきます。
index.html
クライアントからのHTTPリクエストが来た際に表示されます。今回はおなじみのHello Worldにします。
<!-- index.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Simple Web Server</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
Dockerfile
FROM python:3.9-slim
WORKDIR /app
CMD ["python" , "server.py"]
FROM python:3.9-slim
ここではベースイメージを指定しています。
この行で指定したベースイメージを元に、このあと、dck-compose.ymlでイメージの作成を行います。
WORKDIR /app
ここではコンテナを起動させた際の作業ディレクトリを指定します。
後でdocker-compose.ymlファイルで、ここで指定した作業ディレクトリ(app)に、カレントディレクトリを同期させます。
CMD ["python" , "server.py"]
コンテナ起動時に実行するコマンドを指定します。
上記では、python server.py
が実行されます。
docker-compose.yml
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8000"
volumes:
- .:/app
services:
app:
ここでは複数のコンテナを起動させることができます。
今回はapp
という名前でコンテナを起動させます。
build:
context: .
dockerfile: Dockerfile
イメージをビルドします。context
でカレントディレクトリを指定し、dockerfike
でファイル名を指定します。
カレントディレクトリにある、Dockerfileを使用してイメージをビルドします。
ports: - "8080:8000"
ポートマッピングを行います。ローカルの8080ポートにアクセスすると、Dockerコンテナの8000ポートに通信が転送されます。
volumes: - .:/app
ここではローカルのカレントディレクトリを、Dockerのapp
ディレクトリにマウントします。
このapp
はDockerファイルのWORKDIR /app
で指定したディレクトリです。
実践
docker-compose up -d
上記コマンドでDockerコンテナをバックグラウンドで起動させます。
具体的には以下のような処理が行われます。
-
build
で指定したDockefileを元にイメージをビルド - イメージからコンテナを作成
- 作業ディレクトリ
/app
にローカルのカレントディレクトリがマウント(同期)される -
python server.py
を実行 - 8000ポートでHTTPリクエストを受け付けるようになる
http://localhost:8080
にアクセスすると、8080ポートは8000ポートに転送され、Dockerコンテナで実施したserver.pyによってリクエストが処理されます。
今回はHello World
が表示されればOKです。
最後にdocker-compose down
でコンテナを停止させます。
終わりに
Dockerは実務でもよく目にするのでしっかり理解していきたい。。
次回はDockerでよく使うコマンドも少しまとめようかと思います!