DockerHubへのアップロード、コンテナ連携(アプリコンテナ→DBコンテナ)

めちゃくちゃ役に立つQiita記事を参考にしつつ、
Dockerでできることを理解していきます。

- [Dockerハンズオン基礎編：コンテナとイメージのライフサイクルを理解](https://qiita.com/zembutsu/items/ca0fa7b874c8375be8a4)
- [【初心者向け】Docker for Macで開発環境を作る（アプリサーバとDBサーバのコンテナ間連携まで）](https://qiita.com/teradonburi/items/8c23806e20ec8efc0ef4)



今回は、以下をやります。

- 自分で修正したDockerイメージをDocker Hubへアップロード
- アプリコンテナからDBコンテナのMySQLに接続
- アプリコンテナのNginxへポートフォワーディング(8080→80)によるアクセス

# 環境
Mac OS High Seirra
Docker 19.03.2, build 6a30dfc

# 前提条件
Docker for Macインストール済み

# Docker Hubにアップロード

Docker Hubは、イメージダウンロードだけでなく自作イメージのアップロードが可能。
アップロードするには、アカウント作成が必要。

以下を開いてアカウントを作成
https://hub.docker.com/ 

```bash
# Docker Hubへログイン(username,passを入力)
$ docker login 

# Dockerアカウントへの紐付け イメージにタグ付け
$ docker tag myimage ＜username＞/myimage

# タグ付けしたイメージを確認
$ docker images                                                                                              [21:26:16]
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myimage             latest              b4032944f7dd        20 minutes ago      278MB
username/myimage    latest              b4032944f7dd        20 minutes ago      278MB

# Docker Hubへイメージをアップロード
$ docker push ＜username＞/myimage

# 【お掃除】不要コンテナ、未タグ付けイメージ、最近不使用なネットワークを削除する
$ docker system df # イメージ、コンテナ数を表示
$ docker system prune
```

# アプリとDBのサーバー連携(Nginx、MySQL)

```bash
# DBコンテナ(コンテナ作成→DB作成)
$ docker run --name mysqld -e MYSQL_DATABASE=mydb -e MYSQL_USER=user -e MYSQL_PASSWORD=password -e MYSQL_ROOT_PASSWORD=rpassword -d mysql:5.7
# -it：継続起動にする -d：バックグラウンド実行 (イメージ名):(バージョン)
# -e：環境変数指定。dbやuserまで一気に作成可能

$ docker ps # 起動確認
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
1db60bcd59a8        mysql:5.7             "docker-entrypoint.s…"   11 hours ago        Up 11 hours         3306/tcp, 33060/tcp    mysqld

$ docker exec -it mysqld bash # mysqlコンテナにログイン                                                                   [21:05:51]
root@34f86130d717:/# mysql -u root -p # ROOTパスワード入力でmysqlにログイン

mysql> show databases; # db確認                                                                                                  +--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
・
・
+--------------------+
5 rows in set (0.00 sec)

mysql> exit

# アプリコンテナ(コンテナ作成→Nginx,DBクライアント導入)
$ docker run -it --name mycentos -d centos:7

# Nginxのインストール
$ rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum install -y nginx
$ nginx -v
nginx version: nginx/1.16.1

# MySQLのインストール
$ rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
$ yum install -y mysql
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.27, for Linux (x86_64) using  EditLine wrapper

# アプリコンテナのイメージ化、Docker Hubアップロード(コンテナ連携する前にイメージを保存しておく)
$ docker commit <イメージID> myuser/centos:1.0
$ docker login # 一度ログインすると アクセス情報が保存されuser,pass入力不要となる
$ docker push <イメージ名> # docker imagesで名称またはIMAGE IDを確認してパラメータに指定

# 上記pushイメージが1.22GBになってしまうのは仕方ないのか。mysqlクライアントのみを導入できれば、容量減るかも。

# DBコンテナと結合して、アプリコンテナを作成
$ docker run -it --name testapp --link mysqld:mysql -d -p 8080:80 devdoc23/centos:1.0
# --link:結合コンテナ指定 (リンク先コンテナ名):エイリアス名 -p ポートフォワーディング指定 (転送元ポート):(転送先ポート)

# アプリコンテナにログイン、MYSQL環境変数が作成されていることを確認
$ docker exec -it testapp bash                                                                               [21:38:58]
[root@b8f6e15ca001 /]# env | grep MYSQL
MYSQL_ENV_MYSQL_DATABASE=mydb
MYSQL_ENV_MYSQL_ROOT_PASSWORD=rpassword
MYSQL_PORT_33060_TCP=tcp://172.17.0.2:33060
MYSQL_PORT_33060_TCP_PORT=33
・
・

# アプリコンテナからDBコンテナのMySQLにログイン。アプリ内からDBコンテナのMySQLへアクセス可能かを確認
$ mysql -u root -p -h $MYSQL_PORT_3306_TCP_ADDR
Enter password: 
mysql> 

# Nginxの起動
$ Nginx

# ブラウザでhttp://localhost:8080にアクセスして、Nginxの80ポートへ転送確認
```

上記手順を実行する前に、CentOS6のアプリサーバーのmysqlクライアントをインストールして、
mysqlクライアントから、DBサーバーのMySQLにアクセスしようとしたら、それぞれのバージョンが5.1と8.0で異なり、接続できませんでした。

結局、それぞれで5.7を指定してインストールし直しました。

CentOS内でyumインストールする場合と、DockerでMySQLをインストールする場合では、インストールされるバージョンが異なる場合があるので注意が必要です。デフォルトパッケージでインストールされるバージョンを確認するとわかる。