💬

Docker

に公開

Dockerとは

Dockerとは、アプリケーションを「コンテナ」と呼ばれる単位でまとめて動かすためのプラットフォームです。

Dockerの特徴

・軽量:仮想マシン(VM)のように重いOSごと動かすのではなく、ホストOSのカーネルを共有しているので高速・軽量です。
・環境の統一:同じDockerイメージを使えば、Windows・Mac・Linuxどこでも同じ挙動が再現できます。
・簡単:Dockerfileという設定ファイルを書くだけで、誰でも同じ環境を再現できます。

主な用途

・開発環境の構築
・本番環境へのデプロイ
・テストの自動化
・マイクロサービス構築

本番運用するメリット

https://chatgpt.com/share/6817236e-bcbc-800e-935a-562bf5970b37

DockerDesktop

GUIでDockerを操作できるソフト
https://chatgpt.com/share/681319ad-0cb8-800e-9d73-6511c5c5d634

DcokerToolBoxとDockerDesktopはどちら使用すればよい?

https://chatgpt.com/share/6817275e-86fc-800e-992e-4fc7ad767bcd

Dockerの基本

Dockerイメージ

アプリケーションを動かすために必要なコード、ライブラリ、環境設定などをひとまとめにした実行パッケージ。
このDockerイメージをもとにコンテナが作成される。

Dockerイメージの入手方法

Docker Hub からプルする
docker runで自動取得
プライベートレジストリ(例: GitHub Container Registry, GitLab Container Registry, AWS ECRなど)から取得
Dockerfileから自分でビルド
tarファイルなどで直接もらう
https://chatgpt.com/share/6812f9d8-8768-800e-a632-eb8db2592aa2

コンテナのライフサイクル

作成(Create)
起動(Start)
実行中(Running)
停止(Stop)
一時停止(Pause)
再起動(Restart)
終了(Exited)
削除(Remove)
https://chatgpt.com/share/6812faff-1484-800e-aec7-70eecbc51769

Dockerコマンドの新旧

https://chatgpt.com/share/68130d45-2dc8-800e-8c04-9fda93a875c5

ローカルに保存されている Docker イメージの一覧を表示するコマンド

docker image ls
https://chatgpt.com/share/681300ce-7b9c-800e-87ec-94d5fc7d9faa

ローカルにあるDockerイメージを削除するコマンド

docker image rm [イメージIDまたはイメージ名]
https://chatgpt.com/share/681355ab-d02c-800e-8366-9c343f38b402

新しいコンテナを起動するためのコマンド

docker container run イメージ名
ローカルにイメージがある場合 → そのまま即起動
ローカルにイメージがない場合 → 自動でイメージをダウンロードしてから起動
https://chatgpt.com/share/681303c0-65b0-800e-8fbd-7ac0c43c7906

現在実行中のコンテナ一覧を表示するコマンド

docker container ls
全ての状態のコンテナ一覧を表示するコマンド
docker container ls -a
https://chatgpt.com/share/681305f8-7db4-800e-882e-9bd56495b849

指定したコンテナを停止するコマンド

docker container stop コンテナ名またはID
https://chatgpt.com/share/68130b60-6e18-800e-92ad-dbcff8afcc28

指定したコンテナを再起動するためのコマンド

docker container restart コンテナ名またはID
https://chatgpt.com/share/68130c05-f578-800e-9437-a723ddf1d37f

指定したコンテナを削除するコマンド

docker container rm コンテナ名またはID
https://chatgpt.com/share/68130c87-f724-800e-84fc-da86e854a6b6

新しいコンテナを作成起動し、コマンドを打てる状態にするコマンド

docker container run -it イメージ
https://chatgpt.com/share/681324a9-0f38-800e-9fb7-b30183963e99

Dockerイメージの詳細情報を確認するコマンド

docker image inspect <イメージ名>:<タグ>

