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
これで停止できる。。


