俺のDocker入門(基本編)

Dockerの勉強を始めたので
Qiitaとかに上げるほどでもない自分用メモとしてここに書いておきます。

Dockerとは

コンテナ仮想化環境でアプリケーションを管理/実行するためのオープンソースのプラットフォーム。

コンテナ型仮想化技術とは

「コンテナ型仮想化技術」の画像検索結果
一般的な仮想化技術がホストOSまたはハイパーバイザ上でゲストOS複数台動かすのに対し、コンテナ型仮想化技術はホストOSを論理的な区画(コンテナ)に区切りホストOS資源を共有しながら個別のOSのように使えるようにする技術。

Dockerの特徴

DockerはLinux上で動作し、GO言語で書かれている。
WindowsやMac OS上で動かす場合はLinuxをVirtualBoxなどでゲストOS化し、Docker Tool Boxで操作する必要がある。

Dockerでは各種アプリケーション資源をコンテナ定義(イメージ定義)にまとめて保存できるため、一度作ったコンテナはDockerの動くどの環境にコピーしても動かすことができる。

Dockerの基本機能

大きく3つの機能がある。

Dockerイメージを作る機能

アプリケーションの実行に必要なプログラム群、ライブラリ、ミドルウェア、OSやネットワーク設定などを一つにまとめたDockerイメージを作る。 Dockerイメージは実体として動作するコンテナの定義となる。
DockerイメージはコマンドやDockerfileというスクリプトで作成できる。 Dockerイメージは複数を組み合わせて新しいイメージを作ることもできる。

Dockerコンテナを動かす機能

DockerエンジンはLinux上でコンテナ単位でサーバを管理する。
コンテナはDockerイメージから作りだし、一つのイメージから複数のコンテナを起動できる。
それぞれは論理的に分割された状態でOSのリソース共有するため、互いが影響を与え合うことはない。

Dockerイメージを公開・共有する機能

Docker HubなどのDockerレジストリを利用してイメージの保存、公開、共有ができる。

GitHubなどのgitホスティングサービスと連携し、リポジトリのDockerfileファイルが変更されると、自動的にDocker Hubのイメージをリビルドするといったこともできる。

Dockerコンポーネント

Dockerでは各種コンポーネントが提供されている。

Docker Engine

Dockerのコア機能。
イメージの生成やコンテナの起動を行う。 Dockerコマンドの実行や、Dockerfileによるイメージ生成も行う。

Docker Kitematic

Dockerイメージの生成やコンテナ起動を行うためのGUIツール。

Docker Registry

イメージを保存・公開・共有するための機能。
公式レジストリサービスのDocker Hubもこれを使用している。

Docker Compose

複数のコンテナ群を一元管理し定義、実行するツール。
composeは作曲という意味。

Docker Machine

仮想化基盤(Virtual BoxやEC2)にDockerの実行環境をコマンドで構築するツール。

Docker Swarm

複数のDockerホストをクラスタ化するツール。
クラスタの管理を行う機能をManager、コンテナ実行を行う機能をnodeという。
swarmは群れという意味。

Dockerを使うには

LinuxならDockerをインストールすればそのまま使用することができる。
Mac OSかWindwosならば、Docker Toolboxを使う。

Docker Toolboxの場合いちいちゲストOSを立ち上げる手間がかかる。
Docker for MacかDocker for Windowsを使用すればゲストOSを意識せずDockerを使うことができる。

Dockerコマンド

Dockerイメージの操作

イメージのダウンロード(docker pull)

# CentOSのDockerイメージを取得
>docker pull centos

イメージの一覧表示(docker images)

>docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
mysql                         latest              7bb2586065cd        13 days ago         477MB
centos                        latest              9f38484d220f        3 weeks ago         202MB
ubuntu                        latest              94e814e2efa8        4 weeks ago         88.9MB
kitematic/hello-world-nginx   latest              03b4557ad7b9        3 years ago         7.91MB

イメージの詳細(docker inspect)

