DockerでOracle、SQLServer、DB2、MySQL、PostgreSQLの試し方

# 動機
使ったことがないリレーショナルデータベースを使う必要がでてきたときの覚書、後で見返す用。

対象のリレーショナルデータベースは、Oracle、SQLServer、DB2、MySQL、PostgreSQLです。

各種リレーショナルデータベースをDockerで動かして、データベース毎のCUIツールを使うまでを記します。

# 前提
dockerのインストールやコマンドのオプションとかは公式ページやQiitaで紹介されているので、自身の覚書程度にしています。

# proxy環境下の場合の設定
proxy環境下で試すときはいくつか事前に設定しておくこと。

## Ubuntu

```bash:
sudo vi /etc/apt/apt.conf

Acquire::http::Proxy "http://proxy.server:port/";
Acquire::https::Proxy "http://proxy.server:port/";
```

## CentOS

```bash:
sudo vi /etc/yum.conf

proxy=http://proxy.server:port/
```

## 共通

```
vi ${HOME}/.bashrc

PROXY="proxy.server:port/"
export http_proxy=${PROXY}
export HTTP_PROXY=${PROXY}
export https_proxy=${PROXY}
export HTTPS_PROXY=${PROXY}
```

# docker インストール
## インストール手順
詳細は省略
[https://docs.docker.com/engine/install/ubuntu/](https://docs.docker.com/engine/install/ubuntu/)
[https://docs.docker.com/engine/install/centos/](https://docs.docker.com/engine/install/centos/)

# 一般ユーザでdockerコマンドを使えるようにする
```bash:
sudo usermod -aG docker your-user
```

# Oracle
## 参考URL

oracle databaseはdockerイメージが配布されていないので、ビルドするところから。


[https://github.com/oracle/docker-images/tree/master/OracleDatabase/SingleInstance](https://github.com/oracle/docker-images/tree/master/OracleDatabase/SingleInstance)

## ビルドスクリプトをgithubから取得

```bash:
cd ${HOME}/prj/DB/oracle/
git clone https://github.com/oracle/docker-images
```

## ビルド

マシンパワー、ネットワークによりますが、1時間くらいかかりました。

```bash:
cd ${HOME}/prj/DB/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles
./buildDockerImage.sh -v 18.4.0 -x
```

## コンテナを起動前の準備
ホスト側にoradataのディレクトリを作ります。このときパーミッションは777とします。これをしておかないと、コンテナ内部からホスト側へのファイル書き込みができないので。

```bash:
mkdir -p ${HOME}/prj/DB/oracle/oradata
chmod 777 ${HOME}/prj/DB/oracle/oradata
```
## コンテナを起動

```bash:
docker run --name my-oracle \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_PWD=myoracle \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v ${HOME}/prj/DB/oracle/oradata:/opt/oracle/oradata \
-d oracle/database:18.4.0-xe
```

## コンテナ起動状況を確認

```bash:
docker logs -f my-oracle
```

次のようなメッセージが出ています。「SYSTEM」ユーザのパスワードが出ています。

```bash:
ORACLE PASSWORD FOR SYS AND SYSTEM: myoracle
Specify a password to be used for database accounts. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9]. Note that the same password will be used for SYS, SYSTEM and PDBADMIN accounts:
Confirm the password:
```

次のメッセージが表示されたらOK。

```bash:
#########################
DATABASE IS READY TO USE!
#########################
```

## コンテナに入り、簡単な動作確認

```bash:
docker exec -it --user root my-oracle bash -p
```

```bash:コンテナ内部
bash-4.2# su oracle
[oracle@hostname /]$ sqlplus SYSTEM/myoracle

SQL*Plus: Release 18.0.0.0.0 - Production on Fri May 29 12:45:51 2020
Version 18.4.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Last Successful login time: Thu May 28 2020 12:54:45 +00:00

Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

SQL> select table_name from all_tables;

省略

SQL> exit

Disconnected from Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
[oracle@hostname /]$ exit
exit
exit
bash-4.2# exit
```

## コンテナの停止と次回以降の開始

```bash:
docker stop my_oracle
docker start my_oracle
```

# SQL Server
## 参考URL

[https://hub.docker.com/_/microsoft-mssql-server](https://hub.docker.com/_/microsoft-mssql-server)

## コンテナを起動

```bash:
docker run -it --name my-sqlserver \
-e 'ACCEPT_EULA=Y' \
-e 'SA_PASSWORD=yourStrong(!)Password' \
-e 'MSSQL_PID=Express' \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2017-latest
```

## コンテナ起動状況を確認

```bash:
docker logs -f my-sqlserver
```

次のメッセージが表示されたらOK。

```bash:
SQL Server is now ready for client connections. This is an informational message; no user action is required.
```

## コンテナに入り、簡単な動作確認

```bash:
docker exec -it --user root my-sqlserver bash -p
```

```bash:コンテナ内部
root@hostname:/# /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P 'yourStrong(!)Password'
1> SELECT table_catalog,table_schema,table_name,table_type FROM information_schema.tables;
2> go

省略

1> exit
root@hostname:/# exit
```

## コンテナの停止と次回以降の開始

```bash:
docker stop my-sqlserver
docker start my-sqlserver
```

# DB2
## 参考URL

[https://hub.docker.com/r/ibmcom/db2](https://hub.docker.com/r/ibmcom/db2)

## コンテナを起動前の準備
次のディレクトリを作っておきます。

```bash:
mkdir -p ${HOME}/prj/DB/db2
```

## コンテナを起動

```bash:
docker run -it --name my-db2 \
--privileged=true \
-p 50000:50000 \
-e LICENSE=accept \
-e DB2INST1_PASSWORD=db2 \
-e DBNAME=testdb \
-v $HOME/prj/DB/db2:/database \
-d ibmcom/db2:latest
```

## コンテナ起動状況を確認

```bash:
docker logs -f my-db2
```

次のメッセージが表示されたらOK。

```bash:
(*) Setup has completed.
```

## コンテナに入り、簡単な動作確認

```bash:
docker exec -it --user root my-db2 bash -c "su - db2inst1"
```

```db2``` コマンドに ```-t``` オプションをつけること。これをしておかないと、SQL文の改行ができないので。

```bash:コンテナ内部
[db2inst1@hostname ~]$ db2 -t
(c) Copyright IBM Corporation 1993,2007
Command Line Processor for DB2 Client 11.5.0.0

You can issue database manager commands and SQL statements from the command 
prompt. For example:
    db2 => connect to sample
    db2 => bind sample.bnd

For general help, type: ?.
For command help, type: ? command, where command can be
the first few keywords of a database manager command. For example:
 ? CATALOG DATABASE for help on the CATALOG DATABASE command
 ? CATALOG          for help on all of the CATALOG commands.

To exit db2 interactive mode, type QUIT at the command prompt. Outside 
interactive mode, all commands must be prefixed with 'db2'.
To list the current command option settings, type LIST COMMAND OPTIONS.

For more detailed help, refer to the Online Reference Manual.

db2 => connect to testdb;

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.0.0
 SQL authorization ID   = DB2INST1
 Local database alias   = TESTDB

db2 => select
db2 (cont.) => tabname
db2 (cont.) => from
db2 (cont.) => syscat.tables;

省略

db2 => quit;
DB20000I  The QUIT command completed successfully.
[db2inst1@hostname ~]$ exit
```

## コンテナの停止と次回以降の開始

```bash:
docker stop my-db2
docker start my-db2
```

# MySQL
## 参考URL

[https://hub.docker.com/_/mysql](https://hub.docker.com/_/mysql)

## コンテナを起動

```bash:
docker run -it --name my-mysql -e MYSQL_ROOT_PASSWORD=mysql -d mysql:latest
```

## コンテナ起動状況を確認

```bash:
docker logs -f my-mysql
```

次のメッセージが表示されたらOK。

```bash:
/usr/sbin/mysqld: ready for connections. Version: '8.0.20'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
```

## コンテナに入り、簡単な動作確認

```bash:
docker exec -it --user root my-mysql bash -p
```

```bash:コンテナ内部
root@hostname:/# mysql -u root -h localhost -p
Enter password: mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.20 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT table_catalog,table_schema,table_name,table_type FROM information_schema.tables;

省略

mysql> exit
Bye
root@hostname:/# exit
```

## コンテナの停止と次回以降の開始
```bash:
docker stop my-mysql
docker start my-mysql
```

# PostgreSQL
## 参考URL

[https://hub.docker.com/_/postgres](https://hub.docker.com/_/postgres)

## コンテナを起動

```bash:
docker run -it --name my-postgres -e POSTGRES_PASSWORD=postgres -d postgres:latest
```
## コンテナ起動状況を確認

```bash:
docker logs -f my-postgres
```

次のメッセージが表示されたらOK。

```bash:
database system is ready to accept connections
```

## コンテナに入り、簡単な動作確認

```bash:
docker exec -it --user root my-postgres bash -p
```

```bash:コンテナ内部
root@hostname:/# psql -h localhost -p 5432 -U postgres
psql (12.3 (Debian 12.3-1.pgdg100+1))
Type "help" for help.

postgres=# SELECT table_catalog,table_schema,table_name,table_type FROM information_schema.tables;

省略

postgres=# exit
root@hostname:/# exit
```

## コンテナの停止と次回以降の開始

```bash:
docker stop my-postgres
docker start my-postgres
```