ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

docker imageをdockerhubへpushする。

docker buildで作成してimageファイルをpushする。

作成したイメージにtagでdocker repositoryを設定する。

$ docker tag 826a18da94ff haronoid/dockertest

レポジトリーへのPushでtagされたimageがアップロードされる。

$ docker push haronoid/dockertest
The push refers to a repository [docker.io/haronoid/dockertest]
a74574bf6783: Pushed 
d4f2a7c79b47: Pushed 
7011d9296bb1: Pushed 
b5ee65081529: Pushed 
0233c503a5a8: Pushed 
91dc37bfc1a4: Mounted from library/php 
b51618e00eb6: Mounted from library/php 
78d8d06072ea: Mounted from library/php 
d91a3c153396: Mounted from library/php 
507e32a605ce: Mounted from library/php 
dcdbe9fe2ca1: Mounted from library/php 
2f6273a5f133: Mounted from library/php 
4c0354ed71f4: Mounted from library/php 
2c3aa4e96952: Mounted from library/php 
5cd2e0cfe892: Mounted from library/php 
c3d26400d3ff: Mounted from library/php 
37412c153883: Mounted from library/php 
c01c63c6823d: Mounted from library/php 
latest: digest: sha256:cb5bc5cf3a905765e59e8702c8170391b1631e41c83d180af4475dcdfafc1843 size: 4087

Docker-composeでWordPressを構築してみる。

DBデータ用イメージ作成

Volumeリンクで保存場所としてのコンテナで使用する。

Dockerfile

FROM busybox

MAINTAINER 0.1 haronoid

VOLUME /var/lib/mysql

イメージ作成

$ docker build -t dataonly

コンテナ作成

$ docker run -it --name dataonly dataonly
/ # exit
  • コンテナはExitで終了しておく

Docker-composeを利用し、WordPressのWebServer,DbServerを構築

ymlファイルにwebserverとdbserverを記述 * webserver - imaege : wordpressのlatest - portts : ホストの80ポートをフォワード - dbserverをmysqlのアリアスでつなぐ * dbserver - image : mysqlのlatest - valumes_from : データファイル用のdataonlyコンテナを指定 - 環境変数にルートパスワードを指定

Docker-compose.yml

webserver:
    image: wordpress

    ports:
      - "80:80"

    links:
      - "dbserver:mysql"

dbserver:
    image: mysql

    volumes_from:
      - dataonly

    environment:
      MYSQL_ROOT_PASSWORD: mysql

Docker-Compose実行 wordpressmysqlの最新をpullしDocker-Composeの内部コンテナとして起動する。

$ docker-compose up -d
Pulling webserver (wordpress:latest)...
latest: Pulling from library/wordpress
85b1f47fba49: Already exists
d8204bc92725: Pull complete
92fc16bb18e4: Pull complete
31098e61b2ae: Pull complete
f6ae64bfd33d: Pull complete
003c1818b354: Pull complete
a6fd4aeb32ad: Pull complete
a094df7cedc1: Pull complete
e3bf6fc1a51d: Pull complete
ad235c260360: Pull complete
edbf48bcbd7e: Pull complete
fd6ae81d5745: Pull complete
69838fd876d6: Pull complete
3186ebffd72d: Pull complete
b24a415ea2c0: Pull complete
225bda14ea90: Pull complete
d47a53aaaacc: Pull complete
ce9b97a033e9: Pull complete
Digest: sha256:6216f64ab88fc51d311e38c7f69ca3f9aaba621492b4f1fa93ddf63093768845
Status: Downloaded newer image for wordpress:latest
Creating wordpress_dbserver_1 ... 
Creating wordpress_dbserver_1 ... done
Creating wordpress_webserver_1 ... 
Creating wordpress_webserver_1 ... done

確認

$ docker-compose ps
        Name                      Command             State         Ports       
