めちゃくちゃ役に立つQiita記事を参考にしつつ、
Dockerでできることを理解していきます。
今回は、以下をやります。
- 自分で修正した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/
# 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)
# 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をインストールする場合では、インストールされるバージョンが異なる場合があるので注意が必要です。デフォルトパッケージでインストールされるバージョンを確認するとわかる。