DockerFile
DockerfileはDockerイメージを作成するためのファイルです。
イメージはコンテナの土台となり、Dockerfileからビルドすることでイメージが作成され、コンテナを起動することが可能になります。
FROM
Dockerのベースイメージを指定します。(Node.js等)
RUN
新しく作成されるイメージの中でコマンドを実行し、ソフトウェアのインストールやセットアップを行います。
Dockerはレイヤー(層)の積み重ねでイメージを構築し、レイヤーは少ない方が処理が軽くなります。例えば、RUN apt-get update -qq && yarn global add @vue/cliはレイヤーを減らすために&&を使用しています。
下記コマンドでは、updateで最新版に更新しVue CLIをインストールしています。
RUN apt-get update -qq && yarn global add @vue/cli
WORKDIR
コンテナ内の作業ディレクトリを設定します。
例えば/appと設定すると、後続の命令やコンテナの起動時のデフォルトディレクトリが/appになります。
CMD
コンテナが起動した際に実行されるコマンドを設定します。
具体的な動作はpackage.jsonに定義されたスクリプトに依存します。
CMD ["yarn", "serve-dev"]
"scripts": {
"serve-dev": "vue-cli-service serve --mode local",
}
package.jsonのscriptsは yarn または npm コマンドを使って実行することができます。
CMDコマンドは yarn serve-devすなわちyarn vue-cli-service serve --mode localがコンテナ実行時に実行されるということになります。
COPY
ローカルのファイルやディレクトリをイメージにコピーすることができます。
COPY [コピー元][コピー先]
ENV
Dockerfile内で環境変数を設定するために使用されます。
ENV [キー] = [値]
docker compose
Docker Composeはdocker-compose.ymlファイルを元に、複数のコンテナを一括で作成・起動するツールです。
- コマンドの手順
- docker compose build
- docker compose run --rm client bash
- docker compose up
docker compose build
Dockerイメージを再構築します。
ただし、Dockerfileを先に編集しなければ変更は反映されません。
docker compose run --rm client bash
指定したコンテナ内でbashシェルを起動します。
clientではyamlで定義されたサービス名が指定されることで、サービス名のコンテナを起動し、bashによりコンテナ内でbashシェルが起動します。
--rmはコンテナが終了したときに自動的に削除するためのものです。これにより、一時的な作業やデバッグセッションの後で不要なコンテナが残らないようにします。
ここで必要なモジュールをインポートします。
docker compose up
対象となるコンテナが起動状態になります。
この時、オプションやサービス名を何も指定しない場合は、docker-compose.ymlで定義したservicesが全て実行されることになります。
docker execでコンテナ内のbashシェルを起動する方法
docker execは既に実行中のDockerコンテナ内でコマンドを実行するためのもので、docker compose up -dでバックグラウンドでコンテナを起動させた状態で実行します
docker exec -it Dockerのコンテナ名 bash
-itは、-iでコンテナ内のシェルに入力を送ることができ、-tは簡単にいえば入力しやすくするコマンドです。
docker-compose.yml
version: "バージョン"
services:
サービス名(コンテナ):
build:
context: .
dockerfile: ./docker/node/Dockerfile
ports:
- "8080:8080"
expose:
- "8080"
volumes:
- ./app:/app
tty: true
stdin_open: true
サービス名(コンテナ):
....
....
buildでは、contextでdockerfileとともにbuildされるコンテキストを指定し、dockerfileでdockerfileのパスを指定します。.は現在のディレクトリを指します。
portsでは、ホストマシンの8080ポートを、コンテナの8080ポートにマッピングしています。
コンテナ内で動作しているアプリケーションが、コンテナ内部の8080ポートを待ち受け、外部からホストマシンの8080ポートへアクセスすると、その通信はコンテナの8080ポートに転送されます。
その結果、localhostと8080ポートを指定してアクセスすることで、実際にはコンテナ内部のアプリケーションにアクセスすることができます。
exposeでは、単にコンテナ内でのリッスンポートを示す情報を設定しています。
なので、外部からそのポートにアクセスするためには、portsを使用してホストとマッピングする必要があります。
volumesでは、ホスト上のファイルやディレクトリをコンテナのファイルシステムにマウントするための設定です。つまり、データを永続化したり、ホストとコンテナ間でデータを共有することができます。
今回でいえば、ホストマシンの ./app ディレクトリを、コンテナの /app ディレクトリにマウントします。
ttyをtrueにすると、コンテナが正常終了するのを防ぐことができます。
具体的には、ttyを設定することで、コンテナ側に仮想端末を置いて実行しているプロセスが用意されることでコンテナを持続させることができます。
docker exec -itコマンドの-tに当たる部分です
stdin_openをtrueにすることで標準入出力とエラー出力をコンテナに結びつけることができます。
docker exec -itコマンドの-iに当たる部分です
dockerコンテナは起動したらそのまま終了してしまいます。しかし、コンテナ内に入ってコマンドを打ち込ちたいケースで、dockerコンテナを起動させておく必要があります。
そんな時に-itを使いますが、それをdocker-compose.ymlのttyとstdin_openで設定しているのです。