Edited at

【さらっとだけ覚えたい】Docker入門

More than 1 year has passed since last update.


前置

現場でついに出会ってしまった私が、

イメージだけつかみたいがために、情報をかき集めた結果になります。


Dockerってなに

プロセスとして仮想OSを用意するイメージ。(これをコンテナという)

それぞれは独立して動いている。

【VMのイメージ】

VM.jpg

【Dockerのイメージ】

Docker.jpg


メリット

軽いらしいです。

開発環境で動いて、本番でうごかなーいなんてこともならないらしいです。


Docker Compose

dockerだけだと、コンテナをひとつひとつ作成、起動する。

Composeを使えば、複数のコンテナの立ち上げや依存関係を管理できる。


お試し環境


ホストはCentOS7で

CentOSの場合、6がもうサポートされないとか何とか。

なのでホストは7でやる。


VitrualBox + CentOS7

結局、仮想マシン使うのかよwwww

というつっこみはしないでください(・ω・)

お勉強ですから。

べ、べつにVagrantとかでもいいんだからねっ(そういう話じゃない?

以下、CentOSを使うまでのごにょごにょ。

[1]VirtualBoxが古すぎると、CentOS7でネットワークの設定ができなかった

[2]ネットワークの設定で使用したコマンド

# GUIっぽい設定できるやつ開いてくれる 

nmtui

# ネットワークの更新
systemctl restart NetworkManager

# 確認
ip a

[3]その他にやったこと

# パッケージの更新

yum update
reboot

# 以下の手順で必要そうなもののインストール
yum install -y bzip2 kernel-devel gcc

# CDドライブのマウント
mkdir /media/cdrom
mount -r /dev/cdrom /media/cdrom

# GuestAdditionsのインストール
sh /media/cdrom/VBoxLinuxAdditions.run install

# VirtualBoxの共有フォルダ設定したものをマウント
mkdir -p /mnt/project
mount -t vboxsf project /mnt/project
echo -e "mount -t vboxsf project /mnt/project\nexit 0" | tee -a /etc/rc.local
chmod 744 /etc/rc.d/rc.local


インストール


Docker

参考:https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-using-the-repository


リポジトリの追加

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-edge
yum-config-manager --enable docker-ce-testing


dockerインストール

yum makecache fast

yum install docker-ce
docker --version


起動

systemctl start docker

systemctl enable docker
systemctl list-unit-files | grep docker


docker-compose



curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
docker-compose --version


20170712時に試した環境


環境

[root@localhost ~]# cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)

[root@localhost ~]# docker -v
Docker version 17.06.0-ce, build 02c1d87

[root@localhost ~]# docker-compose -v
docker-compose version 1.14.0, build c7bdf9e



Dockerコマンド


のまえにライフサイクル

を知っておくと、各コマンドのイメージがつきやすいかも。

参考:Dockerにおけるコンテナのライフサイクル

コマンド
説明

run
イメージから、プロセスの起動とスナップショットの作成

start
スナップショットからプロセス起動

stop
プロセスの停止

rm
スナップショットの削除


ローカルにあるイメージを表示

docker images


コンテナの実行


実行と停止

docker run -itd イメージ名 [コマンド]

docker stop コンテナ名


オプション
説明

-it
コンテナ内で操作するのに必須

-d
バックグラウンドで実行

-p HostPort:GuestPort
ポートの割り当て

--name 名前
コンテナにつける名前

-v GuestDir
データボリューム(後述)

-v HostDir:GuestDir
データボリューム(後述)

--volumes-from コンテナ名
データボリューム(後述)

※事前にイメージの取得を行わなくても、run時に存在しなければ勝手に取りに行く


いちおうイメージ取得のコマンド

# 「https://hub.docker.com/explore/」でも探せる

docker search イメージ名

docker pull イメージ名[:タグ]


※タグ

イメージのバージョンは、TAGというみたい。

タグを指定しない場合、latestが自動で落ちてくる


コンテナの中でコマンドを実行

docker exec コンテナ名|コンテナID コマンド

# /bin/bashでシェル起動
docker exec -it コンテナ名|コンテナID /bin/bash


コンテナ簡易情報の一覧取得(コンテナ名とか)

docker ps[ -a]


イメージの削除

docker rmi イメージID


コンテナの削除

docker rm コンテナ名


コンテナの詳細を取得

docker inspect コンテナ名|コンテナID


再起動

# 直前のコンテナ情報を確認

docker ps -l

# 細かい情報はいらない
docker start コンテナ名


コンテナの標準出力を見る

docker logs コンテナ名


イメージの作成

せっせとコンテナを作ってコミットする方法もあるが、

メンテナンス等の問題もあるので、Dockerfileを用意して、

ゼロからイメージを作成するほうが良い。


Dockerfileの記述方法

# 元となるイメージ名の指定

FROM イメージ名

# このファイルの管理者情報
MAINTAINER 管理者情報

# ファイルのコピー
ADD コピー元 コピー先

# コンテナ内で実行するコマンド
RUN コマンド

# 環境変数の設定
ENV 変数名 値

# docker runで指定するコマンド
CMD ["コマンド"]


ビルド(イメージとして追加)

docker build -t イメージ名[:タグ] DockerFileのあるパス


イメージ名を後から付け直す

docker tags イメージID イメージ名:タグ


※ビルド中、yumのRPMDBが破損する・・

Dockerのストレージドライバの種類によって、バグがあるらしく。

参考:aufs/overlayfs/btrfs bugs

参考:ストレージドライバってなんやねん

[root@localhost ~]# docker info

~
Storage Driver: overlay
~

ので

RUN yum install -y yum-plugin-ovl

で一旦解消


コンテナのネットワーク

個人的には、開発で使う分にはそんなに気にしなくて良いような知識。

とばしてもおk。

ここでのネットワークとは、コンテナの連結的なことみたい。

指定がなければdockerは「bridge」にコンテナを作成する。


デフォルトの三つ

docker network ls

NETWORK ID NAME DRIVER SCOPE
37eddf42572b bridge bridge local
a4c6bd57e68e host host local
43939dacfb4f none null local



ネットワークの分離

という意味合いで公式では紹介されているので、

その作成と加入方法を転載。


ブリッジネットワークの作成

docker network create -d bridge ネットワーク名



起動と同時に加入

docker run -d --net=ネットワーク名 イメージ名



あとから加入

docker network connect ネットワーク名 コンテナ名|コンテナID



データ・ボリューム

コンテナの中でデータを保持しても、コンテナを削除してしまえば残らない。

ので、永続化を目的にボリュームを用意する。

[1]ホストのお好きなディレクトリをコンテナが参照

docker run -v /tmp/host:/tmp/guest -d centos

[2]ホスト側にDocker用のボリュームを作成し、それを参照

「/var/lib/docker」配下に配置されるため、[1]の短縮っぽい記載ができる。

docker run -v /tmp/guest -d centos

コンテナが削除されれば、その参照ができなくなるようだ。

「/var/lib/docker/volumes/」にある。

# ボリュームの確認

docker volume ls

# 削除
docker volume rm ボリュームID

まとめ:ボリューム用のコンテナを用意しよう(データボリュームコンテナ)


ボリューム付でコンテナの作成だけする

docker create -v /dbdata --name dbdata centos



コンテナ名でボリュームを参照する

docker run -d --volumes-from dbdata --name db mysql


共有ストレージ

※要プラグイン調査

ホストに依存しない設定が可能。


ストレージの作成

docker volume create -d プラグイン名 --name ボリューム名 -o size=サイズ


バインドには「-v」オプションを使えばよい。


Docker Compose

複数のコンテナを使うDockerアプリケーションを、定義・実行するツール。

docker-compose.ymlの記載方法だけなんとなくわかれば、

あとはコマンドで立ち上げるだけ。


流れ

[1]Dockerfileつくる

[2]docker-compose.ymlで独立したDockerfileをとりまとめる

[3]docker-compose upでアプリケーション全体を起動・実行


基本的なコマンド


バックグラウンドでコンテナを作成、実行

docker-compose up -d



コンテナの開始、停止(コンテナが存在しないとだめ)

docker-compose start

docker-compose stop


yamlを元にコンテナを停止、削除

docker-compose down



コンテナ一覧

docker-compose ps



docker-compose.yml

環境変数は${変数}で使える。


例)docker-compose.yml

