- lifeisegg
- Jan 12, 2019
- Tags
Docker? その3
Dockerコンテナを実行して見よう
コンテナを実行する
Dockerを実行するコマンドは次のとおりです。
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
ここでは、頻繁に使用するオプションです。
オプション | 説明 |
---|---|
-d | detached modeいわゆるバックグラウンドモード |
-p | ホストとコンテナのポートを接続(フォワーディング) |
-v | ホストとコンテナのディレクトリを接続(マウント) |
-e | コンテナ内で使用する環境変数の設定 |
-name | コンテナ名の設定 |
-rm | プロセスの終了時に、コンテナの自動削除 |
-it | -iと-tを同時に使用することで、ターミナルの入力のためのオプション |
-link | コンテナの接続[コンテナ名:エイリアス] |
信じられないほど直感的なオプションで何度実行してみると、自然に慣れています。
ubuntu 16.04 container
開始は軽くubuntu 16.04コンテナを作成して、コンテナの内部に入ってみてください。
~ docker run ubuntu:16.04
run
コマンドを使用すると、使用するイメージが保存されていることを確認していない場合はダウンロード(pull
)をした後、コンテナを作成(create
)して開始(start
)します。
上記の例ではubuntu:16.04
イメージをダウンロードしたことがないので、イメージをダウンロードした後、コンテナが実行されました。コンテナは正常に実行されたが、何よう命令を伝達していなかったので、コンテナは生成されるとすぐに終了します。コンテナは、プロセスであるため、実行中のプロセスが存在しない場合、コンテナは終了します。
今回は/bin/bash
コマンドを入力してubuntu:16.04
コンテナを実行してみましょう。
コンテナの内部に入るためにbashシェルを実行して、キーボード入力のために-it
オプションを与えます。さらに、プロセスが終了すると、コンテナが自動的に削除されるように--rm
オプションも追加しました。
今回は直前にイメージをダウン受けたため、イメージをダウンロードする画面なしにすぐに実行されました。cat /etc/issue
とls
を実行してみるとubuntu Linuxのだもの知ることができます。何か軽い仮想マシン同じか?
exit
でbashシェルを終了すると、コンテナも一緒に終了します。
Dockerを利用して、最も基本的なコンテナを瞬時に作成しました。
redis container
2回目のコンテナはredis
です。redisは、メモリベースのさまざまな機能を持ったストレージです。6379ポートで通信しtelnetコマンドでテストしてみることができます。redisコンテナはdetached mode(バックグラウンドモード)で実行するために-d
オプションを追加して、-p
オプションを追加して、コンテナのポートをホストのポートに接続してみましょう。
-d
オプションがない場合、プロセスがforegroundに実行され、任意のキーを入力することができなくなります。コンテナを終了するには、ctrl + c
を入力してください。
-d
オプションを与えたので、コンテナを実行するとすぐコンテナのID(5dff91d2 ...)を示してすぐにシェルに戻りました。コンテナは、終了したのではなく、バックグラウンドモードで動作しており、コンテナIDを利用して、コンテナを制御することができます。-p
オプションを使用して、ホストの1234ポート
コンテナの6379ポート
接続し、localhostの1234ポートに接続すればするredisを使用することができます。
テスト結果redisに接続して新しいキーを保存し、ロードに成功しました。実行が簡単なのはもちろんのこと、ホストのポートだけ異なって、1つのサーバーに複数のredisサーバを浮かべることも非常に簡単です。
MySQL 5.7 container
3番目実行コンテナはMySQLサーバーです。最も一般的に使用されるデータベースであるが、今回は、-e
オプションを利用して、環境変数を設定して、--name
オプションを利用して、コンテナに読みにくいIDの代わりに簡単な名前を付与する予定です。
--name
オプションを省略すると、もカーが自動的に名前を付けます。名前は、有名な科学者やハッカーの名前と修飾語を組み合わせてランダムに生成されます。
MySQL Docker hubページにアクセスすると簡単な使い方と環境変数の説明があります。様々な設定値があり、パスワードなしでrootアカウントを作成するためにMYSQL_ALLOW_EMPTY_PASSWORD
、環境変数を設定します。そして、コンテナの名前はmysql
で割り当てて、バックグラウンドモードでオフセットのために-dオプションを与えます。ポートは、3306ポート
ホストからup使用します。
うわー、瞬く間にMySQLサーバが実行されました。今回のテストでは、ホストOSにMySQLクライアントがインストールされている必要があります。後日実行中のMySQLDockerコンテナに接続してクライアントを実行してみましょう。
初めて接続の試行時にエラーが出るのは、MySQLサーバが最初に実行され、準備作業をするために発生するエラーです。コンテナを実行すると、バックグラウンドでMySQLサーバを浮かべる時間が必要なため、しばらく後に再試行したときに正常に接続されたことを確認することができます。
WordPress container
今回はブログエンジンで有名なWordPressを実行します。WordPressは、データベースが必要となるため、少し複雑な形状をツイジマン大きく難しくありません。直前に作成したMySQLコンテナにWordPressのデータベースを作成しWordPressコンテナを実行するときに--link
オプションを利用して、MySQLコンテナを接続します。
--link
オプションは、環境変数とIP情報を共有するために、リンクしたコンテナのIP情報を/etc/hosts
自動的に入力するためのWordPressのコンテナは、MySQLデータベースの情報を知ることができるようになります。
まず、WordPress用のデータベースを作成して、WordPressコンテナを実行します。ホストの8080ポート
コンテナの80ポート
に接続して、MySQLのコンテナと接続した後、各種データベースの設定情報を環境変数として入力します。
# run wordpress container ~ docker run -d -p 8080:80 \ --link mysql:mysql \ -e WORDPRESS_DB_HOST=mysql \ -e WORDPRESS_DB_NAME=wp \ -e WORDPRESS_DB_USER=wp \ -e WORDPRESS_DB_PASSWORD=wp \ wordpress
コンテナが正常に実行されたWebブラウザで確認してみます。
http;//localhost:8080
WordPressが実行されました!ただイメージをダウンロードして、適切な環境変数を入力して、コンテナを実行しただけです。WordPressコンテナの内部は、apache2とphpがインストールされているが、抽象化されており、実行過程で現れません。
今回の例では、テスト用にのみ使用します。運用環境で使用するには、追加の設定が必要です。この部分は、下で再び説明します。
--linkオプションは、deprecatedされてすぐに使用することができません。代わりにDocker network機能を利用しているが簡単に理解を助けるために使用しました。
さて、必要なサービスがある場合は、イメージを検索したり、直接作って、どこでも手軽にサービスを実行することができます。
tensorflow
最後にこのように活用することができるという例でtensorflowを実行しましょう。tensorflowは簡単マシンラーニングをすることができるツールです。tensorflowはpythonで作られてのpython関連パッケージをインストールする必要があります。今回インストールするイメージはpythonとnumpy、scipy、pandas、jupyter、scikit-learn、gensim、BeautifulSoup4、Tensorflowがインストールされています。何か複雑に見えるが、Dockerであれば、簡単に実行して見ることができます。
docker run -d -p 8888:8888 -p 6006:6006 teamlab/pydata-tensorflow:0.1
インストールしたファイルが多くのダウンロードに時間がかかります。コンテナが実行されると、Webブラウザでjupyterに接続してマシンラーニングを始めてみましょう!
すごい!正常にtensorflowテストを終えました。今は少しあればAIを作ることができるようになります。(?!)
まとめ
ここまでubuntu、MySQL、redis、Wordpressのは、tensorflowを実行してみました。仮想マシンを利用して同じ作業をした場合は、コンピュータが非常にスラッシング始めただろうコンテナベースのDockerを利用して、非常に軽く実行しています。内部構造やインストールプロセスでは、続きませんが、簡単なDockerコマンドで複数のサービスを瞬時に実行して使用することができるなんて、本当にすごいです。
Comments
Add your comment