tag:crieit.net,2005:https://crieit.net/tags/Docker%E8%87%AA%E5%B7%B1%E5%AD%A6%E7%BF%92/feed 「Docker自己学習」の記事 - Crieit Crieitでタグ「Docker自己学習」に投稿された最近の記事 2020-12-26T12:48:40+09:00 https://crieit.net/tags/Docker%E8%87%AA%E5%B7%B1%E5%AD%A6%E7%BF%92/feed tag:crieit.net,2005:PublicArticle/16431 2020-12-26T12:48:40+09:00 2020-12-26T12:48:40+09:00 https://crieit.net/posts/Docker-5-Wordpress-Wordpress Dockerの学習 #5 (Wordpressを使おう その2:Wordpressセットアップ) <p>Qrunchからお引越しした記事です : created_at: 2019-05-19 15:22:58 +0900</p> <p>前回MySQLをセットアップしたので、今回はWordpress本体の設定をしていく。<br /> Web公開するのであればApacheも必要だが、今回は割愛。</p> <p>成功するまでだいぶ試行錯誤したので、その流れを記載。</p> <h1 id="Wordpressセットアップ"><a href="#Wordpress%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97">Wordpressセットアップ</a></h1> <h2 id="1回目の失敗:ポートフォワーディング設定漏れ"><a href="#%EF%BC%91%E5%9B%9E%E7%9B%AE%E3%81%AE%E5%A4%B1%E6%95%97%EF%BC%9A%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A8%AD%E5%AE%9A%E6%BC%8F%E3%82%8C">1回目の失敗:ポートフォワーディング設定漏れ</a></h2> <p>コマンド実行してコンテナ作成。(最初はこれだけで終わると思っていた)<br /> <code>docker run --name wp_con01 wordpress</code></p> <p>作成自体は正常に終了。psコマンドで確認するとポートは80番。<br /> http://192.168.99.100(DockerのIP)へブラウザから接続。<br /> ⇒接続できない。</p> <p>色々調べてみると、ホスト側とコンテナ側でポートフォワーディングの設定を実施しないと接続できない様子。</p> <p>というわけで、stopでコンテナ停止、rmでコンテナ削除を実施した後に、再度コンテナ作成。<br /> <code>docker run --name -p 8080:80 wp_con01 wordpress</code></p> <p>これでホスト側の8080番ポートとコンテナ側の80番ポートのフォワーディング設定が実施された。<br /> psで参照するとこんな感じ。</p> <pre><code>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb276daaee38 wordpress "docker-entrypoint.s" 3 hours ago Up 3 hours 0.0.0.0:8080->80/tcp wp_con01 </code></pre> <p>この状態でhttp://192.168.99.100(Docker VMのIP):8080へブラウザから接続。<br /> ⇒無事接続完了!</p> <h2 id="2回目の失敗:コンテナ間のネットワーク設定"><a href="#2%E5%9B%9E%E7%9B%AE%E3%81%AE%E5%A4%B1%E6%95%97%EF%BC%9A%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%93%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A">2回目の失敗:コンテナ間のネットワーク設定</a></h2> <p>無事Wordpressの設定も完了したので、ブラウザから設定を進める。<br /> が、MySQLの設定内容を埋めて先に進もうとするとDB接続エラーが発生する。</p> <p>「そもそもコンテナとコンテナってNW接続って許可されているんだろうか?」<br /> と、思い色々調査すると、接続させるには設定が必要なことが判明。</p> <p>方法としては--linkでつなげるか、ネットワークを作成しそのネットワークにコンテナを所属させるか、の2通り。<br /> --linkは今後使われなくなる非推奨オプションらしいので、ネットワーク参加の方で設定を実施。</p> <p>まず、ネットワークを作成。<br /> <code>docker network create my_network</code><br /> 作成後、確認。</p> <pre><code>$ docker network ls NETWORK ID NAME DRIVER SCOPE 83102481c8be bridge bridge local 0568528ca361 host host local ef68ec9b2ee9 my_network bridge local d00080a53d5d none null local $ </code></pre> <p>基本、何も指定していないとデフォルトの「bridge」ネットワークに所属するらしいのだが、<br /> このネットワークはDNSの設定がなく、コンテナ名で名前解決ができないらしい。</p> <p>ネットワークを作成したので、そのネットワークに所属させる形でコンテナ再作成。<br /> 前回作成したMySQLのコンテナも作り直す。</p> <p>また、接続に必要な情報を全部環境変数指定してやる方向に変更した。<br /> <code>docker run --name mysql -p 3306:3306 --network my_network -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=wp_user -e MYSQL_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql</code></p> <p>--networkで所属ネットワークを作成したmy_networkに指定。</p> <p>(環境変数の補足)<br /> ・MYSQL_ROOT_PASSWORD:管理者パスワード<br /> ・MYSQL_USER:ユーザ名<br /> ・MYSQL_PASSWORD:ユーザのパスワード<br /> ・MYSQL_DATABASE:データベース名</p> <p>続けてWordpressのコンテナ。こちらも接続に必要な情報を環境変数で指定。<br /> <code>docker run --name wp_con01 --link mysql_con01:mysql -p 8080:80 -e WORDPRESS_DB_USER=wp_user -e WORDPRESS_DB_PASSWORD=password wordpress</code></p> <p>こちらも所属ネットワークをmy_networkに指定。</p> <p>(環境変数の補足)<br /> ・WORDPRESS_DB_USER:接続ユーザ<br /> ・WORDPRESS_DB_PASSWORD:接続ユーザのパスワード</p> <p>これでうまくいくはず、と思いきや、再度エラー。</p> <h2 id="3回目の失敗:MySQLのコンテナ名"><a href="#3%E5%9B%9E%E7%9B%AE%E3%81%AE%E5%A4%B1%E6%95%97%EF%BC%9AMySQL%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E5%90%8D">3回目の失敗:MySQLのコンテナ名</a></h2> <p>Wordpress側で次のエラーが発生。mysqlのサービスがない旨のメッセージ。<br /> <code>MySQL Connection Error: (2002) php_network_getaddresses: getaddrinfo failed: Name or service not known</code></p> <p>ネットで調査してみると「コンテナ名をmysqlにしないとエラーになる」旨の情報あり。</p> <p>※--linkで(--link test-mysql:mysql)と指定すれば問題なさそうだった。<br />  ただし、今回は--linkを利用しない方向にしたので、コンテナ名を泣く泣くmysqlに変更。<br />  また、docker-composeでの構築であればコンテナ名はmysqlでなくとも問題なさそう?<br />  ほかに何かよい方法があるのかもしれない。</p> <p>この状態で再度Wordpressのコンテナを作成したところ、再度エラー。(orz)</p> <h2 id="4回目の失敗:MySQLの認証設定"><a href="#4%E5%9B%9E%E7%9B%AE%E3%81%AE%E5%A4%B1%E6%95%97%EF%BC%9AMySQL%E3%81%AE%E8%AA%8D%E8%A8%BC%E8%A8%AD%E5%AE%9A">4回目の失敗:MySQLの認証設定</a></h2> <p>Wordpress側で次のエラーが発生。どうも認証周りで失敗している模様。<br /> <code>MySQL Connection Error: (2054) The server requested authentication method unknown to the client</code></p> <p>エラーメッセージで調べてみると、MySQL内ユーザの認証方式を弄ってやらないといけなそうなことが判明。<br /> EXECでMySQLのコンテナに接近し、ALTER文を発行。</p> <pre><code>$ docker exec -it mysql mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 Server version: 8.0.16 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> alter user wp_user identified WITH mysql_native_password by 'password'; Query OK, 0 rows affected (0.13 sec) </code></pre> <p>※ALTER文:<code>alter user [wordpress接続ユーザ] identified WITH mysql_native_password by '[wordpress接続ユーザのパスワード]';</code></p> <p>実行後、再度Wordpressコンテナ作成。<br /> ⇒今度はエラーなし!!!!!!</p> <p>http://192.168.99.100:8080から、ようやく初期設定画面に遷移できた。(つかれた・・・)</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>まとめると、次の流れが必要だった。<br /> - 1.ネットワークの作成<br /> <code>docker network create my_network</code><br /> ・コンテナを所属させるネットワークの作成。</p> <ul> <li><p>2.MySQLコンテナの作成<br /> <code>docker run --name mysql -p 3306:3306 --network my_network -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=wp_user -e MYSQL_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql</code><br /> ・名前は「mysql」で作成。<br /> ・作成したネットワークに所属させる。<br /> ・環境変数にてユーザやデータベース情報の設定もしてしまう。</p></li> <li><p>3.MySQLの設定変更<br /> <code>docker exec -it mysql mysql -u root -p</code><br /> <code>mysql> alter user wp_user identified WITH mysql_native_password by 'password';</code><br /> ・MySQLにて、Wordpress用のユーザの認証方式をNativeに変更してやる。</p></li> <li><p>4.Wordpressコンテナの作成<br /> <code>docker run --name wp --network my_network -p 8080:80 -e WORDPRESS_DB_USER=wp_user -e WORDPRESS_DB_PASSWORD=password wordpress</code><br /> ・ホストからアクセスするにはポートフォワーディングの設定が必要。<br /> ・作成したネットワークに所属させる。<br /> ・環境変数にて接続情報の設定もしてしまう。</p></li> </ul> <h1 id="所感"><a href="#%E6%89%80%E6%84%9F">所感</a></h1> <p>・すごい苦労したが、ネットワーク等含めてコンテナの考え方を学べてよかった。<br /> ・実際に手を動かすのがやっぱり大事。<br /> ・途中で心が折れそうだったけど、無事作成できてよかった。<br /> ・ネット上はだいたい「--link」でつなげてる情報ばっかりだった。<br /> ・Dockerに限らずそうだけど、問題が基盤(コンテナ)、ミドルウェア、アプリのどれにあるのかの切り分けが大事、かつ難しい。</p> ANA tag:crieit.net,2005:PublicArticle/16430 2020-12-26T12:46:08+09:00 2020-12-26T12:46:08+09:00 https://crieit.net/posts/Docker-4-Wordpress-Mysql Dockerの学習 #4 (Wordpressを使おう その1:Mysqlセットアップ) <p>Qrunchからお引越しした記事です : created_at: 2019-05-19 15:15:39 +0900</p> <p>今回から実際に手を動かして行こうと思う。<br /> とりあえず小さな目標として、ローカル環境でWordpressの利用ができるところまでをやってみる。</p> <h1 id="参考URL"><a href="#%E5%8F%82%E8%80%83URL">参考URL</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ymstshinichiro/items/01f6a4c299fdb4b832a2">https://qiita.com/ymstshinichiro/items/01f6a4c299fdb4b832a2</a><br /> MYSQLへのログイン。</p> <h1 id="MySqlのセットアップ"><a href="#MySql%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97">MySqlのセットアップ</a></h1> <p>Wordpress自体あまり詳しくないが、どうやらMySQLが必要みたいとの情報をどこかでみた。<br /> MySQLのセットアップをやっていく。</p> <p>まずイメージファイルの有無を確認。</p> <pre><code>$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 2f52e94d8acb 3 weeks ago 373MB mysql latest d72169616e20 3 weeks ago 443MB wordpress latest 837092bc87de 5 weeks ago 421MB php latest 750fb3e3d6ef 6 weeks ago 367MB httpd latest d4a07e6ce470 6 weeks ago 132MB hello-world latest fce289e99eb9 4 months ago 1.84kB php 7.0-apache aa67a9c9814f 4 months ago 368MB docker/whalesay latest 6b362a9f73eb 3 years ago 247MB </code></pre> <p>以前落としていたのがあるっぽい。<br /> なければそのまま次でRUNを実行すれば自動でイメージも取得してくるはず。</p> <p>ではrunを実行。コンテナに「--name」オプションで名前をつけて実行。</p> <pre><code>$ docker run --name mysql_con01 mysql error: database is uninitialized and password option is not specified You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD </code></pre> <p>「MYSQL_ROOT_PASSWORD」、「MYSQL_ALLOW_EMPTY_PASSWORD 」、「MYSQL_RANDOM_ROOT_PASSWORD」<br /> のどれかを指定しろとのこと。環境変数を「-e」で指定。</p> <pre><code>$ docker run --name mysql_con01 -e MYSQL_ROOT_PASSWORD=password mysql F:\Docker Toolbox\docker.exe: Error response from daemon: Conflict. The containe r name "/mysql_con01" is already in use by container "a72e4d4a02636be1f3c73722e8 9b0a1d2ab66a55abffb31b3c18a87de5586b4f". You have to remove (or rename) that con tainer to be able to reuse that name. See 'F:\Docker Toolbox\docker.exe run --help'. </code></pre> <p>・・・どうやらERRORが発生していてもコンテナ自体は作成されているようで、<br /> 同一名称が存在する旨のエラーが表示された。削除していく。</p> <pre><code>$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES </code></pre> <p>psコマンドで見てもコンテナは出てこないな・・・。<br /> あ、オプションは無しだと実行中のコンテナしか出ないからか。</p> <pre><code>$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a72e4d4a0263 mysql "docker-entrypoint.s" 3 minutes ago Exited (1) 3 minutes ago mysql_con01 8adaae58b85c docker/whalesay "cowsay Hello World!" 2 weeks ago Exited (0) 2 weeks ago heuristic_torvalds e2d544b0e813 docker/whalesay "Hello-World!" 2 weeks ago Created hardcore_pasteur 64cc887485f4 docker/whalesay "Hello World!" 2 weeks ago Created gifted_robinson 223951c34db3 hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago laughing_antonelli </code></pre> <p>やはりあるみたいね。消します。</p> <pre><code>$ docker rm mysql_con01 mysql_con01 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8adaae58b85c docker/whalesay "cowsay Hello World!" 2 weeks ago Exited (0) 2 weeks ago heuristic_torvalds e2d544b0e813 docker/whalesay "Hello-World!" 2 weeks ago Created hardcore_pasteur 64cc887485f4 docker/whalesay "Hello World!" 2 weeks ago Created gifted_robinson 223951c34db3 hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago laughing_antonelli </code></pre> <p>無事消えました。気を取り直して再実行。</p> <pre><code>$ docker run --name mysql_con01 -e MYSQL_ROOT_PASSWORD=password mysql Initializing database 2019-05-19T05:39:10.121840Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release. 2019-05-19T05:39:10.122801Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (my sqld 8.0.16) initializing of server in progress as process 27 2019-05-19T05:39:59.746085Z 5 [Warning] [MY-010453] [Server] root@localhost is c reated with an empty password ! Please consider switching off the --initialize-i nsecure option. 2019-05-19T05:40:25.020508Z 0 [System] [MY-013170] [Server] /usr/sbin/mysqld (my sqld 8.0.16) initializing of server has completed Database initialized MySQL init process in progress... MySQL init process in progress... MySQL init process in progress... 2019-05-19T05:40:29.693459Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release. 2019-05-19T05:40:29.693540Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (my sqld 8.0.16) starting as process 78 2019-05-19T05:40:32.312165Z 0 [Warning] [MY-010068] [Server] CA certificate ca.p em is self signed. 2019-05-19T05:40:32.389363Z 0 [Warning] [MY-011810] [Server] Insecure configurat ion for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 2019-05-19T05:40:32.432437Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: re ady for connections. Version: '8.0.16' socket: '/var/run/mysqld/mysqld.sock' p ort: 0 MySQL Community Server - GPL. 2019-05-19T05:40:32.713605Z 0 [System] [MY-011323] [Server] X Plugin ready for c onnections. Socket: '/var/run/mysqld/mysqlx.sock' Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Sk ipping it. Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it . Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skippin g it. 2019-05-19T05:40:49.327025Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Sh utdown complete (mysqld 8.0.16) MySQL Community Server - GPL. MySQL init process done. Ready for start up. 2019-05-19T05:40:49.617494Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release. 2019-05-19T05:40:49.617603Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (my sqld 8.0.16) starting as process 1 2019-05-19T05:40:52.265763Z 0 [Warning] [MY-010068] [Server] CA certificate ca.p em is self signed. 2019-05-19T05:40:53.604994Z 0 [Warning] [MY-011810] [Server] Insecure configurat ion for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 2019-05-19T05:40:53.648528Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: re ady for connections. Version: '8.0.16' socket: '/var/run/mysqld/mysqld.sock' p ort: 3306 MySQL Community Server - GPL. 2019-05-19T05:40:53.921685Z 0 [System] [MY-011323] [Server] X Plugin ready for c onnections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060 </code></pre> <p>ここで出力がStop。どうやら、この状態で待機し続けるらしい。<br /> <code>Ctrl + C</code>で一度抜ける。</p> <p>MySQLへの接続を別プロセスで試行する。というわけでEXECコマンドを使用。</p> <pre><code>$ docker exec -it mysql_con01 mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.16 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. </code></pre> <p>無事接続できた!せっかくなので適当にSQL発行をして動作確認。</p> <pre><code>mysql> select Host,User from mysql.user; +-----------+------------------+ | Host | User | +-----------+------------------+ | % | root | | localhost | mysql.infoschema | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | +-----------+------------------+ 5 rows in set (0.00 sec) mysql> exit Bye </code></pre> <p>問題なさそう。</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>長々と記載したが、以下コマンドでコンテナ作っただけである。<br /> <code>docker run --name [コンテナ名] -e MYSQL_ROOT_PASSWORD=[パスワード] mysql</code></p> ANA tag:crieit.net,2005:PublicArticle/16429 2020-12-26T12:44:43+09:00 2020-12-26T12:44:43+09:00 https://crieit.net/posts/Docker-3-PS-IMAGES-COMMIT-PUSH-RM-RMI-BUILD Dockerの学習 #3 (PS、IMAGES、COMMIT、PUSH、RM、RMI、(BUILD)) <p>Qrunchからお引越しした記事です : created_at: 2019-05-14 22:08:42 +0900</p> <p>ゴールデンウィークが終わり仕事が始まったため、ログを書く習慣が消えてしまった・・・<br /> あわせて学習も止まってしまいそうだった。危ない危ない。<br /> ちょっとずつでも前に進めていきたい。</p> <p>今回は基本コマンドで学習してないとこの残りをさらっていく。</p> <h1 id="参考URL"><a href="#%E5%8F%82%E8%80%83URL">参考URL</a></h1> <p>1.とても分かりやすいサイト<br /> <a target="_blank" rel="nofollow noopener" href="https://morizyun.github.io/docker/about-docker-command.html">https://morizyun.github.io/docker/about-docker-command.html</a><br /> 2.ドキュメント日本語化プロジェクト(主にコマンドリファレンスを参照)<br /> <a target="_blank" rel="nofollow noopener" href="http://docs.docker.jp/index.html">http://docs.docker.jp/index.html</a><br /> 3.イメージのレイヤ構造について<br /> <a target="_blank" rel="nofollow noopener" href="http://enakai00.hatenablog.com/entry/20140802/1406958412">http://enakai00.hatenablog.com/entry/20140802/1406958412</a></p> <h1 id="PS"><a href="#PS">PS</a></h1> <p>コンテナの状況確認。</p> <ul> <li>コマンド<br /> <code>docker ps [オプション]</code></li> <li>表示例</li> </ul> <pre><code>$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4c01db0b339c ubuntu:12.04 bash 17 seconds ago Up 16 seconds 3300-3310/tcp webapp d7886598dbe2 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db </code></pre> <ul> <li>例1:実行中のコンテナのみ表示<br /> <code>docker ps</code><br /> オプション無しで実行中のみ表示。</li> <li>例2:全コンテナ表示<br /> <code>docker ps -a</code></li> <li>例3:条件を満たすもののみ表示<br /> <code>docker ps --filter "name=nostalgic"</code><br /> "key=value"の形式で条件指定する。<br /> この例の場合、コンテナ名にnostalgicを含むものを表示する。<br /> keyに指定できるのは次の通り。コマンドリファレンスより引用。<br /> > id(コンテナの ID)<br /> > label( label= か label== )<br /> > name(コンテナの名前)<br /> > exited(整数値 - コンテナの終了コード。実用的なのは --all)<br /> > status(created|restarting|running|paused|exited|dead)<br /> > ancestor( [:] 、 、 ) - 特定のイメージから作られた子コンテナを作成します。<br /> > before(コンテナ ID か名前) - 指定した ID か名前よりも前に作成したコンテナでフィルタ<br /> > since(コンテナ ID か名前) - 指定した ID か名前よりも後に作成したコンテナでフィルタ<br /> > isolation (default|process|hyperv)(Windows デーモンのみ)<br /> > volume(ボリューム名かマウントポイント) - コンテナがマウントしているボリュームでフィルタ<br /> > network(ネットワーク ID か名前)- コンテナが接続しているネットワークでフィルタ</li> <li>例4:GOテンプレートを利用した整形<br /> <code>docker ps --format "table <span>{</span><span>{</span>.ID<span>}</span><span>}</span>\t<span>{</span><span>{</span>.Labels<span>}</span><span>}</span>"</code><br /> (GO言語のテンプレートのことらしいが、使い道がよく分からない・・・)</li> </ul> <h1 id="IMAGES"><a href="#IMAGES">IMAGES</a></h1> <p>イメージの一覧を表示。<br /> Dockerのイメージファイルは元のイメージから修正箇所を層(レイヤ)として重ねていくようなものらしい。<br /> オプション指定でそのレイヤ構造を把握することもできる模様。<br /> 基本的な使い方をする場合はあまり気にしなくてよいところか。<br /> (レイヤの確認は<code>docker history</code>でもできる?)</p> <ul> <li>コマンド<br /> <code>docker images [オプション] [リポジトリ[:タグ]]</code></li> <li>表示例</li> </ul> <pre><code>$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 77af4d6b9913 19 hours ago 1.089 GB committ latest b6fa739cedf5 19 hours ago 1.089 GB <none> <none> 78a85c484f71 19 hours ago 1.089 GB docker latest 30557a29d5ab 20 hours ago 1.089 GB <none> <none> 5ed6274db6ce 24 hours ago 1.089 GB postgres 9 746b819f315e 4 days ago 213.4 MB postgres 9.3 746b819f315e 4 days ago 213.4 MB postgres 9.3.5 746b819f315e 4 days ago 213.4 MB postgres latest 746b819f315e 4 days ago 213.4 MB </code></pre> <ul> <li>例1:イメージファイルを表示<br /> <code>docker images</code><br /> 何も指定しない場合。この場合、中間レイヤと呼ばれる細かいイメージの内容は表示されない。</li> <li>例2:中間レイヤを含めてイメージ表示<br /> <code>docker images -a</code></li> <li>例3:ダイジェスト値を表示<br /> <code>docker images -digest</code></li> <li>例4:javaリポジトリのイメージを表示<br /> <code>docker images java</code><br /> リポジトリ名称は完全一致。javとかでは×。</li> </ul> <h1 id="COMMIT"><a href="#COMMIT">COMMIT</a></h1> <p>停止させたコンテナをイメージファイルにする。<br /> 基本、イメージファイルの管理はDockerfileを利用するのが望ましいため、<br /> COMMITはデバッグやサーバ移動などの時に使うものらしい。<br /> - コマンド<br /> <code>docker commit [オプション] コンテナ [リポジトリ[:タグ]]</code><br /> - 例:コンテナ「c3f279d17e0a」をコミット<br /> <code>docker commit c3f279d17e0a svendowideit/testimage:version3</code></p> <h1 id="PUSH"><a href="#PUSH">PUSH</a></h1> <p>レジストリへイメージへ送信する。PULLの逆。<br /> - コマンド<br /> <code>docker push [オプション] 名前[:タグ]</code></p> <h1 id="RM"><a href="#RM">RM</a></h1> <p>コンテナの削除。<br /> - コマンド<br /> <code>docker rm [オプション] コンテナ [コンテナ...]</code><br /> - 例1:コンテナ「redis」の削除<br /> <code>docker rm redis</code><br /> - 例2:コンテナを強制停止させ削除<br /> <code>docker rm --force redis</code><br /> SIGKILLシグナルを送信し、強制停止させる。</p> <h1 id="RMI"><a href="#RMI">RMI</a></h1> <p>イメージの削除。<br /> ショート ID かロング ID、タグ、digest を指定。<br /> - コマンド<br /> <code>docker rmi [オプション] イメージ [イメージ...]</code><br /> - 例1:test1の削除<br /> <code>docker rmi test1</code><br /> - 例2:イメージIDが「fd484f19954f」のものを強制削除<br /> <code>docker rmi -f fd484f19954f</code><br /> 削除時にコンフリクトを起こす場合は<code>-f</code>か<code>--force</code>指定で強制削除できる。</p> <h1 id="BUILD"><a href="#BUILD">BUILD</a></h1> <p>指定したソースコードからのコンテナ作成。<br /> Dockerfileからの作成などで使う。<br /> DockerfileおよびBUILDについてはその存在のみ確認して、今回は割愛。<br /> (調査していると深みにはまりそうなので)</p> <ul> <li>コマンド<br /> <code>docker build [オプション] パス | URL | -</code></li> </ul> <h1 id="所感"><a href="#%E6%89%80%E6%84%9F">所感</a></h1> <p>・これで一通り基本的なものはおさえた(はず)。<br /> ・DockerFileとBUILDに関しては後でしっかり時間を割いて理解する必要あり。<br />  ただ、DockerFileからは深い沼の香りがする・・・<br /> ・次回こそ色々触ってみるぞ!!!</p> ANA tag:crieit.net,2005:PublicArticle/16428 2020-12-26T12:43:06+09:00 2020-12-26T12:43:06+09:00 https://crieit.net/posts/Docker-2-RUN-EXEC-ATTACH-STOP-KILL-START Dockerの学習 #2 (コンテナの起動・操作コマンド RUN、EXEC、ATTACH、STOP・KILL・START) <p>Qrunchからお引越しした記事です : created_at: 2019-05-04 19:00:26 +0900</p> <p>前回イメージファイルの取得まで勉強したので、今回は起動・操作・停止系の基本コマンドを勉強していく。</p> <h1 id="参考URL"><a href="#%E5%8F%82%E8%80%83URL">参考URL</a></h1> <p>1.とても分かりやすいサイト<br /> <a target="_blank" rel="nofollow noopener" href="https://morizyun.github.io/docker/about-docker-command.html">https://morizyun.github.io/docker/about-docker-command.html</a><br /> 2.ドキュメント日本語化プロジェクト(主にコマンドリファレンスを参照)<br /> <a target="_blank" rel="nofollow noopener" href="http://docs.docker.jp/index.html">http://docs.docker.jp/index.html</a><br /> 3.シグナルについて<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/hoto17296/items/07206f25d8cdfad4d358">https://qiita.com/hoto17296/items/07206f25d8cdfad4d358</a></p> <h1 id="RUN"><a href="#RUN">RUN</a></h1> <p>イメージファイルを元にコンテナを起動する。<br /> このコマンドでコンテナのディスク作成・メインプロセス(アプリケーションのプロセス)開始が実行される。<br /> (RUNというコマンドなのに起動だけでなくMAKEまでするのか・・・)</p> <ul> <li><p>コマンド<br /> <code>docker run [オプション] イメージ[:タグ|@ダイジェスト値] [コマンド] [引数...]</code></p></li> <li><p>例1:イメージファイル「mysql」を元にコンテナ起動<br /> <code>docker run mysql</code><br /> イメージファイルが無いときはイメージのダウンロードも自動実行される。</p></li> <li><p>例2:イメージファイル・タグ指定でコンテナ起動<br /> <code>docker run ubuntu:14.04</code><br /> タグの指定、ダイジェスト値の指定も可能な様子。</p></li> <li><p>例3:コンテナに名前を付ける<br /> <code>docker run --name sql01 mysql</code><br /> 「--name」で任意の名前を付与。<br /> 付けない場合は自動で命名される。</p></li> <li><p>例4:ポートのひも付け(ホスト⇔コンテナ)<br /> <code>docker run -p 8080:80 nginx</code><br /> 「-p ホストのポート:コンテナのポート」で指定。<br /> 上の例の場合、ホストの8080ポートへの通信はコンテナの80ポートへつながっている。<br /> (NAPTみたいな動きをしてくれるってことかな?)</p></li> <li><p>例5:起動したコンテナでBashを使う(既定のアプリでなくBashを起動する)<br /> <code>docker run -it --entrypoint /bin/bash mysql</code><br /> Bashを使いたい今回のケースでは「--entrypoint」を指定する必要がある。<br /> イメージファイルには「ENTRYPOINT」という「起動後に一番最初に実行するコマンド」が<br /> 定義されており、通常はそれが実行される。<br /> ⇒メインプロセスの実行コマンド、という解釈でよいはず。<br /> このケースでは、まずBashを使いたいので、ENTRYPOINTをBashの実行(/bin/bash)で上書きしてやる。<br /> ⇒メインプロセスをBashにしてやる。<br /> 「-i」が「ホストの入力をコンテナの標準出力へつなげる」、<br /> 「-t」が「コンテナの標準出力とホストの出力をつなげる」。<br /> 大抵の場合IO両方を指定すると思うので「-it」とセットで使う模様。<br /> 「アプリケーションのプロセスは起動するけど、それとは別にBashを使いたい」というケースは<br /> 後述のEXECコマンドを使う。</p></li> <li><p>例6:終了時にコンテナ削除<br /> <code>docker run -rm mysql</code><br /> 「-rm」でコンテナの終了時にコンテナを自動で削除してくれる。</p></li> <li><p>補足<br /> リファレンスによると、イメージファイルに定義された次の情報をRUN実行時に上書きできるとのこと。</p> <blockquote> <p>・デタッチドあるいはフォアグラウンドで実行<br /> ・コンテナの識別<br /> ・ネットワーク設定<br /> ・実行時の CPU とメモリの制限<br /> ・権限と LXC 設定</p> </blockquote></li> </ul> <p> コンテナのリソース設定やネットワーク周りの詳細設定もできる模様。<br />  このあたりまで深く理解しようとすると頭がパンクしそうなので、後回し。<br />  ⇒ただ、実運用するとなったら避けては通れなそう。</p> <h1 id="EXEC"><a href="#EXEC">EXEC</a></h1> <p>コンテナに追加のプロセス(メインプロセスとは別のプロセス)を実行させる。<br /> ターミナルアクセスなどに使う。</p> <ul> <li><p>コマンド<br /> <code>docker exec [オプション] コンテナ名 コマンド [引数...]</code></p></li> <li><p>例1:メインプロセスとは別にBashプロセスを起動<br /> <code>docker exec -it web01 /bin/bash</code><br /> 「web01」というコンテナのBashを起動。<br /> RUNの時と同様に「-it」をオプションにつける。<br /> 「-i」は「標準入力(STDIN)を開いたままにする」<br /> 「-t」は「擬似デバイス(ディスプレイ)へ接続」みたいな感じ。</p></li> </ul> <h1 id="ATTACH"><a href="#ATTACH">ATTACH</a></h1> <p>実行中のコンテナのメインプロセスの標準入力、標準出力へ接続する。<br /> ちなみに、接続後「exit」でメインプロセスを終了するとコンテナが停止する模様。</p> <p>なお、コマンドの定義としては<br /> 「メインプロセス 」=「PIDが1のプロセス」として扱っているらしい。</p> <ul> <li><p>コマンド<br /> <code>docker attach [オプション] コンテナ名</code></p></li> <li><p>例1:コンテナ「web01」のプロセスへ接近<br /> <code>docker attach web01</code></p></li> </ul> <h1 id="STOP・KILL・START"><a href="#STOP%E3%83%BBKILL%E3%83%BBSTART">STOP・KILL・START</a></h1> <p>コンテナの停止と開始ができる。<br /> 「コンテナの停止」⇒「コンテナのメインプロセスの停止」<br /> 「コンテナの開始」⇒「コンテナのメインプロセスの開始」<br /> という感じか。</p> <ul> <li><p>コマンド<br /> <code>docker stop [オプション] コンテナ名</code><br /> <code>docker kill [オプション] コンテナ名</code><br /> <code>docker start [オプション] コンテナ名</code></p></li> <li><p>STOPとKILLの違い<br /> STOPは終了信号(SIGTERM)を送信し、一定時間経過後に強制終了信号(SIGKILL)を送信する。<br /> KILLは強制終了信号(SIGKILL)を送信する。<br /> 強制停止の要否によって使い分けか。(シャットダウンとパワーオフ(電源オフ)の関係な様なものか)</p></li> <li><p>例1:コンテナ「web01」を通常停止<br /> <code>docker stop web01</code><br /> オプションなしでstopコマンドを利用した場合、<br /> 終了信号を送って10秒(デフォルト値)経過した後に、強制終了信号を送信する。</p></li> <li><p>例2:コンテナ「web01」を通常停止、ただし強制停止までに1分まつ<br /> <code>docker stop -t 60 web01</code><br /> 「-t」または「--time」で強制終了信号送信までの時間を秒単位で指定することも可能。</p></li> <li><p>例3:コンテナ「web01」を強制停止<br /> <code>docker kill web01</code><br /> メインプロセスの強制終了時はKILL。</p></li> <li><p>例4:コンテナ「web01」を開始<br /> <code>docker start web01</code><br /> メインプロセスの開始。</p></li> </ul> <h1 id="所感"><a href="#%E6%89%80%E6%84%9F">所感</a></h1> <p>・RUNは奥が深そうだ・・・<br />  イメージファイルに定義されていることと違うことがしたい!って<br />  時は色々指定してやらないといけない、って感じか。<br /> ・今回の勉強内容でDockerの概念がだいぶ分かってきた。<br />  参考URL1に記載されているイメージ、コンテナ、プロセスの関係性の図が大分理解できた(気がする)。<br /> ・色んなサイトを見たときのコマンド例で、RUN時にポート番号指定している意味が全然分からなかった。<br />  けど、やっとわかった。<br /> ・次は残りの基本コマンドをサラッとさらって、その次は色々実践してみよう。</p> ANA tag:crieit.net,2005:PublicArticle/16427 2020-12-26T12:39:59+09:00 2020-12-26T12:39:59+09:00 https://crieit.net/posts/Docker-1-PULL Dockerの学習 #1 (イメージファイルとPULLコマンド) <p>Qrunchからお引越しした記事です : created_at: 2019-05-01 17:22:36 +0900</p> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>Dockerコマンドの考え方がぼんやりしているので、簡単にまとめておく。<br /> 今回は「そもそもイメージファイルとは」という点とイメージファイルの取得(PULL)についてまとめる。</p> <h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://morizyun.github.io/docker/about-docker-command.html">https://morizyun.github.io/docker/about-docker-command.html</a><br /> ↑分かりやすい図がついている分かりやすいサイト。<br /> <a target="_blank" rel="nofollow noopener" href="https://hkdnet.hatenablog.com/entry/2017/06/18/190000#fn:1">https://hkdnet.hatenablog.com/entry/2017/06/18/190000#fn:1</a><br /> ↑イメージとタグの関係性について。<br /> <a target="_blank" rel="nofollow noopener" href="http://docs.docker.jp/index.html">http://docs.docker.jp/index.html</a><br /> ↑ドキュメント日本語化プロジェクト(主にコマンドリファレンスを参照)</p> <h1 id="イメージファイルについて"><a href="#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">イメージファイルについて</a></h1> <p>・イメージファイル⇒コンテナを作るもと(みたいな解釈であってるはず・・・)<br /> ・イメージファイルはDocker Hub上で名前とタグで管理する。<br /> ・イメージファイル名は次のように管理されることが多い。(参考URLから引用)</p> <blockquote> <p>例: nginx → Docker Hub にある nginx という公式イメージ<br /> 例: hkdnet/app → Docker Hub にある hkdnet さんの app というイメージ<br /> 例: hkdnet.net/nginx → hkdnet.net という Docker registry の nginx# PULL</p> </blockquote> <p>・タグはイメージファイル1つにつき複数保持できる。<br />  ただし、イメージ内で一意である必要があり。大体バージョンや作成タイムスタンプなどを保持する様子。<br /> ・公開されているイメージファイルの中身は変動することがある。<br />  ⇒バージョン値しか書いていないものなどはイメージ内容が変動することがあるらしい。<br />  そのため、当時のイメージ内容がほしい場合はタイムスタンプ指定、細かいリビジョン指定、<br />  または後述のダイジェスト値指定での取得をする必要がある。</p> <h1 id="PULL"><a href="#PULL">PULL</a></h1> <p>レポジトリからイメージを持ってくる。<br /> イメージファイルのダウンロードみたいな感じ。</p> <ul> <li><p>コマンド<br /> <code>docker pull [オプション] 名前[:タグ] | [レジストリ・ホスト[:レジストリ・ポート]/]名前[:タグ]</code></p></li> <li><p>例1:mysqlのイメージを取得<br /> <code>docker pull mysql</code><br /> タグ指定がなしで最新版の公式イメージを取得。</p></li> <li><p>例2:タグによるバージョン指定<br /> <code>docker pull ubuntu:14.04</code><br /> 前述の通り、バージョン14.04の最新リビジョンを取得する様子。<br /> リビジョン単位で取得内容を固定したいのであれば、別のタグを使うほうが良さそう。</p></li> <li><p>例3:関連するタグすべて取得<br /> <code>docker -a pull mysql</code><br /> -a の代わりに --all-tagsでも良いとのこと。</p></li> <li><p>例4:ダイジェスト値指定<br /> そもそもダイジェスト値とは?<br /> ⇒Dockerイメージをリポジトリに登録(PUSH)したときに表示されるキーの様なもの。<br /> PULLした時にも表示されるので、「以前PULLした時とまったく同じイメージがほしい!」というときは、<br /> ダイジェスト値を控えておくとよいのでは。<br /> <code>docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2</code><br /> ⇒「sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2」がDigest値</p></li> <li><p>レポジトリ<br /> 何も指定しないとDocker Hubから取得する。<br /> ⇒なのでインターネットに接続できるように考慮が必要。プロキシ設定とか。<br /> 自分で管理しているレポジトリから取得する場合は、ホスト名やポート番号などを指定。<br /> <code>docker pull myregistry.local:5000/testing/test-image</code><br /> ⇒myregistry.localから5000番ポート経由でtest-imageファイルを取得<br /> レポジトリの指定についてはプロトコルの指示(https://)は不要。<br /> なお、認証が必要な場合はDocker Loginコマンドにて指定が必要な様子。</p></li> </ul> <h1 id="所感"><a href="#%E6%89%80%E6%84%9F">所感</a></h1> <p>・PULLの勉強だけで数時間つかってしまった・・・<br /> ・イメージファイルの概念が漠然としていたので、良い勉強にはなった。<br /> ・ローカルレポジトリも指定できるのは勉強になった。<br />  実際に企業で運用するときはどうしているのかが気になる。GitLab管理とかなのだろうか。</p> ANA