31年目のRealize

技術に関する詳しい記事や分かりやすい記事は世の中にたくさんあるので、自分なりのアウトプットを試行錯誤。

マンガっぽくDockerを布教してみる

Dockerとの出会い

f:id:altrlz:20191106233728p:plain

という訳で、dockerについて教えるよ

はいっ♪さすが、ふわ先輩!頼りになる〜

この記事の目的

dockerを触ったことないけど、気になっている人向け。
この記事をさらっと読んで、ざっくり雰囲気が伝われば良いと思っている。

Dockerについてざっくり

Linuxコンテナ型仮想化技術を使ったソフトウェア。
Dockerをインストールした環境上で、アプリやファイルをまるっとパッケージしたものを コンテナとして動かせる。

うーん?コンテナにすると何が嬉しいんですか?

コンテナは1つのOS上で他プロセスと分離された領域で動くから、別のアプリにも影響が無いの

じゃあインストール失敗してもやり直し放題!?助かる〜♪

VMと違ってOS(kernel)は共有だから、起動も早い

おおっ♪(かーねる?)

更にDockerが動いてる環境ならコンテナごと持ってきてそのまま動かせる!

f:id:altrlz:20191106233810p:plain

早い(起動が)安い(構築コストが)うまい(効率がいい)ですね!

あ、うん…?

Dockerをインストール

Docker公式とか、他のブログとか参考にしてください!

(あ、丸投げした…)

日本語版ドキュメント: Docker のインストール — Docker-docs-ja 17.06.Beta ドキュメント

Dockerの使い方

コンテナを使う方法は大きく2つあるよ

①dockerコマンドでコンテナを起動

以下コマンドを実行すると、コンテナが起動してイメージに定義されたコマンドが実行される。

docker run -it <イメージ名>:<タグ名>

ふ〜ん、わかんないけど、docker runでイイってこと?

オプションは他にも色々あるけどね。ここで書いた<イメージ名>に対応するDockerイメージを元にコンテナが作られるよ

また、引数としてコマンドを指定すると、そのコマンドが優先的に実行される。
そして、コマンドの処理が終わるとコンテナは停止する。

# centOS7のイメージ上でbashが起動する。exitでコンソールを抜けるとコンテナは停止する。
# -itのオプションはコンテナ内のコンソールを操作するコマンドを実行する時に付ける。
docker run -it centos:7 /bin/bash

# centOS7のイメージ上でechoが起動する。echoが処理が終わるとコンテナは停止する。
docker run centos:7 /bin/echo test
> test

イメージ…コンテナとは違うの??

イメージは、変更することができないよう固められた、コンテナの元となるもの。
ローカルに無ければDockerHub(Docker社のホスティングサービス)からダウンロードされる。
そのイメージに変更可能な領域を加えたものがコンテナとして動く。

f:id:altrlz:20191106233832p:plain

DockerHubにはOSSの公式イメージとか、個人が作成したものが登録されてるよ

なるほど!じゃあわたしが使いたいOSSのイメージがあれば、 インストールの手間が無くなるってコトね!

あれ…でもインストール後の設定とか、自作アプリとかは 結局コンテナ起動後に作業しないとダメ…?

そういう細かいことしたい時には、もう1つの方法、Dockerfile を使う手があるよ

②Dockerfileでイメージを作ってからコンテナを起動

Dockerfileにベースとなるイメージと、各種操作を定義することで オリジナルのDockerイメージを作成できる。

FROM python:3.7.4

ARG project_directory
WORKDIR ${project_directory}
COPY ./run.py 

RUN pip install flask sqlalchemy
CMD ["python", "run.py"]

こんな感じで設計書を作ってdocker buildコマンドを実行したらイメージが作られるよ

# 最後の引数はdockerfileの置き場所を指定
docker build -t <タグ名> .

なんか色々書いてある…

まぁこれもまた色々文法があるんだけど…まずはこの3つを覚えたら大丈夫かな。

  1. FROM ベースとなるイメージ名を指定
  2. RUN イメージビルド時に実行するコマンドを指定
  3. CMD コンテナ起動時のコマンドを指定

ムズカシイけど、一回作っちゃえば手順書いらないっていうか、使い回しカンタンじゃん!!

そういうこと!楽したいよね!慣れてきたら続きは公式で!!

(徹底している…)

日本語版ドキュメント: Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

portとvolume

なんとなくフンイキはわかった!さっそくコンテナ動かそ!

docker run -it centos:7 /bin/bash

ちなみにこのままだと外からコンテナ内のアプリとかファイルには アクセスできない

ええっー!?それじゃ意味ないんですけど!?

コンテナへのアクセスはポートフォワードでの橋渡しを定義する必要がある。
また、コンテナ内のディレクトリとホスト側のディレクトリを 共有することができる。

f:id:altrlz:20191106233902p:plain

結果的にこういうコマンドで起動することになるよ

docker run -it -p 80:80 -v `pwd`:/work centos:7 /bin/bash

な、なんか長い…!これじゃあDockerfileだけじゃなくて コマンドもメモしておかないと、使い回せないね…

そんなギャルちゃんにオススメのツールがこちら!

?!

docker-composeがとても便利

起動するコンテナ毎にportやvolume、利用イメージを定義する。

version: "3.0"
services:
  web:
    image: centos:7
    ports:
      - "80:80"
    volumes:
      - "`pwd`:/work"
    command: "/bin/bash"

# 以下、複数定義可

あとはこのコマンドを打つだけでコンテナが一気に起動するよ

docker-compose up

コマンドもスッキリだぁ!これならdockerfileとymlファイルさえあれば 必要な環境まるっと使い回せますね!

(スッ)

日本語版ドキュメント: Compose ファイル・リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

わー

抱負

Kubernetesを勉強しながら記事にしたい!