Dockerって何?
Dockerとは、コンテナ型の仮想環境を構築するOSSのプラットフォーム。イメージ(環境のテンプレート)を元にコンテナ(独立したインスタンス)を作成することで同一のアプリケーションを配布したり、テストを行うことができる。これを軽量かつ高速に行うことができるため、CI/CDを行う上で適している。
導入
Docker Desktopを入れる。
動かしてみよう
初期状態ではローカルにはイメージは含まれていない。
同様にコンテナもない。(チュートリアルが出てるが一旦無視する)
公式イメージからコンテナを作る
ターミナルから、以下のコマンドでubuntuイメージを動かしてみる。
docker run -itd ubuntu
これでubuntuを実行する。
ローカルには存在しないので、公式からイメージがダウンロードされる。
これを元にコンテナが作られる。
同様のイメージ一覧、コンテナ一覧の内容がコマンドからも取得できる。
docker image ls
docker ps -a
ここで-a
は実行中以外も見れるようにするためのオプション。
補足
基本的にはdocker run オプション イメージ名
で実行する。オプションの-d
はバックグラウンドでの実行の指定、オプションの-it
は標準入力、標準出力の指定。これを指定しないと、何もプロセスを実行することがないコンテナは勝手に終了してしまう。
今回はubuntuを指定したが、そのほかにも公式で用意されているイメージはいろいろある↓。
ターミナルから動かしてみよう
作成したコンテナを動かしてみよう。
ここからターミナルを実行できる。
ls
とか叩いて
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
とか出ればOK。
以下のコマンドをローカルのターミナルから実行することでコンテナのターミナルを開くこともできる。
docker container exec -it <コンテナid> bash
(指定したコンテナでbashを実行、-it
で入出力をつなげている)
同じように、元のターミナルから以下のコマンドを叩いても実行できる。
docker exec <コンテナid> ls
これでも同じ出力が出る。
コンテナを終了しよう
コンテナは以下のコマンドで停止、削除することができる。
docker stop <コンテナid>
docker rm <コンテナid>
コンテナを作ってみよう
ここまでは公式で用意されているイメージを用いたが、今度はコンテナを作成してみる。Dockerfileというものを作成する。
プロジェクト用のディレクトリを作成し、そこにDockerfile
というファイルを作成する。
FROM ubuntu
RUN apt update
WORKDIR /app
COPY . .
-
FROM
で元となるイメージを指定する。今回はubuntu
を指定する。 -
RUN
でコマンドを実行する(apt update
を動かす)。 -
WORKDIR
でディレクトリを指定する。 -
COPY
で現在のローカルマシンからコンテナへファイルを移す。
test-image
という名前を指定してイメージをビルドする。
docker build -t test-image .
これでイメージが作られる。
このイメージを元にコンテナを作る。
docker run -itd test-image
作成したコンテナのターミナルを開いてみると、
-
apt update
が実行済で -
/app
がカレントディレクトリで - ディレクトリの中身がコピーされている(
Dockerfile
が入ってる)
ことがわかる。
getting-startedを動かしてみよう
getting-startedに従ってnode.jsのアプリを動かしてみる。
まずは以下のレポジトリからcloneする。
この中の/app
下のみを用いる。このディレクトリに以下のDockerfile
を作成する。
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
この中身を確認してみる。
-
FROM
で公式イメージのnode
を指定する。さらに12-alpine
というタグを付ける。- alpineは軽量化されたLinux環境。これを使うことを推奨されている。
apt
じゃなくてapk
を使う、といった違いがある。 - タグ一覧
- alpineは軽量化されたLinux環境。これを使うことを推奨されている。
-
RUN
でapk add
を動かし、必要なパッケージを入れる。 -
WORKDIR
でディレクトリを指定する。 -
COPY
で現在のローカルマシンからコンテナへファイルを移す。 -
RUN
でyarn install --production
を実行。 -
CMD
でnode src/index.js
を実行する。-
CMD
はコンテナ作成時に実行される、RUN
はビルド時に実行される
-
-
EXPOSE
で指定したポートをlistenする
getting-started
という名前でイメージを作る。
docker build -t getting-started .
コンテナを作成する。動かすコマンドがあるので-it
は不要。代わりに-p 3000:3000
オプションをつけてポート3000からつながるようにする。
docker run -dp 3000:3000 getting-started
これで実行されたので、http://localhost:3000/ にアクセスしてみる。
こういうアプリが動いていたら成功。
Docker-Composeを使う
Docker Composeを用いると、複数のコンテナからなるアプリケーションの起動・停止を簡単に行うことができるようになる。これを使ってみる。
入っているか確認。
docker-compose version
なければ以下↓よりインストール。
以下のファイルdocker-compose.ymlを作成する。ここまで作成した二つのイメージを動かしてみる。
version: '3.7'
services:
app1:
image: test-image
working_dir: /app
tty: true
app2:
image: getting-started
ports:
- 3000:3000
-
version
はschema
のバージョン。 -
services
下で動かすサービスを指定する。app1
とapp2
と適当に名前を付けた。 -
app1
では先ほど作ったtest-image
を指定する。-
working_dir
を指定できる。 -
tty: true
で標準出入力を指定。これで勝手に落ちない。
-
-
app2
では先ほどのgetting-started
を指定する。-
ports
を指定して接続できるようにする。
-
これらの設定を行い、以下のコマンドで動かす。
docker-compose up -d
これで指定した二つのコンテナが起動すればOK。
docker-compose down
これで停止できる。。