Docker は、必要な外部依存関係なしに、監獄環境でプログラムを動作させることができるコンテナー ランタイム環境です。コンテナーはいくつかの概念で仮想マシンに似ていますが、ハイパーバイザーを使用せず、単一のカーネル インスタンスで実行され、他のコンテナーとインスタンスを共有することがよくあります。コンテナー化の主要な機能の 1 つは、外部依存関係がないことです。コンテナーには、アプリケーションの実行に必要なランタイム ライブラリとコンポーネントがすべて含まれています。
Oracle は MySQL 5.5.40 から Docker コンテナー イメージを提供してきたため、Docker は、複数の MySQL バージョンおよびリリースにわたってテストを実行するための優れた選択肢となっています。多くの場合、バグの回帰テストを実行して、バグがどのリリースに影響を与えるかを判断したり、リリース間で動作がどのように変化したかを定量化したりすることが望ましい.
Docker では、テストが完了すると、自動クリーンアップ機能を使用して MySQL インスタンスをかなり軽量に起動できます。この投稿では、Docker を使用して MySQL を起動し、テストに使用する方法をいくつか紹介します。
Docker を使用する前に、テスト マシンにインストールする必要があります。 Linux システムに直接アクセスできない場合は、VirtualBox を入手し、Docker イメージを実行するための Linux 仮想マシンを作成することをお勧めします。OS の適切な選択肢としては、CentOS 7 または Fedora (最新) があります。 Fedora は、エンタープライズ Linux バリアントのアップストリームと見なすことができるため、テクノロジーに対する最新のサポートが保証されます。
インストール
1. YUM または DNF があり、オペレーティング システムのリポジトリにアクセスできるシステムでは、次のコマンドで docker をインストールできます。
# yum install docker docker-common
そのコマンドを実行すると、YUM によって docker と必要な依存関係をインストールするように求められます。
2. Docker を使用するには、次にサービスを開始する必要があります:
# service docker start
CentOS/RHEL 7 ディストリビューションでは、systemctl を使用します:
# systemct start docker
3. 再起動するたびに Docker を使用できるようにする場合は、次のコマンドで有効にします:
# chkconfig docker on
CentOS/RHEL 7 ディストリビューションでは、systemctl を使用します:
# systemct enable docker
Docker の仕組み
Docker 自体は単なるコンテナー マネージャーです。Docker を効果的に利用するには、Docker コンテナー イメージが公開され、ダウンロードできるサイトである docker.io にアクセスする必要があります。 docker.io の Docker コンテナには、MySQL バイナリのイメージと依存関係情報が含まれているため、Docker サービスは、Docker コンテナを実行するための適切なランタイム ファイルと仮想ファイルシステムをダウンロードできます。
Docker コンテナー インスタンスを作成すると、実行間で永続的なコンテナーの仮想ファイル システムが割り当てられます (–rm オプションを使用しない場合)。 スイッチ)。 Docker コンテナーは自由に開始および停止でき、再起動後も維持されます。テスト インスタンスで特に便利な Docker の機能の 1 つは、停止したコンテナーを消去できることです。 –rm オプションを指定して Docker コンテナーを起動すると、コンテナーがシャットダウンされるときにファイルシステムからも削除されるため、問題が解消されます。
コンテナの作成と起動
以下は、コンテナー内の最新の MySQL バージョンを起動し、シャットダウン後に削除するための最も簡単なコマンドです:
# docker run --rm --name=mysql8 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:latest
そのコマンドのデコードは次のとおりです:
- ドッカー – docker は、すべての docker 機能を実行するために使用される実行可能ファイルの名前です。
- 走る – これは docker に与えられるコマンドで、新しいコンテナーを作成して実行するよう docker に指示します。
- –rm – これは、停止後にコンテナー ファイルを削除するよう Docker に指示します。
- –name=mysql8 – これは、今後のすべてのコマンド参照のためにコンテナーに「mysql8」という名前を付けるように docker に指示します。この名前は任意ですが、複数のコンテナ インスタンスと衝突しないようにわかりやすい名前にする必要があります。
- -e MYSQL_ALLOW_EMPTY_PASSWORD – これにより、作成段階でコンテナにオプションが渡され、作成プロセス中に空の root パスワードを割り当てるようにコンテナに指示されます。
- -d mysql/mysql-server:latest – これにより、コンテナーの作成時に docker.io からダウンロードするリポジトリとバージョンが docker に通知されます。 「latest」という単語は、すべての MySQL リリースの最新バージョンをダウンロードするよう Docker に指示する魔法のバージョンです。正確なバージョン番号を指定することもできます。
上記のコマンドを変更すると、MySQL のバージョンを指定したり、一意の名前を付けたりすることができます。以下は、MySQL 8.0.13 が指定され、同様に一意の名前が使用されている例です:
# docker run --rm --name=mysql8013 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:8.0.13
この方法で MySQL 5.5 インスタンスを取得することもできます:
docker run --rm --name=mysql55 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:5.5注意 :上記の例では、便宜と利便性のために意図的にすべてのセキュリティを無視しています。これらの構成を本番環境で使用または複製しないでください。安全ではありません。
Docker インスタンスの使用
ここまでは、Docker インスタンスの起動についてのみ説明してきましたが、クライアント プログラムへのアクセスがなければ、あまり役に立ちません。標準の MySQL クライアント プログラムを使用して接続を確立するのは、ローカル ソケット接続を使用し、localhost 経由で接続するため、かなり簡単です。 MySQL Workbench など、ネットワーク IP を使用して接続する場合は、もう少し複雑です。
以下は、ローカル mysql CLI 接続の例です:
# docker exec -it mysql8 mysql -uroot
そのコマンドを分解してみましょう:
- 重役 – docker コンテナー インスタンス内でコマンドを実行するよう docker に指示します。
- -それ – 疑似 tty を使用して対話型セッションを作成するよう docker に指示します。
- mysql8 – 「mysql8」という名前のコンテナー インスタンスでコマンドが実行されることを docker に伝えます。
- mysql -uroot – これは、docker がコンテナー インスタンス内で実行する実際の raw シェル コマンド ラインです。
MySQL Docker コンテナーには、mysql、mysqlpump、mysqldump などの MySQL コマンドライン ユーティリティが含まれています。ダンプのロードなど、コマンド ライン ツールのいずれかにデータをパイプする場合は、- を削除する必要があります。次のように、コマンド ラインから t を入力します。
# docker exec -i mysql8 mysql -uroot < dumpfile.sql
Docker コンテナへの TCP/IP アクセス
上記のコマンド例を使用すると、Docker はルーティング不可能なプライベート IP アドレスをコンテナーに割り当て、システム上に仮想ネットワーク インターフェイスを作成します。仮想インターフェイスとコンテナーは、コンテナーで実行されているサービスへの TCP/IP 接続を確立するためのエンドポイントを形成します。
Linux マシンの仮想ネットワーク インターフェイスの IP アドレスを確認するには、次のコマンドを実行します:
shell> ip addr show docker0 8: docker0:mtu 1500 qdisc noqueue state UP group default link/ether 02:42:f7:98:c4:d1 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:f7ff:fe98:c4d1/64 scope link valid_lft forever preferred_lft forever
上記の例では、仮想 Docker インターフェイスに割り当てられた IP アドレスが 172.17.0.1 であることがわかります。これは、クライアント アプリケーションが接続するエンドポイントです。これは、MySQL でユーザーを作成するために使用する IP アドレスです。
コンテナ インスタンスに割り当てられた IP アドレスを確認するには、次のコマンドを実行します。例では、インスタンス名を「mysql」に置き換えます。
shell> docker inspect mysql8 | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2",
上記の出力では、コンテナー インスタンスの IP アドレスは 172.17.0.2 であるため、エンドポイントは 172.17.0.1 <-> 172.17.0.2 になります。次に、クライアント プログラムが接続するためのユーザーを作成する必要があります。そうしないと、172.17.0.1 は許可されたホストではないため、拒否されます。
shell> docker exec -it mysql8 mysql -uroot mysql> create user [email protected] identified by ''; Query OK, 0 rows affected (0.01 sec) mysql> grant all on *.* to [email protected] with grant option; Query OK, 0 rows affected (0.01 sec)
ネットワーク ユーザーを作成したら、コンテナ インスタンスに root としてパスワードなしで接続できます。 172.17.0.0/16 ネットワークはルーティング不可能なプライベート ネットワークであり、マシンの外部からはアクセスできないため、誰かが外部から Docker コンテナーにアクセスする危険はありません。
シャットダウンとクリーンアップ
テストが完了したら、Docker インスタンスをシャットダウンし、起動時に --rm を使用しなかった場合はファイルをクリーンアップする必要があります。
Docker インスタンスをシャットダウンするには:
# docker stop mysql8
インスタンスを削除するには:
# docker rm mysql8
結論
テストとサンドボックスの使用における Docker コンテナーの有用性を説明できたことを願っています。 Docker には、ワークフローを変更し、回帰テストを迅速、簡単、便利にする可能性があります。 Docker ハブには、リリース 5.5.40 以降のイメージが含まれています。