[
    {
        "Id": "sha256:1e4467b07108...",
        "RepoTags": [
            "ubuntu:20.04"
        ],
        "Created": "2024-03-10T14:00:00.000000000Z",
        "Size": 72705900,
        "Architecture": "amd64",
        "Os": "linux",
        "Config": {
            "Cmd": [
                "/bin/bash"
            ],
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            ...
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:abc123...",
                "sha256:def456..."
            ]
        }
    }
]

https://chatgpt.com/share/68132589-e9f4-800e-b719-ac1b7fdc72a8

新しいコンテナを作成起動し、自作のコマンドを実行するコマンド

docker container run イメージ名 自作コマンド
https://chatgpt.com/share/68132696-5c50-800e-8d6e-97d019206b93

すでに起動中のコンテナの中でコマンドを実行(新たにコンテナは作成しない)するコマンド

docker container exec コンテナ名またはID コマンド
https://chatgpt.com/share/681339b6-289c-800e-8ff1-33dd78894f4b

コンテナ作成時、コンテナ名をつけるコマンド

docker container run --name <コンテナ名> <イメージ名>
https://chatgpt.com/share/68135b02-20b0-800e-8071-a4dd46440ce7

一括削除するコマンド

・停止しているコンテナを一括削除
docker container prune
・ボリューム削除
docker volume prune
・ネットワーク削除
docker network prune
・イメージ削除(未使用のもの)
docker image prune
・全部まとめて削除
docker system prune
https://chatgpt.com/share/68135b51-83fc-800e-9de5-144019e693d3

フォアグラウンドモード(通常モード)とデタッチドモード(バックグラウンドモード)

https://chatgpt.com/share/68134836-a460-800e-bd0d-96b0357d77df
デタッチドモードからフォアグラウンドモードに切り替える
https://chatgpt.com/share/681348ba-82bc-800e-bfeb-c99339d46a2d

イメージレイヤーとコンテナレイヤー

https://chatgpt.com/share/68145922-6070-800e-a437-1f58c1a0162b

コンテナのデータの永続化

以下の2種類ある。
ボリューム(Volume)
バインドマウント(Bind Mount)

複数のコンテナ間でのデータ共有可能?

ボリュームとバインドマウント可能

ホストからデータアクセス可能?

ボリュームは不可
バインドマウントは可能

ホストの環境に依存する?

ボリュームは不可
バインドマウントは可能
https://chatgpt.com/share/68145c1a-2f08-800e-8508-7b40721c228e

ボリューム(Volume)のコマンド

https://chatgpt.com/share/68145c33-8e80-800e-9dd1-543b07cdbf55

バインドマウント(Bind Mount)のコマンド

https://chatgpt.com/share/68146b1a-822c-800e-a28b-f498372b1db3

ホストマシーンとコンテナのポート番号を紐づけるコマンド

docker container run -p <ホスト側ポート>:<コンテナ側ポート> イメージ名
https://chatgpt.com/share/68147248-40dc-800e-83fa-41bc433b1a3b

異なるコンテナ間で通信するコマンド

https://chatgpt.com/share/68147723-9408-800e-b890-39ea6ddb8381
https://chatgpt.com/share/68147794-f790-800e-b6df-4913372d278c
https://chatgpt.com/share/681493d3-5778-800e-8e4f-8cc2af161ea6
なお、異なるネットワーク間は通信できない

DockerFile

DockerFileとは

自作でDockerイメージを作成するためのテキストファイルのこと。

レイヤー構造とは

https://chatgpt.com/share/68141833-16c8-800e-b1f7-609b99b5e703

記述

https://chatgpt.com/share/6813faaa-9e14-800e-9ba2-e87462861a7c
ARGでイメージ作成時(docker build)だけ変数を扱う
https://chatgpt.com/share/681422f4-cadc-800e-8c64-a149bdce11ad
ARGとENVの使い分け
・ARG:
セキュリティ的に残したくないもの(例:APIキー、トークン)※ただし完全なセキュリティ保証ではない。
ビルドプロセスでしか必要ないもの(例:特定のビルドフラグやバージョン指定)。
・ENV:
コンテナ実行中にも使いたいもの(例:DB接続設定、アプリ環境名など)。
https://chatgpt.com/share/6814260b-554c-800e-8531-df2c87ff339a
WORKDIRとcdの違い
https://chatgpt.com/share/681427d1-e600-800e-b970-662f1e10372c

