どっかーわかんない!!!
ざっくり自分向けメモですのであしからず。
大まかな流れとしては
Dockerfileを書く→ビルドをするとイメージが出来上がる→イメージを元にコンテナを立ち上げる。
Dockerfile
Dockerfileを作ることでイメージを自作できる。
FROM
にベースとなるイメージ名書く。
RUN
はイメージをビルドするときにコンテナに実行させるコマンドを書く。
CMD
はコンテナが起動したあとにコンテナに実行させるコマンドを書く。
COPY
やADD
はホストからファイルを取り込むことができる。
もちろんコレだけじゃないけど、僕はコレくらいでもの足りる程度のことしかしてないのでコレだけ。
# DockerHubにあるubuntuイメージを元にする
FROM ubuntu
# コンテナのなかでコマンド実行
RUN apt-get -y update && apt-get install -y python3-pip python3-dev vim
# flaskが使いたいので
RUN pip3 install flask
# ホストにあるpythonのスクリプトを持ってくる
COPY src/ /opt/
# コンテナでFlaskを使ってるPythonのやつを動かす
CMD python3 /opt/app.py
build
$ docker build -t <イメージ名> <Dockerfileのあるパス>
# 作業ディレクトリにあるなら...
$ docker build -t <イメージ名> .
-t
オプションをつけることでイメージに任意の名前をつけることができる。
名前つけないとわかりにくいしつけるべきだと思う。
ビルドして得られたイメージは/var/lib/docker
とかそのへんのシステムのとこに置かれている。
イメージのパスは把握してなくてもよさそう。
作成・取得したイメージはdocker images
コマンドで確認できる。
名前つけないといい加減に与えられた英数字のIDを使う羽目になってメッチャめんどくさいので名前つけような。
ちなみに
-f
オプションでDockerfileの名前を指定できる。
$ docker build -t <イメージ名> -f <Dockerfileの名前> <Dockerfileのあるパス>
run
さて、イメージも作れたしコンテナ起動すっかぁ〜!
docker run
コマンドでコンテナを作成する。
$ docker run -it --name <コンテナ名> <イメージ名> <起動後に実行したいコマンド>
-i
オプションはコンテナの入力にホストの入力を繋いでくれる。
-t
オプションはコンテナのターミナルをホストのターミナルに繋いでくれる。
作られたコンテナもイメージと同じようにシステムのディレクトリに保存される。
コンテナは名前がかぶると「名前かぶっとるんやが?」とコンテナを上書きせずにキレる。
同名のコンテナを再度作るときは削除した後にdocker run
をする必要がある。
消したり、一覧見たり
# コンテナの様子をみる(-aオプションで動いていないやつも表示)
$ docker ps -a
# コンテナ削除
$ docker rm <コンテナ名>
# イメージ削除
$ docker rmi <イメージ名>
オプション系
--rm
docker rm
でわざわざ消すのめんどっちーってときは--rm
オプションをつけることで回避できる。
$ docker run -it --name <コンテナ名> --rm <イメージ名>
-d
フォアグラウンドに来んなや!!って思うときは-d
オプションをつける。(デタッチ)
$ docker run -itd --name <コンテナ名> <イメージ名>
デタッチしたやつにつなぎたいときはコレを唱える。
$ docker exec -i -t <コンテナ名> bash
-p
-p
オプションでホストとコンテナ内のポートを繋げられる。
$ docker run -itd -p <ホストのポート>:<コンテナのポート> --name <コンテナ名> <イメージ名>
コンテナのなかで動かしてるFlask製webページにアクセスする
# コンテナをうごかす
$ docker run -itd -p 30000:80 --name <コンテナ名> --rm <イメージ名>
で、ホストのブラウザとかでlocalhost:30000
にアクセス。
docker-compose
docker-composeは複数のdockerコマンドをdocker-compose.ymlに書いてdocker-compose up
一発でコンテナが全部動くようにしよう!的なノリのヤツ。
image名とか、開けるポートとか、ビルドするDockerfileのパスとかをまとめてdocker-compose.ymlに書いてあげる。
そうすると、コンテナを起動したいときに docker run -itd -p 30000:80 --name <コンテナ名> --rm <イメージ名>
とか打つことなく、docker-compose up
だけで済むのだ。くぅ〜怠惰ァ〜!!
あとは、複数個コンテナを立ち上げる必要がある場合
示した例をdocker-compose.ymlに書いてみるとこうなる。
version: '2'
services:
<コンテナ名>:
image: <イメージ名>
build: <Dockerfileのあるパス>
ports:
- "<ホスト側のポート番号>:<コンテナ側のポート番号>" # ホスト側とコンテナ側のポートを繋いでくれる
command: <コンテナ起動後に実行させたいコマンド>
他にもオプションは色々あるけど、とりあえずこの程度で。
.ymlファイルの記述にはタブ文字が使えない。タブ文字を含めてしまうとコマンド実行時に「知らない文字あるんやが?」とエラーが出るので気をつけよう。
コイツを使って起動するときのコマンドはこんな感じ。
# イメージをビルド
docker-compose build
# 起動
docker-compose up
# バックグラウンドで起動
docker-compose up -d
# イメージをビルドし、起動
docker-compose up -build -d
# docker-compose.ymlが別名のときはコレを使うとよし
docker-compose -f <docker-compose.ymlのパス> up -build -d
# 止める
docker-compose stop
# docker-compose.ymlにかかれているコンテナを削除
docker-compose rm
# 停止、削除を一気にやる
docker-compose down
# それに加えてイメージも消しちゃう
docker-compose down --rmi all
Dockerコマンドと同じく-d
オプションはバックグラウンドで、-build
オプションでイメージをビルドしつつコンテナを立ち上げることができる。
-build
オプションをつけることで、Docker周りの作業中の起動テストが行いやすくなるんじゃないかな。
参考にしたサイト
さくらのナレッジさんの記事を読んでとりあえず使えるようになりました。ありがとうございます。
さくらのナレッジ Docker入門
Dockerのイメージファイルの格納場所
ねここくぶろぐ Dockerイメージ、コンテナの場所
Dockerfileを極めて、Dockerマスターになろう!
Dockerコンテナのシェルの中に入る
Docker ドキュメント日本語化プロジェクト
2018/11/15 誤字訂正しました。編集リクエストありがとうございます。