--------------------------------------------------------------------------------
wordpress_dbserver_1    docker-entrypoint.sh mysqld   Up      3306/tcp          
wordpress_webserver_1   docker-entrypoint.sh apach    Up      0.0.0.0:80->80/tcp
                        ...     

データ専用コンテナの起動を確認

$ docker start -ia dataonly
/ # ls /var/lib/mysql

稼働確認

$ docker-compose run webserver /bin/sh
# ls

http://localhostよりWordPress稼働状況を確認

コンテナの停止

$ docker-compose stop

コンテナの削除

$ docker-compose rm

データ専用コンテナのバックアップ

$ docker export dataonly > backup.tar

$ tar xvf barkup.tar

データのリストア

$ tar xvf backup.tar

MySQL サーバー構築

Mysqlイメージダウンロード

$ docker pull mysql

コンテナ作成

docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql

Mysqlログイン

$ docker exec -it mysql /bin/bash

# mysql -h localhost -uroot -p

mysql>create table test1 (clm1 int, clm2 text(500));

mysql> insert into test1 values (1, 'abc');
mysql> insert into test1 values (1, 'def');
mysql> insert into test1 values (2, 'ghj');
mysql> insert into test1 values (2, 'ttt');

mysql> select clm1, group_concat(clm2) from test1 group by clm1;
+------+--------------------+
| clm1 | group_concat(clm2) |
+------+--------------------+
|    1 | abc,def            |
|    2 | ghj,ttt            |
+------+--------------------+
2 rows in set (0.00 sec)

Mysqlサーバーの永続化

docker pull busybox

docker run -v /var/lib/mysql --name mysql_data busybox

docker run --volumes-from mysql_data --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql

アプリ用コンテナから上記で作成したmysqlコンテナに接続する

docker run --name NAME -h HOSTNAME --volumes-from mysql_data --link mysql:ALIAS_MYSQL -i -t -d HOGE_APP
``

## 接続

mysql -h ALIAS_MYSQL -uroot -p


参考URL
https://qiita.com/astrsk_hori/items/e3d6c237d68be1a6f548

busyboxについて
http://monoist.atmarkit.co.jp/mn/articles/0802/04/news114.html

行データをカンマ区切り表示

ORACLE, MYSQLの場合

GROUP_CONCATを使用する。

SELECT GROUP_CONCAT(CLM_NAME) FROM TABLENAME;
  • テスト用データ差癖
create table test1 (clm1 int, clm2 text(500));
insert into test1 values (1, 'abc');
insert into test1 values (1, 'def');
insert into test1 values (2, 'ghj');
insert into test1 values (2, 'ttt');
select clm1, group_concat(clm2) from test1 group by clm1;
+------+--------------------+
| clm1 | group_concat(clm2) |
+------+--------------------+
|    1 | abc,def            |
|    2 | ghj,ttt            |
+------+--------------------+
2 rows in set (0.00 sec)

MS SQL Server の場合

FOR XML PATH('')を使用

SELECT
   NAME
  ,(
    SELECT
      NAME + ','
    FROM
     USERS
    WHERE
      USER_GROUP_ID = GROUPS.ID
    FOR XML PATH('')
  ) AS USER_NAMES
FROM
  GROUPS

Web開発用 イメージ作成

開発用Dockerfileの作成について

Dockerfileをそれぞれ作成すると、開発環境がバラバラになる可能性があるため、 中間イメージとしてDockerfileを作成する必要がある。 狙いはベースイメージとして開発環境を固定し、開発成果物のみを各々の環境でデプロイしテストが可能にする。

想定フォルダー構成

/home/docker/webdev
├ Dockerfile.base
├ Dockerfile
 website.tar

Dockerfile.base

ベースとなるCentOSにWebサーバーをインストールしたもの ビルドの後、website.tarを指定場所にコピーする処理を実装

FROM centos:latest

RUN ["yum", "-y", "install", "httpd"]

