コンテナ
dockerはコンテナというもの中で、pullしてきたイメージを動かしている。
コンテナってのは一個のPCみたいなもの。
他とは区切られている領域。
だから基本的には互いに影響し合わない。
しかし、カーネルの部分についてはホストOSを利用しているらしい。
だから完全にというわけじゃない。
コンテナをpullして起動
docker container run --name Apache -p 8080:80 -d httpd
とすると、
docker container run 「コンテナを動かしてね」
--name Apache 「Apacheという名前でお願いね」
-p 8080:80 「ホストの8080番portからアクセスできるようにしてね~。dockerのコンテナ上は80番で動いてるよ~」
compose
上記の例だと、Apacheのイメージのみを含むコンテナを起動した。
でも、Apacheが動いているサーバーだけを使うことはあまりないと思う。
大体の場合はApacheが動いているサーバーの中にプロジェクトフォルダを置いたりとか、
他と組み合わせて使うものだと思う。
そんな時はcompose.yaml
というファイルを作って、複数サービスを書き込む。
一気に複数のコンテナが起動できる。
これで、他の開発メンバーだったりと同じバージョンのイメージや、環境を作れるのがメリット。
あとは起動が楽になる。
コンテナの中へファイルコピー
docker compose cp ホストのファイルパス コンテナ名:コンテナのファイルパス
コンテナを使い終わったら
docker compose down とすればネットワークも削除してくれる
コンテナによっては環境変数が必要
例えば、MariaDBを起動するなら以下。
services: web: image: httpd ports: - "8081:80" ここからがMariaDBの設定↓ db: image: mariadb environment: MARIADB_ROOT_PASSWORD: password MARIADB_DATABASE: test MARIADB_USER: user MARIADB_PASSWORD: password volumes: - db-data:/var/lib/mysql ports: - "8082:8082" ここからはDBのデータを、コンテナを終了しても保存する用。 volumes: db-data:
こんな変数、どこで見つけてくるの?という話になるが、
それはDocker Hubのイメージの公式のドキュメントに書いてあるみたい。
例えば、MariaDBなら以下URLの
https://hub.docker.com/_/mariadb
Environment Variables
と書かれた項目に書いてある。
コンテナで動いているサービスのコマンドを実行
コンテナの外から一回だけ実行する
compose.yamlファイルからコンテナを起動している場合は以下。
docker compose exec コンテナ名 コマンド
MariaDBを起動する場合はこんな感じ。
docker compose exec db mariadb -u user -p
これだと連続で入力したいときに不便。
コンテナの中に入って、シェルを起動する
docker compose exec コンテナ名 /bin/bash
とするとシェルが起動する。
既に起動したサービスのパスが通った状態な模様。
なので、DBというサービス名で登録したコンテナを起動する場合はこんな感じ。
docker compose exec db bin/bash
なお、MariaDBのコマンドは以下を参考。
qiita.com
depends_on
depends_onというのは依存関係。
とあるサービスの中に、depends_on db
と書かれていたら、
このサービスはdbを使います。なので先にdbというサービスを起動してくださいね、ということ。
例えば、WordPressのコンテナはDBを使う。
起動時にDBに接続するから、先にDBが起動していないといけない。
なので、WordPressのサービスの色々な記述の中に上記のような形で書く。
コンテナを終了してもデータを永続的に保持したい
方法①ボリューム
dockerのコンテナ内に保存する。
公式ではこっちがおすすめ。
書き方は大項目としてvolumes
を設定。
services: web: image: httpd ports: - "8081:80" volumes: - web-data:/var/lib/apache db: image: mariadb environment: MARIADB_ROOT_PASSWORD: password MARIADB_DATABASE: test MARIADB_USER: user MARIADB_PASSWORD: password volumes: ←ここがservices内のvolumes - db-data:/var/lib/mysql ports: - "8082:80" volumes: ←ここが大項目のvolumes db-data: web-data:
vollumesがガンガン出てきてわけが分からないが、要は大項目に書けばdockerのコンテナに保存してくれる。
で、servicesの中に保存したいvolumes:そのコンテナ内のパス
と保存場所を指定しているだけ。
方法②バインドマウント
こちらはDockerホスト、つまり、おそらく大体の場合は今使ってるPCにデータを保存する。
こちらは大項目にvolumesを書かないで、servicesにだけ書けばOK。
保存先のPCのフォルダのパス:保存元のdockerコンテナのパス
わけが分からないが、要は後ろに書いたdockerのパスのファイルを、前に書いたPCのフォルダに保存するということだ。
コンテナをカスタムする
これまでのやり方だと、既にあるイメージからコンテナを作ることしかできない。
例えばpythonのイメージから作ったコンテナに、flaskみたいなフレームワークを一緒に入れ込んだうえで、
コンテナを作りたいなんてことがあるはず。
そんな時に「pythonからイメージを作って、その時コンテナの中でこんなコマンドを実行してね~」と命令出来たら便利。
そこで出てくるのがDockerfile