DockerFileとビルドコンテキスト

ビルドコンテキストは、
docker image buildコマンドを実行するときの、指定するディレクトリのことである。
以下の例でいうと
docker build -t myapp .
この . が「ビルドコンテキスト」です。
Dockerはこのディレクトリ(とそのサブディレクトリ)内のすべてのファイルにアクセスできるので、
・COPY ./src /app/src
・ADD myscript.sh /usr/local/bin/
のようなファイル指定がこの範囲内で動きます。

重要ポイント

・Dockerfileはビルドコンテキスト内に置くのが基本です(ただし-fで外にあるDockerfileを指定することもできます)。
・ビルドコンテキストが広いと、不要なファイルも送信してしまうので、.dockerignoreで除外リストを書くのがベストプラクティスです。

DockerFileからimageを作成するコマンド

https://chatgpt.com/share/6813fb8a-84b8-800e-a240-0cf3f8afb2c6

-fで外にあるDockerfileを指定する方法

https://chatgpt.com/share/68140950-1428-800e-9cbe-aff1e3bc8eb3

.dockerignoreで無駄なファイル・フォルダをビルドコンテキストに含めないようにする

https://chatgpt.com/share/6814115b-2c40-800e-b844-26d28e987ccc

DockerFileの容量を削減

https://chatgpt.com/share/68141940-bbf8-800e-9d52-754b1dc69d75
RUNの中にコマンドを一行でまとめて書くのは容量が小さくなるが、もし変更があった場合にまた再度キャッシュを利用せずにビルドする必要があるため一行一行書いていくかはケースバイケース。

マルチステージビルドについての詳しい説明
https://chatgpt.com/share/68144e93-df84-800e-884f-df3cfab7e5e5
マルチステージビルドで一つのDockerFileで開発環境と本番環境で処理を分けたり、共通処理は同じにして容量を削減したりする
https://chatgpt.com/share/681450ea-7344-800e-98a0-8f6881fb560e

Docker Compose

Docker Composeとは

複数のDockerコンテナをまとめて定義・実行できるツール。
通常、Docker単体では1つのコンテナをdocker runコマンドで起動しますが、実際のアプリケーションは、
Webサーバー
データベース
キャッシュ(Redisなど)
といった複数のコンテナを連携させて動かすことが多いですよね。
そのときに役立つのがDocker Composeです。

特徴

・YAMLファイル(docker-compose.yml)で定義
コンテナの構成、ボリューム、ネットワーク、環境変数などを1つのファイルにまとめます。

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:80"
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: secret

・コマンド1つで一括操作
docker-compose up
これだけで定義したすべてのコンテナが一斉に起動します。
・ネットワークが自動構築
同じComposeファイル内のコンテナ同士は、自動的にブリッジネットワークで接続され、コンテナ名で名前解決できます。
・環境の統一
チーム開発や本番環境と同じ構成をローカルでも簡単に再現できます。

記述

https://chatgpt.com/share/681556ed-d8f4-800e-8be6-9ec694ab679d
https://chatgpt.com/share/6815709a-e4ec-800e-a470-ff74da9afe21
https://chatgpt.com/share/68158bb2-daf8-800e-8005-fa24bdc217a7

コマンド

https://chatgpt.com/share/68155ac5-d5b8-800e-afb4-3edf78b652e5

VscodeのDev Containersでdockercompse.ymlでコンテナごとに異なるExtensionsで環境構築を行う

https://www.udemy.com/course/ok-docker/learn/lecture/36662034#questions
https://chatgpt.com/share/68158135-2cb4-800e-86b6-9fc94ace4880

本番環境で異なるコンテナ間で通信する際に、IPアドレスで指定するのではなくコンテナ名で指定して通信を行う

https://www.udemy.com/course/ok-docker/learn/lecture/36662038#questions

Discussion