LoginSignup
8

More than 5 years have passed since last update.

Dockerとdocker-composeを最低限の知識でお遊び程度に使う

Last updated at Posted at 2018-11-14

どっかーわかんない!!!
ざっくり自分向けメモですのであしからず。

大まかな流れとしては
Dockerfileを書く→ビルドをするとイメージが出来上がる→イメージを元にコンテナを立ち上げる。

Dockerfile

Dockerfileを作ることでイメージを自作できる。

FROMにベースとなるイメージ名書く。
RUNはイメージをビルドするときにコンテナに実行させるコマンドを書く。
CMDはコンテナが起動したあとにコンテナに実行させるコマンドを書く。
COPYADDはホストからファイルを取り込むことができる。

もちろんコレだけじゃないけど、僕はコレくらいでもの足りる程度のことしかしてないのでコレだけ。

Dockerfile
# 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 誤字訂正しました。編集リクエストありがとうございます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8