10 分で入門する Docker(初級編)
こんにちわ、krkettleです
Docker を使う上で最低限必要な知識のみを厳選して説明していきます
この記事を読んで分かること
- Docker の状態とコマンドの関係性を示した下図の意味が分かる
- 本記事では docker コマンドにフォーカスして説明していきます
- Docker 自体の基本知識や、概念を知りたい方は10 分で入門する Docker(概念編)を参照して下さい
- 以下の Docker コマンドについて紹介します
pull
,rmi
create
,rm
start
,stop
run
attach
,exec
images
,ps
前提条件
- 対象者
- Docker の全体像をサクッとつかみたい人
- Docker やコンテナ技術を聞いたことはあるけど、よく分かってない人
- この記事で紹介しないこと
- Docker の基礎知識や概念
- Dockerfile、マウント、ネットワークなど
Docker についての基礎知識
※10 分で入門する Docker(概念編)から抜粋して紹介します
Docker 使うと何が嬉しいの?
Docker を使う利点は主に以下の 2 点だと思っています
- Docker がインストールされていれば環境の横展開(共有・複製等)が容易
- OS の種類に関わらず同じ環境を起動することができる
- 他の仮想化技術に比べて軽量で高速のため、スクラップ&ビルドが容易
- 手順書やホスト OS の違いを意識したスクリプトを作成せず、コマンドで環境構築ができる
Docker ってざっくり言うと?
- コンテナ型仮想化技術と呼ばれ、 1 台のホストマシンから複数の OS を同時に動作させることが可能
- Docker イメージから Docker コンテナを起動することで、比較的簡単に仮想環境を利用できる
- Docker レジストリから Docker イメージを簡単にダウンロードできる
Docker コマンドを実行して Python 環境を整える
この章では 以下の手順で Docker コマンドを叩くことで Python の実行環境を整えます
- レジストリ(Docker Hub)から Python のイメージを取得する
- イメージからコンテナを作成する
- コンテナを起動する
- コンテナ上でコマンドを実行する
レジストリからイメージをダウンロードする(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 つに分かれている)- 簡単に言うとホストマシン上からコンテナ側のコマンドを叩いて結果を受け取れる用にする
- 今回の例で言うと、
-it
が Python のコマンドを叩けないし、結果を表示できない - 参考: docker run -it で学ぶ tty とか標準入出力とかファイルディスクリプタとか
--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)
- 接続方法は 2 つあります
attach
: コンテナに接続し、事前にイメージで設定されたコマンドを実行するexec
: コンテナに接続し、任意のコマンドを実行する- 参考: Docker コンテナ内で操作 attach と exec の違い(Qiita)
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 の状態とコマンドの関係性を示した下図と以下のコマンドについて紹介しました
pull
,rmi
create
,rm
start
,stop
run
attach
,exec
images
,ps