こんぶにのブログ

エンジニアという職業を通して学んだことを発信するブログです。

Dockerについて学んだこと

コンテナ

dockerはコンテナというもの中で、pullしてきたイメージを動かしている。
コンテナってのは一個のPCみたいなもの。
他とは区切られている領域。
だから基本的には互いに影響し合わない。
しかし、カーネルの部分についてはホストOSを利用しているらしい。
だから完全にというわけじゃない。

コンテナをpullして起動

docker container run --name Apache -p 8080:80 -d httpd
とすると、
docker container run 「コンテナを動かしてね」 --name ApacheApacheという名前でお願いね」
-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