version: '2'

services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}

version

Composeファイル形式のフォーマット。

20170710現在では2で。

version: '2'

大項目

は、「services」「networks」「volumes」になる。

services用設定

定義できるものは「docker run」に似ている。

services:

web: # 任意のサービス名をつけられる
hostname: name # ホスト名はコンテナの判別にも便利
depends_on: # 依存関係のある他サービスを先に実行
- db
networks: # カスタムネットワークを指定する場合
- custom_network
default: # アプリ全体に適用されるデフォルトネットワークの場合
aliases:
- hoge # ネットワーク上のサービスに対してのエイリアス
build:
context: . # Dockerfile があるディレクトリのパス
image: centos # buildが存在する場合はイメージ名付与
environment: # 環境変数を追加
- Hoge=hoge
expose: # 他のコンテナへに対し開放ポートを指定
- "80"
ports: # ホストとコンテナのポートをバインド
- "80":"80"
volumes: # ボリュームの紐付け
- /tmp/guest_dir
- /tmp/host:/tmp/guest
volumes_from: # 他のボリュームへの紐付け
- db
working_dir: /tmp/guest_dir # コンテナの作業用ディレクトリ
# tty: true # dockerコマンドの-tにあたるもの
privileged: true # ケーパビリティの制限を解放

depends_onとlinksの違い

バージョン2ではlinksはかかなくてもいいみたい

※privilegedとかケーパビリティとか

http://www.tsugihagi.net/entry/2014/10/05/083120

volumes用設定

定義できるものは「docker volumes create」に似ている。

共有ストレージとか使ってないなら無縁?

valumes:

networks用設定

定義できるものは「docker network create」に似ている。

カスタムネットワークとか使ってないなら無縁?

networks: