# Docker入門④ ###### tags: `Docker` # Dockerを動かす ## すべての操作は'docker'から始まる ```shell= docker ~~~ ``` ## コマンドと対象 > https://hackmd.io/@miyasan/H1SXrIAlt **コマンドの基本形式** ```shell= docker 上位コマンド 副コマンド 対象 ``` - 上位コマンドは12種類しかない - 対象の部分には、具体的な名前を指定する **"penguin"というイメージをrun(実行)** ```shell= docker container run penguin ``` **"penguin"というイメージをpull(ダウンロード)** ```shell= docker image pull penguin ``` **"penguin"というイメージをstart(開始)** ```shell= docker container start penguin ``` ## オプションと引数 **オプションをつけたコマンド** ```shell= docker 上位コマンド 副コマンド オプション 対象 引数 ``` ```shell= docker container run -d penguin --mode=1 ``` - "-d"は、バックグラウンドで実行する - "--mode=1"は、モード1で起動する ## 省略可能なコマンド ### コマンド(上位コマンド/副コマンド) **正規形** ```shell= docker container run penguin ``` **省略形** ```shell= docker run penguin ``` ### オプション - "--"や"-"から始まることが多いが、"-"を付けないケースもある - "--"と"-"の違いは 、コマンド作成者の好みなので明確な違いはない ```shell= -d --all --name penguin ``` - "-d"のような1文字のオプションは、まとめて書くことができる - 例として、"-d", "-i", "-t"を同時に実行する ```shell= -dit ``` ### 対象 - 「何を」「どうする」に対して具体的な名前を指定する - "penguin"という名前のイメージをコンテナとして起動するなら以下のように記述する ```shell= docker start penguin ``` ### 引数 - 対象に対して、持たせたい値を記述 - ポートの番号を指定したりする - 記述方法は、オプションと同じく"--"や"-"で始まることが多い ```shell= --mode=1 --style nankyoku ``` ## ✅ コンテナを作って削除していくぅ!! | 項目 | 値 | | - | - | | コンテナ名 | apa000ex1 | | イメージ名 | httpd | 1. "apa000ex1"コンテナを作成して起動する - "--name apa000ex1"という名前のコンテナを作成 - "-d"でバックグラウンド実行 - "httpd"でApacheのイメージ名、バージョンを指定しないとlatestが使用 ```shell= docker run --name apa000ex1 -d httpd ``` 1. "apa000ex1"コンテナが動いてるか確認 ```shell= docker ps ``` 1. "apa000ex1"コンテナを停止 ```shell= docker stop apa000ex1 ``` 1. "apa000ex1"コンテナが停止したか確認 ```shell= docker ps ``` 1. "apa000ex1"コンテナが存在しているか確認 ```shell= docker ps -a ``` 1. "apa000ex1"コンテナを削除する ```shell= docker rm apa000ex1 ``` 1. "apa000ex1"コンテナが削除されたか確認 ```shell= docker ps -a ``` ## コンテナと通信 ### Apacheとは - ApacheとはWEBサーバー機能を提供するソフトウェア - つまり、Apacheが動いてるサーバーにhtmlファイルを置けば、WEBサイトとしてみることができる - Apacheを使用するためには、コンテナ外からアクセスできるようにしなければならない - アクセスするためにはコンテナ作成時に設定する必要がある - 基本的に作成後には設定できない ### コンテナと通信するには - Apacheは、サーバーの決められたポートでサイトの閲覧者がアクセスしてくるのを待っている - だけどコンテナの中にいるApacheはいくら待機してても直接外とは繋がっていないので閲覧者は見ることができない - そこで代わりのホストマシンで、閲覧者からの要求を代わりに受けてもらってそれを伝えてあげることをしないといけない ## ✅ 通信できるコンテナを作っていくぅ!! | 項目 | 値 | | - | - | | コンテナ名 | apa000ex2 | | イメージ名 | httpd | | ポートの設定 | 8080:80 | 1. "apa000ex2"コンテナをポートを指定して作成して起動する - "--name apa000ex2"という名前のコンテナを作成 - "-d"でバックグラウンド実行 - "-p 8080:80"でポート8080:80を設定 - "httpd"でApacheのイメージ名、バージョンを指定しないとlatestが使用 ```shell= docker run --name apa000ex2 -d -p 8080:80 httpd ``` 1. "apa000ex2"コンテナが動いてるか確認 ```shell= docker ps ``` 1. http://localhost:8080/ にアクセスする <div style="box-shadow: 0px 0px 20px #00000088"> ![](https://i.imgur.com/GRF0bpt.png) </div> 1. "apa000ex2"コンテナを停止 ```shell= docker stop apa000ex2 ``` 1. "apa000ex1"コンテナを削除する ```shell= docker rm apa000ex2 ``` 1. "apa000ex1"コンテナが削除されたか確認 ```shell= docker ps -a ``` ## コンテナ作成に慣れよう ### いろいろなコンテナ #### LinuxOSが入ったコンテナ - LinuxOSのみ入ったコンテも提供されている - 中に入って操作することが前提なので引数にて「シェルコマンド」を操作するための指定をする | イメージ名 | コンテナの内容 | よく使用されるオプションと引数 | | -------- | -------- | -------- | | ubuntu | Ubuntu | ""-d"を指定せず"-it"のみを指定、引数に"/bin/bash"などのシェルコマンドを指定する | | centOS | CentOS | ""-d"を指定せず"-it"のみを指定、引数に"/bin/bash"などのシェルコマンドを指定する | | debian | DebianOS | ""-d"を指定せず"-it"のみを指定、引数に"/bin/bash"などのシェルコマンドを指定する | | fedora | Fedora | ""-d"を指定せず"-it"のみを指定、引数に"/bin/bash"などのシェルコマンドを指定する | | busybox | BizyBox | ""-d"を指定せず"-it"のみを指定、引数に"/bin/bash"などのシェルコマンドを指定する | | alpine | Alpine linux | ""-d"を指定せず"-it"のみを指定、引数に"/bin/bash"などのシェルコマンドを指定する | #### WEBサーバーやデータベースサーバーが入ったコンテナ - WEBサーバーだと、Apacheの他にnginxが有名 - データベースサーバーだと、MySQLやMariaDBも有名 | イメージ名 | コンテナの内容 | よく使用されるオプションと引数 | | -------- | -------- | -------- | | httpd | Apache | "-d"を指定してバックグランド実行、"-p"でポート指定 | | nginx | Nginx | "-d"を指定してバックグランド実行、"-p"でポート指定 | | mysql | MtSQL | "-d"を指定、起動時に"-e MYSQL_ROOT_PASSWORD"でrootのパスワードを指定 | | postgres | PostgreSQL | "-d"を指定、起動時に"-e POSTGRES_ROOT_PASSWORD"でrootのパスワードを指定 | | mariadb | MariaDB | "-d"を指定、起動時に"-e MYSQL_ROOT_PASSWORD"でrootのパスワードを指定 | #### プログラムの実行環境やその他のソフトウェア - 言語毎の実行環境を入れることができる | イメージ名 | コンテナの内容 | よく使用されるオプションと引数 | | -------- | -------- | -------- | | openjdk | Javaの実行環境 | "-d"を指定せず、引数にjavaコマンドを指定 | | python | Pythonの実行環境 | "-d"を指定せず、引数にpythonコマンドを指定 | | php | PHPの実行環境 | WEBサーバー入りのものとコマンドのみのものなど、タグで分類わけされて提供されている | | ruby | Rubyの実行環境 | WEBサーバー入りのものとコマンドのみのものなど、タグで分類わけされて提供されている | | perl | Perlの実行環境 | "-d"を指定せず、引数にperlコマンドを指定 | | gcc | C/C++コンパイラ | "-d"を指定せず、引数にgccコマンドを指定 | | node | Node.js | "-d"を指定せず、引数にappコマンドを指定 | | regidtry | Dockerレジストリ | "-d"を指定してバックグランドで実行、"-p"でポート指定 | | wordpress | Wordpress | "-d"を指定してバックグランドで実行、"-p"でポート指定、MySQLまたはMariaDBも必要、接続のオプションは"-p"で指定 | | nextcloud | NextCloud | "-d"を指定してバックグランドで実行、"-p"でポート指定 | | redmine | Redmine |"-d"を指定してバックグランドで実行、"-p"でポート指定、PostgreSQLまたはMySQLも必要| ## ✅ Apacheのコンテナを複数作っていくぅ!! | 項目 | 値 | 値 | 値 | | - | - | - | - | | コンテナ名 | apa000ex3 | apa000ex4 | apa000ex5 | | イメージ名 | httpd | httpd | httpd | | ポートの設定 | 8081:80 | 8082:80 | 8083:80 | 1. それぞれのコンテナをポートを指定して作成して起動する ```shell= docker run --name apa000ex3 -d -p 8081:80 httpd docker run --name apa000ex4 -d -p 8082:80 httpd docker run --name apa000ex5 -d -p 8083:80 httpd ``` 1. それぞれのコンテナが動いてるか確認 ```shell= docker ps ``` 1. http://localhost:8081/ http://localhost:8082/ http://localhost:8083/ にアクセス 1. それぞれのコンテナを停止 ```shell= docker stop apa000ex3 docker stop apa000ex4 docker stop apa000ex5 ``` 1. それぞれのコンテナを削除 ```shell= docker rm apa000ex3 docker rm apa000ex4 docker rm apa000ex5 ``` 1. 削除されたか確認 ```shell= docker ps -a ``` ## ✅ Nginxのコンテナ作っていくぅ!! | 項目 | 値 | | - | - | | コンテナ名 | nginx000ex6 | | イメージ名 | nginx | | ポートの設定 | 8084:80 | 1. "nginx000ex6"のコンテナをポートを指定して作成して起動する ```shell= docker run --name nginx000ex6 -d -p 8084:80 nginx ``` 1. "nginx000ex6"コンテナが動いてるか確認 ```shell= docker ps ``` 1. http://localhost:8084/ にアクセス 1. "nginx000ex6"コンテナを停止 ```shell= docker stop nginx000ex6 ``` 1. "nginx000ex6"コンテナを削除 ```shell= docker rm nginx000ex6 ``` 1. 削除されたか確認 ```shell= docker ps -a ``` ## ✅ MySQLのコンテナ作っていくぅ!! :::warning 🐝 ここではコンテナを作成するだけで、ちゃんと動かすには引数の設定が必要になる ::: | 項目 | 値 | | - | - | | コンテナ名 | mysql000ex7 | | イメージ名 | mysql | | MySQLのルートパスワード | myrootpass | 1. "mysql000ex7"コンテナをポートを指定して作成して起動する - "-dit"でバックグラウンド実行&キーボードで操作 - "-e MYSQL_ROOT_PASSWORD=myrootpass"でMySQLログイン用のパスワードを設定 ```shell= docker run --name mysql000ex7 -dit -e MYSQL_ROOT_PASSWORD=myrootpass nginx ``` 1. "mysql000ex7"コンテナが動いてるか確認 ```shell= docker ps ``` 1. "mysql000ex7"コンテナを停止 ```shell= docker stop nginx000ex6 ``` 1. "mysql000ex7"コンテナを削除 ```shell= docker rm nginx000ex6 ``` 1. 削除されたか確認 ```shell= docker ps -a ``` ## イメージの削除 ### イメージを削除しよう - コンテナを削除しても、イメージは溜まり続けるのでイメージも削除する必要がある - イメージは増えてくるとストレージを圧迫するので、不要なイメージはどんどん削除しましょう - イメージはコンテナが存在してると削除できないので「docker ps -a」などで、コンテナ一覧を確認して、コンテナが存在してれば停止→削除して、イメージの削除を行う ### イメージ一覧を表示させる - "docker image ls"コマンドを実行するとイメージ一覧を確認できる - 確認できる項目は以下の通りになる | 項目 | Column 2 | | -------- | -------- | | REPOSITORY | イメージ名 | | TAG | バージョン情報/イメージをダンロードするときに指定しないと「latest(最新版)」をダンロードすることになる | | IMAGE ID | イメージID/本来のIDは64文字だが、先頭12文字のみ表記/12文字のみでも、IDとして機能する | | CREATED | 作られてから経過した時間 | | SIZE | イメージのファイルサイズ | ## ✅ imageを削除していくぅ!!                                                                                                                                                          1. コンテナの稼働状況や存在を確認する ```shell= docker ps -a ``` 1. イメージの存在を確認する ```shell= docker image ls ``` 1. 削除したいイメージを使用してるコンテナが存在しなくて、イメージが存在していたらイメージを削除していく ```shell= docker image rm httpd ``` 1. Apachenのイメージが削除されたか確認 ```shell= docker image ls ``` 1. 同時に複数のイメージを削除してみる ```shell= docker image rm mysql nginx ``` 1. MySQLとNginxのイメージが削除されたか確認 ```shell= docker image ls ```