ONBUILD ADD website.tar /var/www/html

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

※tarファイルは指定フォルダーへ展開される。

web-baseイメージの作成

$ docker build -t web-base -f Dockerfile.base .
Sending build context to Docker daemon  5.632kB
Step 1/4 : FROM centos:latest
latest: Pulling from library/centos
....
Step 2/4 : RUN yum -y install httpd
...
Step 3/4 : ONBUILD add website.tar /var/www/html
 ---> Running in 37afe974fe3d
 ---> ed66927c562e
Removing intermediate container 37afe974fe3d
Step 4/4 : CMD /usr/sbin/httpd -D FOREGROUND
...
Successfully built 703c87e8a452
Successfully tagged web-base:latest

イメージの確認

centosがpullされ、centosをベースにhttpdがインストールされたweb-baseイメージが作成されている。

$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
web-base                       latest              703c87e8a452        3 minutes ago       309MB
centos                         latest              196e0ce0c9fb        6 weeks ago         197MB

we-baseイメージをベースとするWebサーバ用イメージの作成

wbe-baseをベースとしたイメージを作成する。 Dockerfile

FROM web-base

web-imageの作成

このタイミングでwebsite.tarファイルがコピーされる。

$ docker build -t web-image .
Steop 0 : FROM web-base
Trigger 0, ADD website.tar /var/www/html/
...

コンテナの作成・起動

web-imangeを利用してコンテナを実行する。

$ docker run -d -p 80:80 web-image

tar.gzからイメージ作成

関連ファイル

関連ファイルをフォルダーではなくアッシュファイルにまとめる

/home/docker
├ Dockerfile
⎿ config

docker.tar.gz

$ tar tvfz docker.tar.gz

圧縮ファイルを指定して、イメージを作成する。

$ docker builder - < docker.tar.gz
Sending build context to Docker daemon 
Sending build context to Docker daemon
Step 0 : FROM centos:centos7
...
Successfully built...

Dockerfile 作成

Dockerfile

Dockerイメージを作成する時の情報を保持する

※主要命令

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

FROM

FROM [イメージ名]
FROM [イメージ名]:[タグ名]
FROM [イメージ名]@[ダイジェット]

RUN

イメージを作成するために実行するコマンド

RUNで実行されるタイミングで中間イメージはレイア化され、分かれてします。 すべてのレイアは127レイアを超えられない。

RUN [実行したいコマンド]

※Exec形式

RUN ["echo", "hello"]
RUN ["/bin/bash","-c","echo 'hello'"]

※Shell形式

RUN echo "hello"

CMD

イメージを元に生成したコンテナ内で実行するコマンド。 Dockerfileでは1つのコマンドのみ記述可能。

CMD [実行したいコマンド]

※記述はExec形式とShell形式を使用

ENTRYPOINT

docker run コマンドで実行した時に実行されるコマンド

※CMDとの違い、CMDの場合、docker run時に指定したコマンドが優先実行されるがENTRYPOINTのコマンドは指定が有っても強制的に実行される。

ENTRYPOINT [実行したいコマンド]

※記述はExec形式とShell形式を使用

docker run実行時パラメータを任意に指定して実行することが可能です

$ docker run -it sample -d 2

※イメージのENTRYPOINTに指定されたコマンドに「-d 2」のパラメータが適用される。

ONBUILD

ビルド実行後に実行されるコマンド

ONBUILD [実行したいコマンド]

ONBUILD ADD website.tar /var/www/html/

ADD指定によりビルド後、website.tarが/var/www/html/配下に鉢して、tarファイルが展開される。

DockerfileからDockerイメージ作成

「docker build -t {イメージ名}:{タグ名} {Dockerfileの場所}」

Dockerfileの場所に有るファイルはすべてDocker関連ファイルのルートとして必要なファイルやコマンドで使用するファイルとなる。

$ docker build -t myimage:1 /home/docker/webdev