カテゴリー: Docker

Vagrant CentOS7 上でdockerはじめてみた

Vagrant CentOS7 上でdockerはじめてみた

Vagrantbox.es
http://www.vagrantbox.es/

CentOS 7 x64 (Minimal, Shrinked, Guest Additions 4.3.26) (Monthly updates)
https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box

↑のboxで起動しただけの初期状態からdockerをインストールする。

■dockerを探す

[vagrant@localhost ~]$ yum search docker
Loaded plugins: fastestmirror
・・・・・
============================================================================================================ N/S matched: docker ============================================================================================================
cockpit-docker.x86_64 : Cockpit user interface for Docker containers
docker-logrotate.x86_64 : cron job to run logrotate on docker containers
docker-python.x86_64 : An API client for docker written in Python
docker-registry.noarch : Registry server for Docker
docker-registry.x86_64 : Registry server for Docker
docker-selinux.x86_64 : SELinux policies for Docker
docker.x86_64 : Automates deployment of containerized applications
docker-devel.x86_64 : A golang registry for global request variables (source libraries)

  Name and summary matches only, use "search all" for everything.

■インストール

[root@localhost ~]# yum install docker

[root@localhost ~]# systemctl status docker.service
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: inactive (dead)
     Docs: http://docs.docker.com

■いざ起動

[root@localhost ~]# systemctl start docker.service
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.

動かない。。

[root@localhost ~]# systemctl status docker.service
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: failed (Result: exit-code) since Fri 2015-06-26 03:37:05 UTC; 4min 2s ago
     Docs: http://docs.docker.com
  Process: 2467 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
 Main PID: 2467 (code=exited, status=1/FAILURE)

Jun 26 03:36:05 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
Jun 26 03:36:05 localhost.localdomain docker[2467]: time="2015-06-26T03:36:05Z" level=info msg="+job serveapi(unix:///var/run/docker.sock)"
Jun 26 03:36:05 localhost.localdomain docker[2467]: time="2015-06-26T03:36:05Z" level=info msg="Listening for HTTP on unix (/var/run/docker.sock)"
Jun 26 03:37:05 localhost.localdomain docker[2467]: time="2015-06-26T03:37:05Z" level=fatal msg="Shutting down daemon due to errors: error intializing graphdriver: exit status 1"
Jun 26 03:37:05 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Jun 26 03:37:05 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
Jun 26 03:37:05 localhost.localdomain systemd[1]: Unit docker.service entered failed state.

■以下のページを発見。

CentOS7でDockerを動かす場合
http://shimakaze.hatenablog.com/entry/2015/04/02/103449

■とりあえず「libdevmapper」インストール。

# yum -y install libdevmapper.so.1.02

[root@localhost ~]# systemctl start docker.service
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.

[root@localhost ~]# systemctl status docker.service
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: failed (Result: exit-code) since Fri 2015-06-26 03:45:26 UTC; 14s ago
     Docs: http://docs.docker.com
  Process: 2680 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
 Main PID: 2680 (code=exited, status=1/FAILURE)

Jun 26 03:45:26 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
Jun 26 03:45:26 localhost.localdomain docker[2680]: time="2015-06-26T03:45:26Z" level=info msg="+job serveapi(unix:///var/run/docker.sock)"
Jun 26 03:45:26 localhost.localdomain docker[2680]: time="2015-06-26T03:45:26Z" level=info msg="Listening for HTTP on unix (/var/run/docker.sock)"
Jun 26 03:45:26 localhost.localdomain docker[2680]: time="2015-06-26T03:45:26Z" level=fatal msg="Shutting down daemon due to errors: error intializing graphdriver: Error running DeleteDevice dm_task_run failed"
Jun 26 03:45:26 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Jun 26 03:45:26 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
Jun 26 03:45:26 localhost.localdomain systemd[1]: Unit docker.service entered failed state.

まだ動かない。。

■調べて以下のページをみつける。

[1.6.0][graphdriver] prior storage driver “devicemapper” failed: error intializing graphdriver #13008
https://github.com/docker/docker/issues/13008

[root@localhost lib]# pwd
/var/lib
[root@localhost lib]# rm -rf docker/

とりあえず消してみた。

[root@localhost ~]# systemctl start docker.service
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.

[root@localhost ~]# systemctl status docker.service -l
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: failed (Result: exit-code) since Fri 2015-06-26 03:51:46 UTC; 47s ago
     Docs: http://docs.docker.com
  Process: 15073 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
 Main PID: 15073 (code=exited, status=1/FAILURE)

