集中力が10分しか持たないハチワレ先生

集中力が10分しか持たないハチワレ先生

技術メインの雑記ブログ

10 分で入門する Docker(初級編)

こんにちわ、krkettleです
Docker を使う上で最低限必要な知識のみを厳選して説明していきます

この記事を読んで分かること

  • Docker の状態とコマンドの関係性を示した下図の意味が分かる
    • 本記事では docker コマンドにフォーカスして説明していきます
    • Docker 自体の基本知識や、概念を知りたい方は10 分で入門する Docker(概念編)を参照して下さい
  • 以下の Docker コマンドについて紹介します
    • pull, rmi
    • create, rm
    • start, stop
    • run
    • attach, exec
    • images, ps

Docker遷移図
Docker遷移図

前提条件

  • 対象者
    • Docker の全体像をサクッとつかみたい人
    • Docker やコンテナ技術を聞いたことはあるけど、よく分かってない人
  • この記事で紹介しないこと
    • Docker の基礎知識や概念
    • Dockerfile、マウント、ネットワークなど

Docker についての基礎知識

10 分で入門する Docker(概念編)から抜粋して紹介します

Docker 使うと何が嬉しいの?

Docker を使う利点は主に以下の 2 点だと思っています

  1. Docker がインストールされていれば環境の横展開(共有・複製等)が容易
    • OS の種類に関わらず同じ環境を起動することができる
  2. 他の仮想化技術に比べて軽量で高速のため、スクラップ&ビルドが容易
    • 手順書やホスト OS の違いを意識したスクリプトを作成せず、コマンドで環境構築ができる

Docker ってざっくり言うと?

  • コンテナ型仮想化技術と呼ばれ、 1 台のホストマシンから複数の OS を同時に動作させることが可能
  • Docker イメージから Docker コンテナを起動することで、比較的簡単に仮想環境を利用できる
  • Docker レジストリから Docker イメージを簡単にダウンロードできる

Docker コマンドを実行して Python 環境を整える

この章では 以下の手順で Docker コマンドを叩くことで Python の実行環境を整えます

  1. レジストリ(Docker Hub)から Python のイメージを取得する
  2. イメージからコンテナを作成する
  3. コンテナを起動する
  4. コンテナ上でコマンドを実行する

レジストリからイメージをダウンロードする(pull, images)

レジストリからイメージをダウンロードするにはdocker pullを実行します

  • デフォルトのレジストリは Docker Hub が設定されています
docker pull python
  • docker pullはイメージデータをダウンロードするため時間がかかることが多いです
    • とはいえ Docker では CoW 方式を採用しているので効率は良いです
  • docker pullが完了したらdocker imagesでダウンロード済みのイメージを確認できます
docker images

REPOSITORY     TAG             IMAGE ID            CREATED            SIZE
python         latest          254d4a8a8f31        1 hours ago        885MB

python という Docker イメージが存在することが分かります

イメージからコンテナを作成する(create, ps)

イメージからコンテナを作成するにはdocker createを実行します

docker create -it --name sample_container python

オプションの説明

  • -it(実際は-i, -tの 2 つに分かれている)
  • --name sample_container
    • 作成するコンテナに名前(今回は sample_container)をつけます
    • 明示的に名前をつけなくても問題はないですが、つけておいた方が管理しやすいです
  • python
    • 作成対象のイメージ名を指定します

コンテナが作成されているかはdocker psで確認できます

docker ps -a
CONTAINER ID    IMAGE            COMMAND      CREATED        STATUS    PORTS    NAMES
d4f4cabbc93c    python:latest    "python3"    1 hours ago    Created            sample_container

docker psはデフォルトでは起動中のコンテナしか表示しませんが
-aをつけることで全てのコンテナを表示します

イメージを起動する(start)

イメージを起動するにはdocker startを実行します

docker start sample_container

コンテナが起動されているかもdocker psで確認できます
(今回は起動中かの確認なので-aをつける必要はありません)

docker ps
CONTAINER ID    IMAGE            COMMAND      CREATED        STATUS       PORTS    NAMES
d4f4cabbc93c    python:latest    "python3"    1 hours ago    Up 1 hours            sample_container

ホストマシンから起動中のコンテナに接続する(attach, exec)

attach

ホストマシンから起動中のコンテナに接続するにはdocker attachを実行します

docker attach sample_container
>>>

今回は Python のイメージなので、Python が実行された状態で接続されます

exec

ホストマシンから起動中のコンテナで任意のコマンドを実行するにはdocker execを実行します

  • 基本的にはdocker exec -it [コンテナ名] [実行したいコマンド]
  • -itをつける理由はcreateの時と同じ
docker exec -it sample_container bash

attach と exec 違い

主に以下の 2 点です
コンテナを Exit する度にコンテナが停止してしまうため、execの方が良いと思っています

attach exec
実行コマンド 事前に決められている 任意
Exit した時 コンテナが停止する コンテナは停止しない
  • これまでの内容で docker コマンドを叩くだけで、Python を実行できる環境は整いました
  • しかし、ホスト上の Python ファイルをコンテナ上で動作させることは出来ていません
  • この解決策は補足にて紹介します
  • 以降の章ではコンテナの停止・削除などお片付けについて紹介します

コンテナを停止・削除する(stop, rm)

コンテナの停止にはdocker stopを実行します

docker stop sample_container

コンテナの Status を確認すると Exited になっています

docker ps -a

CONTAINER ID    IMAGE            COMMAND      CREATED        STATUS                   PORTS    NAMES
d4f4cabbc93c    python:latest    "python3"    1 hours ago    Exited (137) 1 hours              sample_container

コンテナの削除にはdocker rmを実行します

docker rm sample_container

docker psで確認すると sample_container が消えています

docker ps -a
CONTAINER ID    IMAGE            COMMAND      CREATED        STATUS       PORTS    NAMES

イメージからコンテナを作成&起動する(run)

イメージからコンテナを作成&起動するにはdocker runを実行します

# 実行コマンドを指定する場合
docker run -it --name sample_container python

# 実行コマンドを設定しない場合
docker run -it --name sample_container python /bin/bash

docker runはコマンドを指定する・しないに関わらず Exit 時にコンテナが停止します
これは以下のようにすることで回避することが可能です

docker run -itd --name sample_container python
docker exec -it sample_container bash

docker runのオプションとして-dをつけることでバックグランド実行が可能です
その上でdocker execすることで Exit してもコンテナの停止を防ぐことが出来ます

イメージをホストマシンから削除する(rmi)

イメージをホストマシンから削除するにはdocker rmiを実行します
(※削除するには対象のイメージを元に作成しているコンテナを全て削除している必要があります)

docker rm sample_container
docker rmi python

補足

この記事を読んで以下の疑問を持たれた方がいるかもしれません

  • イメージをレジストリから取得出来たけど、そもそもイメージはどう作るの?
  • Python のコンテナを作成出来たけど、ホスト上の Python ファイルを実行するにはどうするの?
  • Web アプリのコンテナを作成したら、ホストからどうやってアクセスすればいいの?

この疑問にはそれぞれ

  • Dockerfile
  • Docker ボリューム
  • Docker ネットワーク

が関連しています
今後これらの記事も作成予定ですが、気になった方は調べてみて下さい

まとめ

本記事では Docker の状態とコマンドの関係性を示した下図と以下のコマンドについて紹介しました

Docker遷移図
Docker遷移図

  • pull, rmi
  • create, rm
  • start, stop
  • run
  • attach, exec
  • images, ps

参考