この記事の概要
Dockerを用いた環境構築について記載する
Dockerのインストール
以下のサイトからDockerをインストールする
※自分はM1 Macだったので、Apple Chipのものをインストールしました。
Dockerの設定とインストール確認
インストールしたアプリを開いて、規約に同意する
規約に同意する
Dockerのインストール確認
// dockernのバージョン確認
$ docker version
// hello-worldしてみる
$ docker run hello-world
Hello from Docker!と返ってくる
Dockerの勉強1
コマンド実行
// docker runコマンド
$ docker run -d -p 80:80 docker/getting-started
Dockerの勉強2
アプリのダウンロード
zipまたはpull
Dockerfileの記述・実行
app/Dockerfile.
# syntax=docker/dockerfile:1
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
$ cd get***/app
// ビルド(コンテナイメージの作成)
$ docker build -t getting-started .
アプリコンテナの起動
// コンテナの起動
$ docker run -dp 3000:3000 getting-started
dockerの勉強3
ソースコードの変更
src/static/js/app.js
<p className="text-center">No items yet! Add one above!</p>
→<p className="text-center">You have no todo items yet! Add one above!</p>
古いコンテナを削除してからdockerのコンテナ作成
// コンテナのIDを調べる
$ docker ps
// コンテナを停止する
$ docker stop <コンテナID>
// コンテナ削除
$ docker rm <コンテナID>
// コンテナ作成
app $ docker build -t getting-started .
$ docker run -dp 3000:3000 getting-started
// コンテナの強制削除
$ docker rm -f <コンテナID>
dockerの勉強4
dockerイメージの共有
dockerの勉強5
コンテナのファイルシステム
コンテナはそれ自身が「スクラッチ領域」を持っている
// ubuntuコンテナを起動して、/data.txtという名前のファイルを作成し、1から10000までのランダムな数を入れる
$ docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
dockerDesktopにてubuntuコンテナをCLIで開く
ubuntu/terminal.
// /data.txtのファイル内容を確認
$ cat /data.txt
// /data.txtのファイル内容を確認(docker execを使うVer.)
$ docker exec <コンテナID> cat /data.txt
確認後、他のubuntuコンテナを起動する
// 他のコンテナの起動で、配下の/data.txtを見てみる
$ docker run -it ubuntu ls /
→/data.txtがない
ボリュームを使う
ボリュームを使うことで、
コンテナ内で指定したファイルシステムのパスを、ホストマシン上へと接続できる
このtodoアプリが自身のデータを保存するのは、コンテナ用ファイルシステム内で
/etc/todo/todo.dbにあるSQLite Database野中。
ボリュームを作成し、データを保管するディレクトリに取り付ける(マウントするという)と、
データを保持することができる
つまり、コンテナが書き出すtodo.dbファイルは、ホスト上のボリュームにおいておけば保持できる
名前付きボリュームは、単なる入れ物
// ボリューム作成
$ docker volume create todo-db
// コンテナ削除
$ docker rm -f <コンテナID>
// コンテナ起動時にボリュームをマウントする
$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
// コンテナ削除
$ docker rm -f <コンテナID>
// コンテナ起動時にボリュームをマウントする
$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
データは残っている
ボリュームを深堀り
// データをDockerが実際に保存するところを確認する(MountPoint)
$ docker volume inspect todo-db
dockerの勉強6
名前付きボリュームとバインドマウントの比較
名前付きボリューム | バインドマウント | |
---|---|---|
ホスト上の場所 | Docker が選択 | 自分で管理 |
マウント例( -v を使用) | my-volume:/usr/local/data | /path/to/data:/usr/local/data |
コンテナの内容に新しいボリュームを加える | はい | いいえ |
ボリューム ドライバのサポート | はい | いいえ |
dockerの勉強7
複数コンテナのアプリを連携する(コンテナのネットワーク機能)
// ネットワークの作成
$ docker network create todo-app
MySQLの起動・接続
// MySQLコンテナの起動(Apple Silliconの場合)
$ docker run -d \
--network todo-app --network-alias mysql \
--platform "linux/amd64" \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
// MySQLに接続
$ docker exec -it <mysqlのコンテナID> mysql -u root -p
$ passwordは、secret
// MySQLでデータベース一覧を表示
mysql> SHOW DATABASES;
MySQLとの連携
// nicolaka/netshootイメージを使う新しいコンテナ起動
$ docker run -it --network todo-app nicolaka/netshoot
// DNSツールのdigコマンドを使い、MySQLのIPアドレスを調べる
$ dig mysql
MySQLとアプリを動かす