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

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

.Net プロジェクトでOracle接続エラー

.Net プロジェクトでOracle接続エラー

Oracleクライアントまではインストルしたが、何故かエラーになる。

要求された .Net Framework データ プロバイダーが見つかりません。これは、インストールされていない可能性があります。

原因はmachine.config?

ネットで調べた結果、machine.configの修正が必要と出た。

現在のmachine.config

<DbProviderFactories>
    <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>

有るのはSQLServerの分だけ、おそらくローカルにSQL Serverをインストールしたため設定済み状態

Oracle Providerを追加

<add name="ODP.NET, Unmanaged Driver" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET, Unmanaged Driver" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess"/>

以下のオプションはバージョンとアセンブリを特定値に工程するため、削除しておいたほうが無難

Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342

Docker にテスト用にOracle DBを構築する。

やりたいこと

Oracleが構築されているDocker Imageを入手し、Oracleインスタンスを起動させる。

参考にしたサイト

おそらく正攻法 https://qiita.com/lethe2211/items/0bb493fa93a0088cfac9 https://github.com/oracle/docker-images/tree/master/OracleDatabase 正攻法がだめだったので、誰かさんが作って下さったものを利用 https://hub.docker.com/r/sath89/oracle-12c/

イメージのダウンロードと実行

$ docker pull sath89/oracle-12c

$ docker run -d -p 8080:8080 -p 1521:1521 sath89/oracle-12c

実行結果、Oracle用のコンテナが起動する。

ログイン情報

User Id : sys, system
Password : oracle
Tnsname : XE

DumpからDBを復元

インスタンスの中のDPDUMPフォルダーにDumpファイルをコピー

$ docker cp  /Downloads/MYDB.DMP upbeat_brahmagupta:/u01/app/oracle/admin/xe/dpdump

コンテナに接続し、impを実行する。

$ docker exec -it 0999d96f24dd bash
# impdp system/oracle directory=DATA_PUMP_DIR dumpfile=MYDB.DMP log=expdp_MYDB.log

クライアントから接続する

$ sqlplus system/oracle@xe

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