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実行 wordpressとmysqlの最新を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');
- SQL実行
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