こんにちは。iQeda [@iQeeeda] です。
これから Docker の解説記事を書いていこうと思います。
今回は Docker 概要と docker コマンドについて解説します。
目次
Docker とは? Container とは?
Docker はローカル開発環境を作るツールです。
Docker の特徴として Container (コンテナ) という機能があります。
荷物を運ぶため、船にたくさん積まれるあのコンテナのイメージです。
たとえば LAMP 環境を Container で積み上げるには
LAMP (Linux / Apache / MySQL /PHP) 環境を構築したいとしましょう。
一例ですが、以下のような Container を用意すれば実現できます。
- CentOS に PHP と Apache が入った Container
- MySQL が入った Container
Docker ではひとつの仮想環境に対して、
このような Container を機能別に積み上げていきます。
1 つの Container の中にすべての機能を詰め込んでもいいのですが、
管理が大変になるので Container を分けるのが一般的です。
Docker はどんな環境でも動作する
Docker とその仮想環境はどこでも動きます。
つまり他の誰かの PC ・サーバでも同じ環境を再現することが可能です。
これを冪等性 (べきとうせい) があると言います。
また、環境の立ち上がりが早いところも人気の理由です。
つまり…
PC の OS が Windows でも Mac でも Ubuntu でも Debian でも Science Linux でも、
「CentOS 6.5 上の yum でインストールした Apache を動かす」
といった環境構築を常に再現できる、ということを意味します。
Docker はそこそこ覚えることがある
docker
コマンド- 及び Dockerfile の作成方法
docker-compose
コマンド- 及び docker-compose.yml の作成方法
Docker はすごく便利みたいに言われますが、
上記 4 つのことができないといけないので学習コストはそこそこ高いです…
全部一度にやろうとするのは (僕的にも) 大変なので、
ここからは docker
コマンドについて解説していきます。
前提条件
初心者は Linux コマンドや Git コマンドを覚えるのが先です。
そもそも環境構築するのに必要な知識ですし、
これらが分かっていると Docker コマンドのイメージも湧きやすくなります。
逆にこれらが分かっていると、docker
コマンドと docker-compose
コマンドはノリでなんとかなります。
その場合 Dockerfile とdocker-compose.yml の書き方だけ押さえればよいでしょう。
ドキュメント
- コマンドライン・リファレンス — Docker-docs-ja 17.06.Beta ドキュメント
- ここで調べたいコマンドを
⌘F
で検索したらすぐに見つかる
- ここで調べたいコマンドを
- Docker Hub
- Docker 版 GitHub みたいなもの
Image と Container
Docker は Image というものを使って Container と呼ばれる開発環境を作ります。
Docker を浮き輪で例えてみる
あんまり良い例えが思い浮かばなかったんですが、
とりあえず浮き輪を想像してください。
普段、浮き輪の空気は抜いた状態で持ち運んだり保管しますね。(これが Image)
海やプールで遊ぶときは浮き輪に空気を入れて膨らませますね。(これが Container)
Docker は通常 Image でやりとりします。
環境を使いたいときだけ Image から Container に実体化します。
自分で 0 から開発環境を作る必要はありません
Image は Docker Hub からダウンロードできます。
たとえば CentOS Image をダウンロードして、
Container 化して、そこに yum install php
ということもできます。
しかし PHP 入りの CentOS Image も Docker Hub で配布されているので、
最初からこちらを使った方が簡単です。
さらに色々と追加した個人公開の Image もあるので色々と探してみるといいでしょう。
docker コマンドは Image 系と Container 系に分かれる
初心者が docker コマンドでつまづく理由のひとつは、
Image 関連と Container 関連のコマンドの区別がめんどくさいからです。
今回は頻出コマンドをこの 2 つに大別して簡単な説明を載せておきました。
詳細リンクも貼っているので、そちらでオプションなど確認してください。
コマンドでヘルプ情報を見るとき
ヘルプを見たいときは docker
オプションを知りたいときは docker コマンド --help
と入力してください。
# 使える docker コマンドが表示される
docker
# docker ps コマンドが使えるオプションが表示される
# --help でも help でも OK
docker ps --help
Image 系 docker コマンド
Image 一覧
docker images
- ローカルにある Image ファイルを一覧表示
- ここで表示される Image ID を使って、他のコマンドの Image 指定する
- Image ID が同じものは実態が同じ
- http://docs.docker.jp/engine/reference/commandline/images.html
Image 取得・作成
docker pull [イメージ名]
- Docker Hub から Image を取得する
- http://docs.docker.jp/engine/reference/commandline/pull.html
docker build -t [作成するイメージ名] [Dockerfile のパス]
- Dockerfile から Image を作成する
- -t は tag の略。イメージ名・タグ名を設定する
- http://docs.docker.jp/engine/reference/commandline/build.html
docker commit [コンテナ] [作成するイメージ名]
- 変更を加えた Container を元に Image を作成する
- イメージ名は
Docker Hub 上のユーザ名/イメージ名
とする- イメージ名が不適切の場合は
docker push
できないので注意
- イメージ名が不適切の場合は
- http://docs.docker.jp/engine/reference/commandline/commit.html
Image 削除
docker rmi [イメージ]
- Image を削除する
- 紐づく Container を先に削除しておかないと実行できない
- rmi は remove image の略
docker rmi docker images -a -q
- Image 全件削除
- http://docs.docker.jp/engine/reference/commandline/rmi.html
Image から Container を作成する
docker run [イメージ] --name [作成するコンテナ名]
- Image を実行して Container を作成する
- イメージ後に UNIX コマンドを続けると、そのコンテナ環境からコマンド実行する
sudo docker run centos echo "hello world"
docker run -d [イメージ名]
- バックグラウンド処理としてタスク実行する
-d
は detach の略docker run -d centos free -s 3
- バックグランド処理で 3 秒ごとにメモリ確認する例
- http://docs.docker.jp/engine/reference/commandline/run.html
作成した Container の中にすぐ入る
docker run -i -t [イメージ] [シェル]
-i
は Interactive の略-t
は Terminal の略。Container の中でターミナルが起動する- シェルは
/bin/bash
などを指定する - alpine のような軽量コンテナだと
/bin/ash
というシェルを使う
sudo docker run -i -t centos /bin/bash
Docker Hub リポジトリに Image を預ける
docker push [イメージ]
- Docker Hub リポジトリに Image を預ける
- http://docs.docker.jp/engine/reference/commandline/push.html
docker push
することで、他のマシンは docker pull
でその Image を取得できるようになります。
そして docker run
であなたと同じ Container を再現することができます。
docker push するまでの流れ
Docker Hub にログインする
docker login
- Docker Hub にログインする
- Docker Hub 以外にも、自分でホスティングするとプライベートな Image を預けることもできる
- http://docs.docker.jp/engine/reference/commandline/login.html
- Docker Hub にログインする
# Docker hub にログインする
sudo docker login
docker tag でイメージ名を変更する
Image 名は ユーザ名/イメージ名
で記述されますが、docker push
時、
このユーザ名が Docker Hub 上のログインユーザと一致していないとエラーになります。
docker tag [イメージ] [新しいイメージ名]
# イメージ名を確認する
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daike/httpd latest 9b829cbdbabe 41 minutes ago 302MB
# ikeda/httpd に変更する
sudo docker tag 9b829cbdbabe ikeda/httpd
docker push でイメージをリモートに預ける
# プッシュ
sudo docker push ikeda/httpd
その他のコマンド
docker search [キーワード]
- Docker Hub から Image 検索する
- http://docs.docker.jp/engine/reference/commandline/search.html
検索結果は最大 25 件しか表示されないですし、
複数キーワードで絞り込むこともできないので Docker Hub を使ったほうがいいです。
Container 系 docker コマンド
Container 一覧
docker ps
- 実行中の Container ID と状態を表示する
- ここで表示される Container ID を使って、他のコマンドの Container 指定する
- http://docs.docker.jp/engine/reference/commandline/ps.html
docker ps -a
- 実行終了した Container も表示する
- a は all の略
docker ps -a -n=[表示件数]
- 件数を絞って Container を表示する
Container 削除
docker rm [コンテナ]
- Container を削除する
docker rm docker ps -a -q
- Container 全件削除
- http://docs.docker.jp/engine/reference/commandline/rm.html
# コンテナ ID 確認
docker ps -a
# コンテナ ID の指定
docker rm b6206b44db6f
# 消えていれば OK
docker ps -a
Container の中に入る
Container のシェルに接続する方法は docker attach
と docker exec
の 2 つ
# attach でコンテナの中に入る
docker attach --sig-proxy=false コンテナ
# exec でコンテナの中に入る
docker exec -it コンテナ シェル
docker attach
は Container を停止させてしまうことがあるのであまり使いません。
docker attach
docker attach [コンテナ]
- コンテナの元になっているプロセスにアクセスする
- つまりログアウトすると Container そのものが終了する
- コンテナがシェルを実行している場合、シェルに接続する
- コンテナが Deamon しか起動していない場合、Deamon の標準入出力に接続する
- http://docs.docker.jp/engine/reference/commandline/attach.html
- コンテナの元になっているプロセスにアクセスする
docker attach --sig-proxy=false [コンテナ]
--sig-proxy=false
を付けるとログアウトしても Container は終了しない
docker exec
docker exec -it [コンテナ名] シェル
- 新規プロセスを立ち上げてアクセスする
-it
オプションをつけるとログアウトしても Container は終了しない
- シェルは
/bin/bash
などを指定する - alpine のような軽量コンテナだと
/bin/ash
というシェルを使う - http://docs.docker.jp/engine/reference/commandline/exec.html
Container を停止する
以下のどちらでもよい。
docker kill [コンテナ]
docker stop [コンテナ]
sudo docker kill d09872c6438d
d09872c6438d
sudo docker stop d09872c6438d
d09872c6438d
# 確認
docker ps -a
停止した Container を再開する
docker start [コンテナID]
Container ログの確認
docker logs [コンテナID]
- 実行中 Container のログを表示する
- http://docs.docker.jp/engine/reference/commandline/logs.html
Dockerfile 篇につづく、という話
docker コマンドを紹介しましたが、コマンドだけで何でもやりきるのは大変です。
次回の Dockerfile 篇で詳しく説明しますが、
たとえば PHP を動かす Container を作成しようと思ったら以下のコマンドを叩きます。
# コンテナ作成
docker run -d
-p 80:80
--name myapp
-v $(pwd):/var/www/html
php:7.0-apache
…毎回こんなコマンド打ってられないですよね。
自分だけならまだしも、
他の Docker ユーザにこのようなコマンドを伝えるのは面倒くさいです。
実際の業務では Dockerfile にすべて定義しておきます。
なので Dockerfile の記述方法は docker コマンドを覚えるより重要です。
というわけでつづく。
お仕事ください!
僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。 なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。
カテゴリ「Develop」の最新記事
psの由来ってなんでしょうか