>docker inspect mysql
[
    {
        "Id": "sha256:7bb2586065cd50457e315a5dab0732a87c45c5fad619c017732f5a13e58b51dd",
        "RepoTags": [
            "mysql:latest"
        ],
        "RepoDigests": [
            "mysql@sha256:a7cf659a764732a27963429a87eccc8457e6d4af0ee9d5140a3b56e74986eed7"
        ],

イメージの検索(docker search)

>docker search oracle
NAME                                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
oraclelinux                           Official Docker builds of Oracle Linux.         572                 [OK]          
jaspeen/oracle-11g                    Docker image for Oracle 11g database            97                                      [OK]
oracle/openjdk                        Docker images containing OpenJDK Oracle Linux   54                                      [OK]

イメージの削除(docker rmi)

>docker images mysql
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              7bb2586065cd        2 weeks ago         477MB

>docker rmi -f 7bb2586065cd
Untagged: mysql:latest
Untagged: mysql@sha256:a7cf659a764732a27963429a87eccc8457e6d4af0ee9d5140a3b56e74986eed7
Deleted: sha256:7bb2586065cd50457e315a5dab0732a87c45c5fad619c017732f5a13e58b51dd
Deleted: sha256:5362a97701b6ba3d39453e9e8b435b4cc3d7b493fb506780b8e2ec9c3ee20b8e
Deleted: sha256:91ae6166a0c2de34f36c2bb6b66ba3782ec6186337b87362961fad845f5ce236
Deleted: sha256:ae307e2a0c006325d4b96c1f0a40b1ae35cf9a034435ec9925291dafed69e01f
Deleted: sha256:b000e0eccfc8ce916a49183e5168c11b65085d940d76ef9c7c264462aa5f1f5c
Deleted: sha256:97a8302a9556468404f8aeda16ef35d94075cc95ed72249fb2bc2835984e8dd5
Deleted: sha256:4e83d49f100fcd78f57b8f1844faad134d8328c5280be14d85a61ae7c7ffb981
Deleted: sha256:11f5b5e11d25f08da50ca38993f02a3194565beaa516b66970adbbffa58141e0
Deleted: sha256:2db1d1b89506973f51991ae03cb18e24f16aa2ef2b6cda4cf172b7ae4f8c15a7
Deleted: sha256:31cd685e0a1656331ab15ee8aadf47ccb1580e80baef149a8e1dfa0e7283ce64
Deleted: sha256:5f10b55a337d5bf432b0e44e22bd5730bde67251201b6890e923e3d2c641fa64
Deleted: sha256:85c59144fcd7e0cba06a9ec8e502b993bcf75035c95524aa6c92b3072828ce94
Deleted: sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda

Docker Hubへログインする(docker login)

>docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: danishi
Password:
Login Succeeded

Docker Hubからログアウトする(docker logout)

>docker logout
Removing login credentials for https://index.docker.io/v1/

Dockerイメージをアップロードする(docker push)

# centosのイメージに別名をつけて保存
>docker commit -a "danishi" -m "first commit" centos1 danishi/oreno_centos:1.0
sha256:2c3d963194e237db9d1c3f0812bdcf766205a26d695770ec2b0b4d65ea34da15
# Docker Hubに保存する
>docker push  danishi/oreno_centos:1.0
The push refers to repository [docker.io/danishi/oreno_centos]
b2bc7b51bb54: Pushed
d69483a6face: Mounted from library/centos
1.0: digest: sha256:df918c62405f89f51faf0075c74d76d1ad971ba5c3e2feb605f565ef2cbe1033 size: 736
Docker Hubで確認できる。

イメージの保存(docker save)

# tar形式でローカルに保存
>docker save -o centos.tar centos

イメージの読み込み(docker load)

>docker load -i centos.tar
Loaded image: centos:latest

Dockerコンテナの操作

コンテナを生成する(docker create)

インストール済みのイメージからコンテナを生成する。
コンテナ起動はしないため、停止状態となる。
>docker create mysql
3de55c1e0f5dcf0678a16989c8249eaefb482ed9a0b694f633bd81cd6d4fb3f4

コンテナを生成して起動する(docker run)

>docker run centos /bin/pwd
/

# コンテナを起動してシェルを実行
>docker run -it centos /bin/bash
[root@07c3afbb7d29 /]#

コンテナを起動する(docker start)

>docker start 4f86513d5b51
4f86513d5b51

コンテナを停止する(docker stop)

>docker stop 4f86513d5b51
4f86513d5b51

コンテナを再起動する(docker restart)

# 5秒後に再起動する
>docker restart -t 5 07c3afbb7d29
07c3afbb7d29

コンテナを一時停止/再開する(docker pause/docer unpouse)

# Webサーバを起動(http://loclahostでアクセス可能)
>docker run -d -p 9999:80 httpd
fc47c110b66b4e85b9430f5fe9976276fbdac9f37f3b4d36737e1cc7021b5f84

# 一時停止するとアクセスできなくなる
>docker pause fc47c110b66b
fc47c110b66b

# 再開するとアクセスできるようになる
>docker unpause fc47c110b66b
fc47c110b66b

コンテナを削除する(docker rm)

>docker rm ce23a628e8af
ce23a628e8af

コンテナを確認する(docker ps)

# 起動中のコンテナを確認
>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
07c3afbb7d29        centos              "/bin/bash"         About a minute ago   Up 54 seconds                           eager_jackson

# 停止中のコンテナも含めて確認
>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS               NAMES
07c3afbb7d29        centos              "/bin/bash"              About a minute ago   Up About a minute                              eager_jackson
4f86513d5b51        centos              "/bin/pwd"               7 minutes ago        Exited (0) 6 minutes ago                       kind_montalcini
85798cc79955        mysql               "docker-entrypoint.s…"   9 minutes ago        Exited (1) 9 minutes ago                       affectionate_chaplygin

コンテナのログを確認(docker logs)

>docker run centos /bin/cal
     April 2019
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
>docker start b4f4d016ac23
b4f4d016ac23

>docker logs b4f4d016ac23
     April 2019
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

     April 2019
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

コンテナの状態を確認(docker stats)

>docker stats 07c3afbb7d29
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
07c3afbb7d29        eager_jackson       0.00%               1.773MiB / 1.934GiB   0.09%               968B / 0B           2.73MB / 0B         2

コンテナに接続する(docker attach)

# bashを起動。exitで抜けるとコンテナが終了するため(ctrl+p⇒ctrl+q)で抜ける。
>docker run -it centos /bin/bash
[root@0fd647a2c70e /]# read escape sequence
>docker attach 0fd647a2c70e
[root@0fd647a2c70e /]#

コンテナでプロセスを実行する(docker exec)

# bashを起動。exitで抜けるとコンテナが終了するため(ctrl+p⇒ctrl+q)で抜ける。
>docker run -it centos /bin/bash
[root@0fd647a2c70e /]# read escape sequence
# 別プロセスでbashを立ち上げる。
>docker exec -it 0fd647a2c70e /bin/bash
[root@0fd647a2c70e /]# exit
exit
# コンテナは終了しない。
>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
0fd647a2c70e        centos              "/bin/bash"          5 minutes ago       Up 4 minutes                               musing_goldstine
fc47c110b66b        httpd               "httpd-foreground"   41 minutes ago      Up 41 minutes       0.0.0.0:9999->80/tcp   optimistic_austin

コンテナで稼働中のプロセス確認(docker top)

>docker top fc47c110b66b
PID                 USER                TIME                COMMAND
2301                root                0:00                httpd -DFOREGROUND
2346                bin                 0:00                httpd -DFOREGROUND
2347                bin                 0:00                httpd -DFOREGROUND
2348                bin                 0:00                httpd -DFOREGROUND
2442                bin                 0:00                httpd -DFOREGROUND

コンテナで行われているポートフォワーディングを確認(docker port)

>docker port fc47c110b66b
80/tcp -> 0.0.0.0:9999

コンテナのリネーム(docker rename)

>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
0fd647a2c70e        centos              "/bin/bash"          10 minutes ago      Up 9 minutes                               musing_goldstine
fc47c110b66b        httpd               "httpd-foreground"   About an hour ago   Up About an hour    0.0.0.0:9999->80/tcp   optimistic_austin

>docker rename musing_goldstine centos1

>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
0fd647a2c70e        centos              "/bin/bash"          11 minutes ago      Up 10 minutes                              centos1
fc47c110b66b        httpd               "httpd-foreground"   About an hour ago   Up About an hour    0.0.0.0:9999->80/tcp   optimistic_austin

コンテナ⇔ホストOS間のファイルコピー(docker cp)

>docker cp centos1:/etc/passwd C:\Temp

コンテナの差分を確認する(docker diff)

# コンテナがイメージから生成されてからの差分を調べる。
>docker run -it --name centos1 centos /bin/bash
[root@74908ba8a131 /]# mkdir test
[root@74908ba8a131 /]# exit
exit

>docker diff 74908ba8a131
C /root
A /root/.bash_history
A /test

コンテナからイメージを作成する(docker commit)

>docker commit -a "danishi" -m "first commit" centos1 danishi/oreno_centos:1.0
sha256:2c3d963194e237db9d1c3f0812bdcf766205a26d695770ec2b0b4d65ea34da15

>docker run -it --name oreno_centos1 danishi/oreno_centos:1.0 /bin/bash
[root@f13321dd0ed4 /]#

Docker情報の確認

Dockerのバージョンを確認する(docker version)

>docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:31 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false

Docker実行環境の確認(docker info)

>docker info
Containers: 3
 Running: 1
 Paused: 0
 Stopped: 2
Images: 7
Server Version: 18.09.2
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 09c8266bf2fcf9519a651b04ae54c967b9ab86ec
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.9.125-linuxkit
Operating System: Docker for Windows
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.934GiB
Name: linuxkit-00155d950105
ID: RXER:VKXH:QIOR:IT66:UZME:M6H3:QJOI:YTVY:YYIP:5LY7:RCD4:4X6T
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 29
 Goroutines: 56
 System Time: 2019-04-10T07:27:05.5282831Z
 EventsListeners: 1
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine

Dockerfile

Dockerイメージの定義をスクリプト化したもの。

基本構文

書式

コマンド 引数

コメント

# コメント
コマンド 引数 # コメント

/* ~
*/
のようなブロックコメントは書けない

命令

命令説明
FROMベースイメージの指定
MAINTAINER作成者情報
RUNコマンド実行
CMDデーモン実行
LABELラベルの指定
EXPORTポートのエクスポート
ENV環境変数の指定
ADDファイル・ディレクトリの追加
COPYファイルのコピー
VOLUMEボリュームのマウント
ENTRYPOINTデーモンの実行
USERユーザの指定
WORKDIR作業ディレクトリの変更
ONBUILDビルド完了後に実行するコマンド

Dockerfileを作ってイメージをビルドしてみる

# ベースイメージの指定(必須)
FROM centos:latest

# 作成者情報(任意)
MAINTAINER Hoge <mail@example.com>
この内容でDockerfileというファイル名で保存する。 docker buildコマンドでイメージをビルドする。
>docker build -t build_centos:1.0 .
Sending build context to Docker daemon  440.4MB
Step 1/2 : FROM centos:latest
 ---> 9f38484d220f
Step 2/2 : MAINTAINER Hoge <mail@example.com>
 ---> Running in 1072f4d2bda7
Removing intermediate container 1072f4d2bda7
 ---> 450742c01e43
Successfully built 450742c01e43
Successfully tagged build_centos:1.0
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

>docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
build_centos                  1.0                 450742c01e43        12 seconds ago      202MB

>docker run -it build_centos:1.0 /bin/bash
[root@f81eb38cceaa /]#

色々試してみる

# ベースイメージの指定(必須)
FROM centos:latest

# 作成者情報(任意)
MAINTAINER Hoge <mail@example.com>

# RUN: docker buildするときに実行される
RUN echo "now building..."
RUN yum -y install httpd

# 公開ポート
EXPOSE 80

# CMD: docker runするときに実行される
CMD echo "now running..."
CMD yum -y update