Jun 26 03:51:45 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
Jun 26 03:51:46 localhost.localdomain docker[15073]: time="2015-06-26T03:51:46Z" level=info msg="+job serveapi(unix:///var/run/docker.sock)"
Jun 26 03:51:46 localhost.localdomain docker[15073]: time="2015-06-26T03:51:46Z" level=info msg="Listening for HTTP on unix (/var/run/docker.sock)"
Jun 26 03:51:46 localhost.localdomain docker[15073]: time="2015-06-26T03:51:46Z" level=fatal msg="Shutting down daemon due to errors: error intializing graphdriver: Unable to take ownership of thin-pool (centos-docker--pool) that already has used data blocks"
Jun 26 03:51:46 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Jun 26 03:51:46 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
Jun 26 03:51:46 localhost.localdomain systemd[1]: Unit docker.service entered failed state.

動かない・・・。

■一旦dockerを消す。

[root@localhost ~]# yum remove docker  

■とりあえずupdateする。

[root@localhost ~]# yum update

■もう一回いれてみる。

[root@localhost ~]# yum install docker

[root@localhost ~]# systemctl start docker

[root@localhost ~]# systemctl status docker
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: active (running) since Fri 2015-06-26 03:57:52 UTC; 17s ago
     Docs: http://docs.docker.com
 Main PID: 1027 (docker)
   CGroup: /system.slice/docker.service
           └─1027 /usr/bin/docker -d --selinux-enabled

Jun 26 03:57:51 localhost.localdomain docker[1027]: time="2015-06-26T03:57:51Z" level=warning msg="Docker could not enable SELinux on the host system"
Jun 26 03:57:51 localhost.localdomain docker[1027]: time="2015-06-26T03:57:51Z" level=info msg="+job init_networkdriver()"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="-job init_networkdriver() = OK (0)"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="Loading containers: start."
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="Loading containers: done."
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="docker daemon: 1.6.2 ba1f6c3/1.6.2; execdriver: native-0.2; graphdriver: devicemapper"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="+job acceptconnections()"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="-job acceptconnections() = OK (0)"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="Daemon has completed initialization"
Jun 26 03:57:52 localhost.localdomain systemd[1]: Started Docker Application Container Engine.

動いた・・・!

先に「libdevmapper.so.1.02」がはいってないといけなかったのか?

■動いたので自動起動に。

[root@localhost ~]# systemctl enable docker
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'

■Dockerイメージの検索

[root@localhost ~]# docker search centos
INDEX       NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                        The official build of CentOS.                   1087      [OK]       
docker.io   docker.io/tutum/centos                  Centos image with SSH access. For the root...   13                   [OK]
docker.io   docker.io/blalor/centos                 Bare-bones base CentOS 6.5 image                9                    [OK]
docker.io   docker.io/torusware/speedus-centos      Always updated official CentOS docker imag...   6                    [OK]
docker.io   docker.io/million12/centos-supervisor   Base CentOS-7 with supervisord launcher, h...   4                    [OK]
docker.io   docker.io/jdeathe/centos-ssh            CentOS-6 6.6 x86_64 / EPEL Repo. / OpenSSH...   3                    [OK]
docker.io   docker.io/layerworx/centos              A general CentOS 6 image with the EPEL6 an...   2                    [OK]
docker.io   docker.io/akroh/centos                  Centos 6 container that has been updated w...   0                    [OK]
docker.io   docker.io/nathonfowlie/centos-jre       Latest CentOS image with the JRE pre-insta...   0                    [OK]
docker.io   docker.io/pdericson/centos              Docker image for CentOS                         0                    [OK]

■Dockerイメージのダウンロード
とりあえず公式のcentosを取得する

[root@localhost ~]# docker pull docker.io/centos
Trying to pull repository docker.io/centos ...
7322fbe74aa5: Download complete
f1b10cd84249: Download complete
c852f6d61e65: Download complete
Status: Downloaded newer image for docker.io/centos:latest

■ダウンロードしたイメージの確認

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos    latest              7322fbe74aa5        7 days ago          172.2 MB

■Dockerコンテナの作成
docker runでコンテナの新規作成と実行の両方が行われる

[root@localhost ~]# docker run -it --name centos1 docker.io/centos:latest /bin/bash
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
[root@f89ddd90d0fd /]# 

実行された。

docker run の主なオプション
-i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定
-t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定
-d:バックグラウンドで実行する(後述)。既定では、コンテナーをフォアグラウンドで実行するため、Webサーバーやアプリケーションサーバーなど常時実行するコンテナーで指定
-p {ホストのポート番号}:{コンテナーのポート番号}:Dockerサーバーのホストとポートマッピングを構成

