Help us understand the problem. What is going on with this article?

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

めちゃくちゃ役に立つ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をインストールする場合では、インストールされるバージョンが異なる場合があるので注意が必要です。デフォルトパッケージでインストールされるバージョンを確認するとわかる。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away