1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Webアプリ開発においてよく使うDockerの基礎概念のまとめ

Last updated at Posted at 2024-10-07

概略

たまにしかDockerを触らずに忘れちゃうので備忘録として残しておくものです。
Webアプリ開発時によく使う項目を自分用にまとめました。

基本のコマンドと図解

docker run -it ubuntu bash

ubuntuのコンテナを起動して、そのコンテナの中のbashを起動する

流れとしては
ホストにubuntuのイメージがなければdockerhubから持ってくる
そのubuntuのイメージからコンテナを起動
コンテナの中のbashを起動する

-itオプションによって、コンテナの中に入って作業できる
コンテナから出るときは'exit'

runはイメージからコンテナを起動してコマンドを実行する
execは既存のコンテナでコマンドを実行する

image.png

Dockerfileについて

Dockerfileとイメージとコンテナの相関図
image.png

PythonアプリケーションのルートにあるDockerfileの例

# コンテナのベースとなるイメージを指定している。ローカルになければpullしてbuildする
FROM python:3.11.3-buster

# ENV 環境変数の設定。
ENV PYTHONDONTWRITEBYTECODE=1

# RUN コンテナの中でコマンドを実行
RUN mkdir /code

# WORKDIR 作業ディレクトリの設定。以降のコマンドはcodeにて実行される
WORKDIR /code

# Dockerはbuildを実行するときに、ホストマシンのファイルシステムを参照することができる。
# ホストマシンのDokcerfileがあるディレクトリがルート(./)となる。これをcontextという(composeに直接記載がある)
# context(ホストマシンの今のディレクトリ)の中にあるrequirements.txtを、コンテナの中のcodeディレクトリにコピーしている
COPY ./requirements.txt /code/

# RUN コンテナの中でコマンドを実行。&&\で先のコマンドが成功した場合のみ次のコマンドを実行
RUN pip install -U pip && \
    pip install -r requirements.txt

# context(ホストマシンの今のディレクトリ)のルートディレクトリに存在するappディレクトリをコンテナ内のcodeディレクトリにコピー
COPY ./app /code/

これらのFROMや、COPY、RUNなどはDockerfileの命令「instruction」と呼ばれる。
COPY ./requirements.txt /code/ は画像のようなことをしている。
image.png

-v ボリュームの概念について

docker run -it -v ~/hogedir/mountedfolder:/containerdir イメージ名

image.png

-v host:container オプションによって、ホストのファイルなどをコンテナにマウントすることができる。
-v にも何個か種類があって今回の手法はバインドマウントと呼ばれるもの。
開発中のコードの変更が双方向に即時反映される。

-vはvolumeという概念の略。下の記事が非常にわかりやすかった。

docker compose について

docker run コマンドが長いときや、複数のコンテナを起動する際に使う。
Dockerfileがコンテナの定義、docker-compose.ymlはコンテナをどう起動するかという感じ。

docker-compose.yml


# docker-composeのバージョンを指定
version: "3.9"

# サービス = コンテナ。db(MySQL),app(Flask)のコンテナを作成
services:
  app:
    container_name: Flask # コンテナ名をFlaskに設定
    build: # FlaskのDockerfileをビルドする。dockercompose.ymlがあるディレクトリがコンテキストのルートとなる。
      context: .
      dockerfile: Docker/Flask/Dockerfile
    volumes: # ローカルのカレントディレクトリにあるChatAPPをコンテナの/codeにマウントする
      - ./ChatApp:/code
    ports: # ローカルの5000番ポートとコンテナの5000番ポートをつなぐ
      - "5000:5000"
    command:  bash -c "python app.py"
    # 先にdbコンテナを起動してからappを起動する
    depends_on:
      db:

  db: # dbコンテナの設定を定義
    container_name: MySQL # コンテナ名をmysqlに設定
    build: # MySQLのDockerfileをビルドする。ビルドコンテキストはこの場合だとdockercompose.ymlのあるディレクトリ
    context: .
    dockerfile: Docker/MySQL/Dockerfile
    volumes: # 命名ボリューム。ホスト側に直接mysql_dataというディレクトリが作成されるわけではないが、Dockerが管理する領域(例: /var/lib/docker/volumes/mysql_data/_data)にデータが保存される。この命名ボリュームmysql_dataを、コンテナの/var/lib/mysqlにマウントしている。
      - mysql_data:/var/lib/mysql
    environment: # コンテナ内の環境変数を設定
      - MYSQL_ROOT_PASSWORD=hoge
      - MYSQL_DATABASE=hogeapp
      - MYSQL_USER=hogeuser
      - MYSQL_PASSWORD=hogeuserpass

volumes: # 命名ボリュームを定義。命名ボリュームはコンテナを停止・削除してもデータが保持されるようにするための永続化ストレージのこと
  mysql_data: # 名前は任意。
  

命名ボリュームとバインドマウントの違いについて、

よく使うコマンドまとめ

イメージからコンテナの起動

docker run イメージ名

イメージ一覧

docker images

composeでコンテナを(イメージがなければ)ビルドしてrunする

docker-compose up

composeでコンテナをビルドしてrunする。(imageを最新にできる)

docker-compose up --build

composeに定義されたコンテナの状態を確認

docker-compose ps

composeで起動したコンテナをstopしてrm

docker-compose down

参考リンク集

公式

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?