技術書庫 101号室

技術知見をまとめます。それ以外のこともたまに書きます。

初心者がまとめる初心者のためのDocker入門

Dockerとは何か

  • データやプログラムを隔離することができる仕組み
    (≒一つの物理サーバーに機能としてのサーバーを複数同居することができる)
  • この隔離する単位のことをコンテナという
  • コンテナを操作する仕組みを Docker Engine という

Dockerのメリット

  • ライブラリやソフトウェアのアップデートによる影響範囲を隔離されたコンテナ内で収めることができる
  • コマンドや設定ファイルのみで簡単に環境作成や削除ができる
  • 軽量である

Dockerが軽量である理由

  • 前提として Docker Engine はlinux環境でのみ動作する(=物理マシン上にlinuxがインストールされている必要があり、そのlinux上で Docker Engine は動作する)
  • 作成したコンテナ内にはlinuxがインストールされているがOSが丸々インストールされているわけではなく、ディストリビューションに当たる機能(IO機能など)のみがインストールされている
  • コンテナ内でプログラムが動作する際、コンテナは物理マシン上のlinuxカーネルを借りている、そのため余分なカーネルをコンテナ内にインストールする必要がないため動作か軽量になる

イメージとコンテナ

イメージとは

  • コンテナのもととなる設計図(ISOファイルのようなアーカイブファイルみたいなもの)
  • コンテナからもイメージファイルを作ることができる

ボリュームとマウント

ボリュームとは

マウントとは

  • ストレージや機器(マウスやキーボードなど)をOSやソフトウェアに認識させること
  • Dockerの文脈では、コンテナにボリュームを認識させて操作できるようにすること

Dockerにおける二つのボリュームのマウント方法

ボリュームマウント

  • Docker Engineが管理する領域内にボリュームを作成して、ディスクとしてコンテナにマウントさせる方法
  • コンテナを介して操作することが主なので、直接操作しづらい、滅多に触らないけど消してはいけないファイルなどに利用する

バインドマウント

  • ホストOSのディレクトリをコンテナにマウントさせる方法
  • ホストOS上にあるディレクトリ内を操作するだけでコンテナにも反映できるため、簡単に操作できる、頻繁に更新が起こるファイルなどに利用する

コンテナをイメージ化する方法

docker commit によるイメージ書き出し

  • コンテナをイメージとして書き出す方法

Dockerfileによるイメージ書き出し

  • Dockerfileに元となるイメージや実行コマンドを書き、それをビルドしてイメージを書き出す方法

コンテナへの操作

  • docker exec コマンドでlinuxコマンドを使用することができる
  • docker run 時にコマンドを付与することもできるがbash等のソフトウェアを動かすよう指定すると、コンテナで元々起動する予定だったソフトウェアが起動しなくなる
  • ただ、起動しているコンテナに対してbash起動しても動く

Docker Compose

Docker Composeとは

  • コンテナ作成やボリュームのマウント、ネットワークの設定を一つのyamlファイルで管理することで一括で複数のコンテナを作成できるソフトウェア

Dockerfile と Docker Compose は何が違うのか

  • Dockerfileは「イメージ」のみを作成することができる、コンテナ自体やネットワーク、ボリュームのマウントなどはできない
  • Docker Composeはコンテナ、ボリュームマウント、ネットワークの設定などを一挙に行うことができる

【Docker】docker-compose.yml 各項目の記述方法【備忘録】

TL;DR

久しぶりにVSCodeのremote container拡張機能を使って開発していた時に、docker-compose.ymlの書き方をかなり忘れていたので備忘録としてまとめておく。 適宜更新予定。

ファイル例

version: '3'
services: 
    web:
        build: .
        ports:
            - "11324:1324"
        volumes: 
            - .:/go/src/go_test/
        working_dir: /go/src/
        restart: always
        command: sleep infinity
        container_name: go_test_container

各要素の説明

version

使用するdocker-composeのバージョン番号を記述する。

services

サービス(動作させるアプリケーション)の設定を名前を付与して設定・追加する。 例のyamlファイルだとwebがサービス名にあたる。

build

ビルドするDockerfileをyamlから見た相対パスで記述する。

ports

ホストマシンのポートとコンテナのポートを下記の通りに紐づける。

ports:
  - "HOST_PORT:CONTAINER_PORT"

例のyamlファイルだと、port番号1324でリクエストの待ち受けをした場合、ホストマシンではport番号11324にアクセスすることでリクエストを送ることができる。

volumes

ホストマシンのディレクトリをコンテナのディレクトリに下記の通りにマウントする。
例のyamlファイルだとyamlファイルがあるディレクトリの内容をコンテナの/go/src/go_test/ディレクトリにマウントして、コンテナ側でも利用できるようになる。

volumes: 
  - HOST_DIR:CONTAINER_DIR

working_dir

コンテナ起動時の初期位置となるディレクトリを記述する。

restart

コンテナが停止した際の再起動やコンテナの開始に関連する設定を記述する。
常に起動しておいて欲しいWebアプリケーションサーバーなどはalwaysでいいのかな、という感じ。
設定値は下記の通り。

設定値 説明
no コンテナを自動的に再起動しない。デフォルト値。
on-failure プロセスが0以外のステータスで終了した時のみ、再起動を行う。
always 停止時には必ず再起動を行う。
unless-stopped alwaysと似ているが、Docker daemonが再起動してもステータスが終了状態なら再起動はしない。

ここの理解は公式リファレンスと別の方の記事を参考にさせていただきました。

docs.docker.com

junchang1031.hatenablog.com

command

コンテナ起動時に実行するコマンドを記述する。

container_name

コンテナの名前を記述する。

参考

Start containers automatically | Docker Documentation

Docker Compose restart の挙動 - 技術備忘記

Compose ファイル バージョン 3 リファレンス | Docker ドキュメント