【Ubuntu】【Docker】Dockerの導入〜基本操作【SW】

Dockerの導入〜基本操作
 
Docker の学習のために、Ubuntu 18.04 環境に Docker を導入してみる。
学習するにあたっては主に下記の書籍を使ったが、書籍は (3年前となる) 2015/9/26 発売と古く, Docker のインストールおよび設定については書籍の情報は使用できなかった。

Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)

Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)

 

 

環境

  • Ubuntu 18.04
  • Docker 18.06.1-ce

 

Docker の基本操作

Docker のインストール

 

公式サイトの手順に従いインストールする

ベンダーソフトなので、インストール方法が結構変わることは仕方ない。
常に、公式サイトを見るのが無難そう。

% sudo apt-get update
% sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
% curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
% sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
      uid           [  不明  ] Docker Release (CE deb) <docker@docker.com>
      sub   rsa4096 2017-02-22 [S]

bash 使用時

% sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) edge"

fish shell 使用時

% sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu "(lsb_release -cs)" edge"
% sudo apt-get update
% sudo apt-get install -y docker-ce

 

インストール確認をする
% docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:24:51 2018
 OS/Arch:           linux/amd64
 Experimental:      false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/version: dial unix /var/run/docker.sock: connect: permission denied

 
 

Docker の設定

デフォルト状態で systemctl enable となっており、かつ、すでに稼動している。

% systemctl status docker

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-09-29 19:46:50 JST; 29min ago
     Docs: https://docs.docker.com
 Main PID: 25078 (dockerd)
    Tasks: 42
   CGroup: /system.slice/docker.service
           ├─25078 /usr/bin/dockerd -H fd://
           └─25109 docker-containerd --config /var/run/docker/containerd/containerd.toml

 
 

Docker の実行

書籍のサンプルリポジトリを使用する
 

"enakai00" という文字列を含むリポジトリを検索する。
docker search enakai00
Warning: failed to get default registry endpoint from daemon (Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/info: dial unix /var/run/docker.sock: connect: permission denied). Using system default: https://index.docker.io/v1/
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/search?limit=25&term=enakai00: dial unix /var/run/docker.sock: connect: permission denied

sudo を付けないと検索できない。

% sudo docker search enakai00
NAME                                     DESCRIPTION                               STARS               OFFICIAL            AUTOMATED
enakai00/jupyter_tensorflow                                                        5                                       
enakai00/dbs                                                                       0                                       
enakai00/fedora                          Sample fedora repository for dockerbon.   0                                       
enakai00/test-httpd                                                                0                                       
enakai00/epmysql                                                                   0                                       
enakai00/app                                                                       0                                       
enakai00/centos                          Sample CentOS repository for dockerbon.   0                                       
enakai00/web                                                                       0                                       
enakai00/eplite                                                                    0                                       
enakai00/httpd                                                                     0                                       
enakai00/ostools                                                                   0                                       
enakai00/vcp_base                                                                  0                                       
yacchin1205/enakai00-tensorflow-kernel                                             0 

 

最新バージョンのコンテナイメージをダウンロードする
% sudo docker pull enakai00/centos
Using default tag: latest
latest: Pulling from enakai00/centos
a3ed95caeb02: Pull complete 
a5b52df5865b: Pull complete 
Digest: sha256:49ecd6397d1f23deb245d3e0332862d68a9d34bb1d030066ae6175b8e9540c34
Status: Downloaded newer image for enakai00/centos:latest

 

全リビジョンのコンテナイメージをダウンロードする

pull -a とする

% sudo docker pull -a enakai00/centos

 

ダウンロードしたイメージを確認する。

なお、インストールしたコンテナイメージ本体は /var/lib/docker/. に配置される。

% sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
enakai00/centos     centos6             b8c94c5d2d7c        3 years ago         203MB
enakai00/centos     centos7             3bd78cf8ed76        3 years ago         172MB
enakai00/centos     latest              3bd78cf8ed76        3 years ago         172MB

 

コンテナイメージを実行する

書式

docker run [オプション] [REPOSITORY]:[TAG] [コマンド]
% sudo docker run -it --name centos01 enakai00/centos:centos6 /bin/bash

 
起動した Docker の OS 種別を見てみる。

[root@3d6b2f8a50bf /]# cat /etc/centos-release 
CentOS release 6.6 (Final)

 
NIC の設定を見てみる。

[root@3d6b2f8a50bf /]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

 
df コマンドを実行してみる。

