0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ちょっとわかった!Docker

Last updated at Posted at 2025-03-30

はじめに

Docker の面白さ・便利さに気づき始めたので、他の人にも伝えるべく記事を書きます。

(2025/03/30 追記)
↓ たいへん勉強になった本。Docker のホストマシン上での動きが基礎から解説されています。まずこれを読みましょう。
実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本

Docker よく使うコマンド

一覧コマンド
# イメージ一覧
docker images
# コンテナ一覧
docker ps
docker ps -a
# 内部一覧
docker image inspect <イメージ名>
docker container inspect <コンテナ名>
docker volume inspect <ボリューム名>
お掃除コマンド
# コンテナ全停止
docker stop $(docker ps -aq)
# イメージ・コンテナ・ボリューム一括全削除(ただし使用中のものは消せない)
docker system prune -a
# イメージ・コンテナ・ボリュームそれぞれ全削除
docker image rm $(docker image ls -aq)
docker container rm $(docker container ls -aq)
docker volume rm $(docker volume ls -q)
# 状態確認
docker system df
コンテナ操作系
# Docker Hub からイメージを持ってくる
docker pull <イメージ名>
docker pull ubuntu:20.04

# Hub から持ってくるのではなく、自分でイメージを作成(Dockerfile と同階層でコマンドを実行)
docker build -t <任意のイメージ名> .
docker build -t my_image .

# イメージのレイヤー(構成要素)を確認
docker history <イメージID>

# イメージからコンテナを起動する(create + start)
docker run <イメージ名>
# ↓ これはすぐ停止状態になる(理由は下のメモ参照)
docker run ubuntu:20.04
# ↓ これは起動状態を維持する
docker run -it ubuntu:20.04 bash
# ↓ これも維持
docker run --name <任意のコンテナ名> -p <任意のホスト側ポート番号>:<任意のコンテナ側ポート番号> <イメージ名>
docker run --name docker-getting-started -p 80:80 docker/getting-started

# コンテナを作るだけ(start待ち)
docker create <イメージ名>
docker create --name my_ubuntu_container ubuntu:20.04

# コンテナを一時停止・再開する
docker stop/start <コンテナ名>
docker start my_ubuntu_container

# 起動状態のコンテナの中に入る。bash がダメなら sh など試す
docker exec -it <コンテナ名> bash

コンテナが run した瞬間停止状態になる理由
大事なコンテナ原則
・コンテナはメインプロセスを実行するために起動する
・メインプロセスが終了したコンテナは自動で停止する
実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本より)

具体例として、「docker run ubuntu:20.04」でコンテナ作成&起動はされるが、メインプロセスを指定していないので終了扱いですぐ停止される。
一方「docker run -it ubuntu:20.04 bash」はメインプロセスとして「bash」を指定しているので、私たちがコンテナ内で bash 操作している間は停止しない。bash から exit したらメインプロセス終了で停止される。

nginx イメージとか、ものによってはデフォルトでメインプロセスが指定されているものもあり、そういうのは起動した瞬間停止されることがない。

オプション例
オプション 説明
-d --detach。デタッチモード。コンテナがバックグラウンド実行され、ターミナルはブロックされない
-p --publish。-p 5000:5001なら、ホストの5000番はコンテナ内の5001につながっている
-f --force。起動中のコンテナを、停止を経由せずいきなり消すときに使う
--rm コンテナが停止されたとき自動的にコンテナを削除する
-e 環境変数(例:-e PASSWORD=password)
-v ボリュームの設定(例:-v my-volume:/my-data)
-it --interactive と --tty。コンテナに入るときに使う
--network 使用ネットワーク指定(例:--network networkname)

Dockerfile と compose.yaml を動かしてみる

こちらのリポジトリ に、React + FastAPI + postgreSQL の最小構成テンプレートを公開しています。
お手元にクローンしていただき、Dockerfile や compose.yaml をご確認ください。

Dockerfile その他できること

テンプレートリポジトリでは使わなかったけれど、他で使えそうなことをまとめます。

Dockerfile
# apt-get コマンドを「&&」で連結する。
# RUN RUN RUN と1個ずつ書いてしまうと、レイヤー数が増えてイメージが大きくなってしまうため。
# さらにメリットとして、Docker のキャッシュのせいで2回目以降一部 RUN されないといったエラーも回避できる。
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    build-essential \
    libpq-dev \
    curl \
    && rm -rf /var/lib/apt/lists/*

# root ユーザではなく、新しく作ったユーザ(appユーザ)で作業することができる。
RUN addgroup --system app && adduser --system --ingroup app app
RUN chown -R app:app /app
USER app
# root ユーザにも戻せる
USER root

compose.yaml その他できること

テンプレートリポジトリでは使わなかったけれど、他で使えそうなことをまとめます。

compose.yaml
services:  

  service-1:
  
    # Dockerfile の CMD や ENTRYPOINT の上書きができる。
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    entrypoint: "/bin/sh -c 'npm install && npm run start'"

    # 使うネットワークを指定できる。
    networks:
      - coffee

# 使うネットワークを指定できる。
networks:
  coffee:
    ipam:
      driver: default
      config:
        - subnet: "192.168.92.0/24"

関連:compose.yaml

  • composerizeで docker run コマンドから compose.yaml を作成することができる。
  • ボリュームマウントのファイルの保存場所は \wsl.localhost のdocker-desctop-data 配下にある(こちらのYoutubeで詳しく解説されています)← Mac では Finder からは見られないようです…。
    Screenshot (244).png

おわりに

Docker に関する知識を整理できてよかったです。
知らないオプション設定がたくさんあるので、また必要に応じて勉強したいです。

参考にさせていただいた記事

0
2
0

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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?