■コンテナにapache入れてみる。

[root@f89ddd90d0fd /]# yum install httpd

■一旦コンテナ停止

[root@f89ddd90d0fd /]# exit
exit

[Ctrl]+[d]キーでbashプロセスを終了できる。

コンテナを停止することなく、元のシェルに戻したい場合は[Ctrl-P]+[Ctrl-q]でコンテナのTTYを抜けられる。

■停止中のコンテナも含めてコンテナの状態を確認する

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                     PORTS               NAMES
f89ddd90d0fd        docker.io/centos:latest   "/bin/bash"         9 minutes ago       Exited (0) 3 minutes ago                       centos1

■コンテナの起動

[root@localhost ~]# docker start centos1
centos1

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES
f89ddd90d0fd        docker.io/centos:latest   "/bin/bash"         10 minutes ago      Up 19 seconds                           centos1 

■コンテナへの再接続

[root@localhost ~]# docker attach centos1
Enter押す
[root@f89ddd90d0fd /]# 

■[Ctrl-P]+[Ctrl-q]でTTY抜けてみる。

[root@f89ddd90d0fd /]# [root@localhost ~]# 

■コンテナの停止

[root@localhost ~]# docker stop centos1
centos1

■コンテナの再起動
※コンテナのプロセスを強制終了して再度スタート

[root@localhost ~]# docker restart centos1
centos1

■コンテナのコミット

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                     PORTS               NAMES
f89ddd90d0fd        docker.io/centos:latest   "/bin/bash"         About an hour ago   Exited (0) 7 seconds ago                       centos1

[root@localhost ~]# docker commit -a MOGUMAGU -m "CentOS7 installed Apache" centos1 localrepo:withApache
74fe551af11fbdbe8e5e4849fcd4dd580ce7057d80e976ceeaaf8b9750954756

保存したイメージの確認

[root@localhost ~]# docker images localrepo
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
localrepo           withApache          74fe551af11f        44 seconds ago      268.4 MB

イメージの作成履歴を見る

[root@localhost ~]# docker images -t
Warning: '-t' is deprecated, it will be removed soon. See usage.
└─f1b10cd84249 Virtual Size: 0 B
  └─c852f6d61e65 Virtual Size: 172.2 MB
    └─7322fbe74aa5 Virtual Size: 172.2 MB Tags: docker.io/centos:latest
      └─74fe551af11f Virtual Size: 268.4 MB Tags: localrepo:withApache

■コンテナの削除

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                     PORTS               NAMES
f89ddd90d0fd        docker.io/centos:latest   "/bin/bash"         About an hour ago   Exited (0) 5 minutes ago                       centos1
[root@localhost ~]# docker rm centos1
centos1
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# 

※保管が必要ならあらかじめdocker commitでイメージを保管しておくこと

■さっき作ったコンテナから起動

[root@localhost ~]# docker run -it --name centos2 localrepo:withApache /bin/bash
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
[root@5cdc79690cee /]# 
[root@5cdc79690cee /]# yum info httpd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Installed Packages
Name        : httpd
Arch        : x86_64
Version     : 2.4.6
Release     : 31.el7.centos
Size        : 9.4 M
Repo        : installed
From repo   : base
Summary     : Apache HTTP Server
URL         : http://httpd.apache.org/
License     : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
            : web server.

apache入ってる。

[Ctrl-P]+[Ctrl-q]でTTY抜ける

[root@5cdc79690cee ~]# [root@localhost ~]# 

コンテナの起動状態を確認。

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND             CREATED              STATUS              PORTS               NAMES
5cdc79690cee        localrepo:withApache   "/bin/bash"         About a minute ago   Up About a minute                       centos2

動いてる。

■webサーバとして起動する例
先ほどコミットしたlocalrepo:withApacheをベースにwebサーバを起動しブラウザから確認する。

[root@localhost ~]# docker run -d --name webserver --expose=80 --publish 80:80 localrepo:withApache /usr/sbin/httpd -D FOREGROUND 

上記でホストのipでブラウザアクセスしたらapacheの初期画面が表示される。

状態はこちら

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS                     PORTS                NAMES
6fd53d6fd905        localrepo:withApache   "/usr/sbin/httpd -D    3 minutes ago       Up 3 minutes               0.0.0.0:80->80/tcp   webserver
5cdc79690cee        localrepo:withApache   "/bin/bash"            46 minutes ago      Exited (0) 8 minutes ago                        centos2

実際のコンテンツなどはホストとボリュームを共有して保持しておくほうがいいみたい。