# df -h 
Filesystem      Size  Used Avail Use% Mounted on
overlay         912G   73G  793G   9% /
tmpfs            64M     0   64M   0% /dev
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/sda1       912G   73G  793G   9% /etc/resolv.conf
/dev/sda1       912G   73G  793G   9% /etc/hostname
/dev/sda1       912G   73G  793G   9% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           7.8G     0  7.8G   0% /proc/acpi
tmpfs            64M     0   64M   0% /proc/kcore
tmpfs            64M     0   64M   0% /proc/keys
tmpfs            64M     0   64M   0% /proc/timer_list
tmpfs            64M     0   64M   0% /proc/sched_debug
tmpfs           7.8G     0  7.8G   0% /proc/scsi
tmpfs           7.8G     0  7.8G   0% /sys/firmware

 

Docker から脱出する

Ctrl-p Ctrl-q を押す。

 

Docker に戻る

docker ps で稼動中のコンテナイメージを探し出して、docker attach [NAMES] でアタッチする。

% sudo docker ps
CONTAINER ID  IMAGE                    COMMAND      CREATED         STATUS        PORTS  NAMES
3d6b2f8a50bf  enakai00/centos:centos6  "/bin/bash"  15 minutes ago  Up 15 minutes        centos01

% sudo docker attach centos01

[root@3d6b2f8a50bf /]# 

 

コンテナ内にアプリをインストールする

httpd をインストールする。

# yum install -y httpd

 

Docker を停止する

docker stop で停止させる。停止させたコンテナイメージも含めて表示させるには docker ps -a とする。

% sudo docker stop centos01
centos01

% sudo docker ps -a
CONTAINER ID  IMAGE                    COMMAND      CREATED            STATUS                      PORTS  NAMES
3d6b2f8a50bf  enakai00/centos:centos6  "/bin/bash"  About an hour ago  Exited (137) 8 seconds ago         centos01

 
再度 docker start [NAMES] とすれば起動する。

% docker start centos01
centos01
% docker attach centos01

[root@3d6b2f8a50bf /]# 

 

スナップショットを作成する

コンテナイメージを停止状態にしてから docker commit を使う。
書式は docker commit [NAMES] [REPOSITORY]:[TAG] である。

[root@3d6b2f8a50bf /]# exit
% sudo docker commit centos01 neko/httpd:ver1.0
sha256:2912439fd984d93a6fe02e7e2fc99a7a5ad73c0c2876dcf98c526cdb1097e29e
% sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
neko/httpd          ver1.0              2912439fd984        28 seconds ago      261MB
enakai00/centos     centos6             b8c94c5d2d7c        3 years ago         203MB
enakai00/centos     centos7             3bd78cf8ed76        3 years ago         172MB
enakai00/centos     latest              3bd78cf8ed76        3 years ago         172MB

 

コンテナイメージを削除する

centos01 を削除する。このあとは docker ps -a としても表示されない。

% sudo docker rm centos01

 

コンテナのライフサイクル

f:id:dnkrnka:20180929215455p:plain

Dockerにおけるコンテナのライフサイクル - めもめも

 
 

ポートフォワーディングによる外部からの接続

コンテナ内で起動させた HTTP サーバに対して、外部マシンから接続する。
コンテナイメージは(上記にて)直前で commit したものを使用する。

 

コンテナイメージの起動
% sudo docker run -it -p 8000:80 --name web01 neko/httpd:ver1.0 /bin/bash

 

HTTPサーバが表示するファイルの作成
[root@1e1a5e839c7e /]# echo '<h1>Hello, Docker!</h1>' > /var/www/html/index.html
[root@1e1a5e839c7e /]# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2 for ServerName
                                                           [  OK  ]
(C-p C-q でホストに戻る)

 

外部からコンテナ内の HTTP サーバに接続してみる。

ブラウザにて http://localhost:8000 とする。
f:id:dnkrnka:20180929221951p:plain:w700
 

コンテナ内の HTTP サーバのログを取得する

docker diff を使ってコンテナ内での差分を確認する。
C は変更あり、A は追加を表す。

% sudo docker diff web01
C /var
C /var/run
C /var/run/httpd
A /var/run/httpd/httpd.pid
C /var/www
C /var/www/html
A /var/www/html/index.html
C /var/log
C /var/log/httpd
A /var/log/httpd/access_log
A /var/log/httpd/error_log
C /var/lock
C /var/lock/subsys
A /var/lock/subsys/httpd

 
コンテナ内の /var/log/httpd ディレクトリをホスト上の /tmp/. にコピーする。

% sudo docker cp web01:/var/log/httpd /tmp
% sudo ls -ltr /tmp/httpd/
合計 8
-rw-r--r-- 1 root root 469  929 22:19 error_log
-rw-r--r-- 1 root root 393  929 22:19 access_log

 

Docker の初期化

以下の要領で Docker の初期化が完了する。
1. /var/lib/docker/. 以下のファイルを消す。

% sudo rm -rf /var/lib/docker

 
2. docker.service の再実行を行う。

% sudo systemctl restart docker