ふるてつのぶろぐ

福岡在住のエンジニアです。

写真提供:福岡市

今度は客先でコンテナ勉強会

今日すること

f:id:tetsufuru:20190806104529p:plain
こんにちはふるてつです。

最近客先にて勉強会がスタートしまして、Dockerを勉強することになりました。
備忘録として勉強した内容や使用したコマンドなどを公開できる範囲で書いていきたいと思います。
まずは入門ということでこちらのサイト「入門Docker」を勉強します。
https://y-ohgi.com/introduction-docker/ f:id:tetsufuru:20190806002144p:plain:w500

今日は「はじめに」と「コンポーネント」の image までを勉強しました。

1. はじめに

1-1. Dockerとは

まずはDockerとは
Dockerはコンテナと呼ばれる仮想化のための技術になります。
ちなみにわたしはVirtualBoxの経験はあるのですが、Dockerはほぼありません。
f:id:tetsufuru:20190806105939p:plain:w400

ではなぜDockerを使うのでしょうか? 理由は3つあります。
1つめはポータビリティからです。
どの環境でも動くポータビリティを保証されています。
f:id:tetsufuru:20190806110641p:plain:w400

2つ目はオーバヘッド。
f:id:tetsufuru:20190806110935p:plain:w400
DockerはLinuxカーネルの機能を用いて1プロセスとして隔離された環境を実現します。
そのため仮想化レイヤーが少なく、VMと比較して少ないオーバーヘッドで環境を実現することができます。

3つめはImmutable Infrastructure
f:id:tetsufuru:20190806111450p:plain:w300
インフラを不変なものとして扱うのがImmutable Infrastructureというアプローチです。

1-2. VMとDocker

f:id:tetsufuru:20190806111744p:plain:w300
VMとDockerはなにがちがうのでしょうか。
VMとDockerはどちらも隔離された環境を提供するための 仮想化技術 です。
結論から言うと、VMは コンピュータ自体を仮想化するのに対して、Dockerは プロセス の仮想化を行います。

1-3. Hello Docker !

まずはDockerコマンドを使用してnginxサーバーを構築してみます。
本サイトでは「Play with Docker」を使用するように書いてありますが、いったんローカルのDockerで試します。
わたしはWindowsを使用していますので「Docker for Windows」を使用します。

docker run -P nginx

このコマンドは「nginxを起動( docker run nginx )し、設定されているポートを公開( -P )。」という意味になります。
ブラウザで32768番ポートにアクセスhttp://localhost:32768するとnginxの画面が表示されます。
f:id:tetsufuru:20190806114658p:plain:w500
nginxを停止するときはCtrl + cです。
このくらいはさすがにしたことがありますけど、言われたおりにしました。

2. コンポーネント

1. image

f:id:tetsufuru:20190806144313p:plain:w300
Imageは "環境のスナップショット" としての役割を持っています。
例えばCentOSUbuntuやAlpineなどのOS、NginxやMySQLのようなソフトウェア、PHPRubyのようなランタイムなどの環境を提供してくれます。
DockerではUbuntuのようなOSも立ち上げることも可能です。
Docker Image はDockerの公式が DockerHub と呼ばれるサービス上で様々なOS・ソフトウェアを公開しています。
f:id:tetsufuru:20190806144852p:plain:w300
まずはUbuntuのDocker ImageをDockerHub上から取得します。
docker pull ubuntu

わたしのマシンでは下記のようなログが表示されました。 最後に:latestとあるのでUbuntsu最新バージョンのDocker imageがダウンロードされたようです。

docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7413c47ba209: Pull complete
0fe7e7cbb2e8: Pull complete
1d425c982345: Pull complete
344da5c95cec: Pull complete
Digest: sha256:c303f19cfe9ee92badbbbd7567bc1ca47789f79303ddcef56f77687d4744cd7a
Status: Downloaded newer image for ubuntu:latest

docker runコマンドで先ほど取得したImageを起動することができます。
下記のようにrunコマンドの引数としてcat /etc/hostsを渡します。
docker run ubuntu cat /etc/issue

すると下記のような結果が返ってきます。
Ubuntuが起動し/etcにあるissueファイルの中身"Ubuntu 18.04.2 LTS"が表示されました。
最後に変な改行コードのようなものが出てきましたがそこは気にしない。
Macだと出ていないのでWindowsだけの現象と思いますけど。

docker run ubuntu cat /etc/issue
Ubuntu 18.04.2 LTS \n \l

bashのような対話的な入力が必要なプロセスも実行が可能です。
対話的に使用するためには-i -tオプションを使用します。

docker run -i -t ubuntu bash

実行すると下記のようにUbuntuのコマンド入力待ちになりました。
なるほど。

docker run -i -t ubuntu bash
root@d9dddcfe7a04:/#

最後にtagの使用ですが基本的にはバージョンの指定に使用されるようです。
Pythonの2.7を使いたい場合は公式イメージで2.7がホストされているか確認します。
https://hub.docker.com/_/python
f:id:tetsufuru:20190806155330p:plain
2.7 というタグが存在することが確認できました。
そこでdocker run python:2.7 python --versionを実行します。

docker run python:2.7 python --version
Python 2.7.16

Python 2.7.16のイメージが起動されそのバージョンが返ってきました。

感想

勉強した「入門Docker」の内容をそのまままとめたような内容になりました。
次回以降も若干同じ感じになりそうですが、こうやってブログに書くとわりと頭に残るのでこういう感じも良いかなと思いました。

それではまた