【初心者・入門者必見】Dockerの取扱説明書
どうもユーキです。
最近かなりDockerが流行ってきてますね。
そろそろ触ってみたいけど、何からやればいいのか全くわからない!って方も多いと思います。
今回は、自分の知識の整理も兼ねて、Dockerについてまとめました。
目次
Dockerって何?
すごく簡単に一言でいうと、アプリなどの実行環境を作って動かすものです。
上記右側のように、Docker EngineというものがホストOS上で動作し、イメージやコンテナを操作しているという仕組みになってます。
Dockerの特徴
- リソース使用量が非常に少ないので動作が早い、軽い
- Dockerさえ動けば同じ環境を用意することが出来る
というメリットがあります。
仮想環境での作成よりも手軽にかつスピーディーに環境作成を行えるようになるため非常に便利です。
基本的な処理
- イメージを取得(pull)
- イメージの一覧表示(images)
- コンテナのライフサイクル管理
- 作成(create)
- 起動(start)
- 停止(stop)
- 削除(rm)
- 起動中コンテナ一覧表示(ps)
イメージ取得→コンテナ作成→コンテナ起動で動作するようになります。
コンテナは1度作成したらあとは、起動/停止を、コンテナ自体が不要になれば削除をする
といった感じです。
ちなみに、カッコ内はコマンドです。docker pull だとか docker create だとか。
イメージ、コンテナについて
イメージとは
コンテナを作成するためのファイルや設定をまとめたもの。設計図のようなもので、再利用が可能です。
vagrantでいうboxあたりが近いと思います。
基本的には、Dockerfileというものを作成します。詳細は後述します。
イメージはDocker Hubという公開サイトがあってそこから取得することになります。
また、自分が作ったイメージもpushして公開することもできたりします。理解が深まってきたら実際に公開してみるとよいかと!
これら公開サイトのことを総称して、Docker Registryと呼びます。
とりあえず今はGithubのDocker版みたいなものとだけ理解していれば大丈夫です!
コンテナとは
上記イメージを基に作られたアプリやサーバーなどのこと。
コンテナを複数動かして環境を作っていきます。
Docker Engineとは
イメージやコンテナを実行・管理するシステム。これがないとDockerは使えない。
Dockerfileについて
イメージのところでも出てきましたが、自分でカスタマイズしたコンテナを作成するために手順を示したファイルです。
パッケージのインストール、ファイル構成の変更、コードの追加などができます。
これを基にオリジナルのイメージを作成(ビルド)することもできます。
- FROM ベースイメージの指定
- RUN イメージをビルドするためのコマンドを指定
- ADD ファイル/ディレクトリを追加
- COPY ホストからコンテナ無いにファイルをコピー
- EXPOSE 外部に公開するコンテナのポートを指定
- CMD イメージからコンテナを起動するときに実行するコマンドを指定
など、コンテナ作成時に様々なことができるようになっています。
実際に動かしてみよう
ざっくり説明しましたが、ただ読んでるだけじゃ頭に入ってこないと思います。。。
なので、ここからは実際に動かしてみます。
今回は、Apacheを使ってWebサーバーを立ててみましょう!
※コマンド等がMacになっているので、Windowsの方は適宜置き換えてください。
手順1 Dockerをインストール
公式サイトからダウンロードしてインストールしてください。
ちょっとスクロールすると、Supported platformsの中にDesktop、Cloud、Serverとあるので、その中から自分の環境にあったものをクリックします。
そして、別ページへ遷移するので、またちょっとスクロールしてください。
stable channelという文字が出てきたらGet Docker for ○○とかかれているはずなので、そこをクリックするとインストーラーがダウンロードされます。
あとはインストーラーに従ってインストールしてください。
手順2 ディレクトリとDockerfileの作成
まずは、Dockerお試し用のディレクトリ docker を作成してください。
デスクトップでもどこでもいいです!お好きな場所で構いません。
mkdir ~/docker
次に、docker 内に、htmlというディレクトリと、Dockerfile という名前にファイルを作成してください。
また、html内にindex.htmlを作成します。
htmlはwebサーバーのルートディレクトリになります。
cd ~/docker
mkdir html
vim html/index.html # index.htmlの作成
vim Dockerfile # Dockerfileの作成
各ファイルの内容は
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>テストサーバー</title>
</head>
<body>
<h1>テストサーバー</h1>
</body>
</html>
Dockerfile
FROM httpd:2.4
COPY ./html/ /usr/local/apache2/htdocs/
上記を保存したら、準備完了です。
手順3 イメージ作成からコンテナ実行まで
まずは、インストールしたDockerアプリが起動しているか確認してください。
起動が確認できたら、下記コマンドを実行しましょう。
# my-apache24というイメージを作成
docker build -t my-apache24 .
# my-apache24を基にtest-serverという名前のコンテナを作成
docker run --name test-server -p 28080:80 -dit my-apache24
これでコンテナが出来上がりました。
動いてるか確認するために、docker ps とコマンドをたたいてみてください。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45b768d055ce my-apache24 "httpd-foreground" 9 seconds ago Up 7 seconds 0.0.0.0:28080->80/tcp test-server
こんな感じで表示されたらOKです。
そして、 http://localhost:28080/ にアクセスしてみてください。
テストサーバー と出てきてますよね?
これでWebサーバーの完成です!!
えっ?これだけ??って思いましたか?
これだけなんです!
まぁ実際はもっと細かく設定をしていくのですが、動かすだけならこれだけでOKなんです。
すごい簡単ですよね。
まとめ
今回は、Dockerの基本的な動きについて解説しました。
なんとなくわかりましたでしょうか?
Dockerfileさえあれば、どんな環境でも作ることができるので、今までvagrantなりで仮想環境を構築してきた人からすれば、非常に簡単かつスピーディーに環境を作れるようになってるかと思います。
今回はコンテナ一つでしたが、複数コンテナを作って、コンテナ同士を連携したりも可能です。
ただ、コンテナの数が増えれば増えるほど、毎回コンテナごとにrunやbuildなど管理するのが大変になっていきます。
そこで、次回はdocker-composeというものを使って、コンテナの管理をしやすくしていきたいと思います。
以下、チートシートというほどでもないですが、よく使うコマンド載せておきます。
番外編 その他よく使うコマンド
# イメージを作成
docker build -t <イメージ名:タグ名>
# 作成したイメージ一覧を表示
docker images
# 作成したイメージを削除
docker image rm <イメージ名>
# 起動しているコンテナ一覧を表示
docker ps
# 全コンテナ一覧を表示
docker ps -a
# コンテナの作成し起動する。(create→start→attachとなる)
docker run <イメージ名[:タグ名]>
# 起動したコンテナ内で対話的に作業が出来る
docker run -it <イメージ名[:タグ名]> <コマンド>
# コンテナ名を付ける
docker run --name <コンテナ名>
# 上2つ組み合わせ
docker run --name <コンテナ名> -it <イメージ名[:タグ名]> <コマンド>
▼その他のオプション
-e AUTHOR="Hoge" コンテナの環境変数 Author として "Hoge"を渡す
-d デタッチモードで起動
-p 8080:80 コンテナ上の開放対象ポート(80番)をホスト上のポート(8080番)に割り当てる(localhost:8080でアクセスすればいけるということ)
など様々なオプションがあります。
docker run --name site1 -e AUTHOR="Fuga Hoge" -d -p 8080:80 <イメージ名[:タグ名]>
# 起動しているコンテナにアタッチする
docker attach <コンテナID>
# 停止しているコンテナを削除(-fをつけると起動しているコンテナも削除可能)
docker rm <コンテナ名>