Open28

dockerメモ

Hidden comment
Hidden comment
Hidden comment
Hidden comment
Hidden comment
aibizaibiz

サンプルリポジトリを取得

git clone https://github.com/docker/getting-started.git
aibizaibiz

環境構築についての注意
windows10+wsl2
windows docker desktopをインストール
ubuntu20.04
windowsのC:\Users\aibizフォルダにdockerフォルダを作成
vscodeでターミナルはpower shellを使うのが良い
vscodeでターミナルはgit bashを使うのが良い
pcを複数ユーザーで使用している場合、「docker-users」グループにユーザーの権限付与も忘れずに

https://pswork.jp/docker/user-authorization/

このへんの設定も必要?
https://docs.docker.com/desktop/windows/wsl/
この設定をした後、
VSCodeを起動する。
Ubuntu20.04でWSLに接続する。
/home/aibizsasaki/docker に移動する
(つまり~/docker/)
VSCodeのターミナルでbashを起動してサンプルプロジェクトをgit cloneして
チュートリアルの内容を実行する

http://127.0.0.1:3000/
にアクセス成功した。

aibizaibiz
# syntax=docker/dockerfile:1 
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

このDockerfileは、Node.jsベースのアプリケーションをDockerコンテナ内で実行するための手順を定義しています。

1行目の # syntax=docker/dockerfile:1 は、Dockerfileのバージョンを指定しています。

2行目の FROM node:18-alpine は、Dockerイメージのベースとなるイメージを指定しています。ここでは、Node.jsのバージョン18を実行するためのAlpine Linuxベースのイメージを使用しています。

3行目の WORKDIR /app は、Dockerコンテナ内で作業ディレクトリを/appに設定しています。以降のコマンドはこのディレクトリ内で実行されます。

4行目の COPY . . は、ホストマシンの現在のディレクトリのすべてのファイルとディレクトリを、Dockerコンテナ内の作業ディレクトリにコピーしています。

5行目の RUN yarn install --production は、Dockerコンテナ内でyarn install --productionコマンドを実行しています。これにより、アプリケーションの依存関係をインストールします。--productionフラグは、開発時にのみ必要なパッケージを省略して本番環境で必要なパッケージのみをインストールするためのものです。

6行目の CMD ["node", "src/index.js"] は、Dockerコンテナが起動されたときに実行されるデフォルトのコマンドを指定しています。この場合、Node.jsの実行環境でsrc/index.jsファイルを実行するように設定しています。

7行目の EXPOSE 3000 は、コンテナ内で公開するポート番号を指定しています。この場合、コンテナ内のアプリケーションがポート3000でリクエストを受け付けることを示しています。

このDockerfileは、Node.jsアプリケーションをDockerコンテナ内でビルドし、実行するための手順を提供しています。

aibizaibiz
docker image build -t getting-started .
docker container run -dp 3000:3000 getting-started

http://localhost:3000にアクセスする

aibizaibiz

docker hubにサインインして getting-started リポジトリを新規作成する

aibizaibiz

ローカルのImageの名前を変更する

docker image tag getting-started aibiz20sasaki/getting-started
aibizaibiz

ボリュームマウント:
volumeを作成して、DBのデータなどを永続化する

docker volume create todo-db
docker container run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

→エラー
docker: Error response from daemon: invalid mount config for type "volume": invalid mount path: 'C:/Program Files/Git/etc/todos' mount path must be absolute.
See 'docker run --help'.

→コマンドでなく、Deckerデスクトップで操作で、コンテナ実行できた。
https://docs.docker.com/get-started/05_persisting_data/#create-a-volume-and-start-the-container

→このコマンドならOK

docker container run -dp 3000:3000 --mount type=volume,src=todo-db,target=//etc/todos getting-started

ボリュームを使用するときに、Docker はデータをどこに保存しますか?

docker volume inspect todo-db
aibizaibiz

バインドマウント:
例えば、~/docker/getting-started/app で以下のコマンドを実行した場合
-itオプションは、対話型コンテナセッション

docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash

src="$(pwd)"・・・ホストマシンの現在の作業ディレクトリ(~/docker/getting-started/app)
target=/src・・・コンテナの「/src」ディレクトリに↑を紐付ける

対話型コンテナセッションを終了する場合は、ctrl+D

aibizaibiz

検証

root@90b62c3e273c:/# pwd
/
root@90b62c3e273c:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  src  srv  sys  tmp  usr  var
root@90b62c3e273c:/# cd src
root@90b62c3e273c:/src# ls
Dockerfile  package.json  spec  src  yarn.lock
root@90b62c3e273c:/src# touch hoge.txt
root@90b62c3e273c:/src# 

コンテナの/srcフォルダで hoge.txt を作成すると、
ホストマシンの現在の作業ディレクトリ(~/docker/getting-started/app)にも hoge.txt が作成される

aibizaibiz

 docker container run -dp 3000:3000 \
    -w /app --mount type=bind,src="$(pwd)",target=/app \
    node:18-alpine \
    sh -c "yarn install && yarn run dev"

上記はエラー、下記はOK

docker container run -dp 3000:3000     -w //app --mount type=bind,src="$(pwd)",target=//app     node:18-alpine     sh -c "yarn install && yarn run dev"

コマンドの内訳は以下の通りです:

  • -dp 3000:3000 デタッチド(バックグラウンド)モードで実行し、ポートマッピングを作成する。
  • -w /app - コマンドが実行される「作業ディレクトリ」またはカレントディレクトリを設定します。
  • --mount type=bind,src="$(pwd)",target=/app - ホストからコンテナ内の/appディレクトリにカレントディレクトリをバインドマウントする。
  • node:18-alpine - 使用するイメージです。これは、Dockerfileにあるアプリのベースイメージであることに注意してください。
  • sh -c "yarn install && yarn run dev" - コマンドです。shを使ってシェルを起動し(alpineにはbashがない)、yarn installを実行してパッケージをインストールし、yarn run devを実行して開発サーバを起動しています。package.jsonを見ると、devスクリプトでnodemonが起動することがわかります。
aibizaibiz

ネットワークを作成

docker network create todo-app

MySQL コンテナを起動し、ネットワークに接続します。
また、データベースがデータベースの初期化に使用するいくつかの環境変数も定義します

 docker container run -d \
     --network todo-app --network-alias mysql \
     -v todo-mysql-data:/var/lib/mysql \
     -e MYSQL_ROOT_PASSWORD=secret \
     -e MYSQL_DATABASE=todos \
     mysql:8.0

上記のコマンドでtodo-mysql-dataというボリュームがあり、MySQLがデータを保存する/var/lib/mysqlにマウントされていることがわかると思います。
しかし、docker volume createコマンドを実行したことはありません。
Dockerは、名前付きボリュームを使いたいことを認識し、自動的に作成してくれます。

データベースが稼働していることを確認するには、データベースに接続し、接続されていることを確認します。

docker container exec -it <mysql-container-id> mysql -u root -p

パスワードプロンプトが表示されたら、secret と入力します。
接続に成功したら、下記コマンでで、「todos」データベースが作成されていることを確認

mysql> show databases;

MySQL シェルを終了して、マシン上のシェルに戻ります。

mysql> exit

getting-started/app ディレクトリに移動して、以下のコマンドをPower Shellで実行

docker run -dp 3000:3000 `
   -w /app -v "$(pwd):/app" `
   --network todo-app `
   -e MYSQL_HOST=mysql `
   -e MYSQL_USER=root `
   -e MYSQL_PASSWORD=secret `
   -e MYSQL_DB=todos `
   node:18-alpine `
   sh -c "yarn install && yarn run dev"

git bashでこれだとエラーになった。

 docker container run -dp 3000:3000 \
   -w /app -v "$(pwd):/app" \
   --network todo-app \
   -e MYSQL_HOST=mysql \
   -e MYSQL_USER=root \
   -e MYSQL_PASSWORD=secret \
   -e MYSQL_DB=todos \
   node:18-alpine \
   sh -c "yarn install && yarn run dev"

ブラウザでアプリを開き、ToDo リストにいくつかの項目を追加します。
その後、
mysql データベースに接続し、項目がデータベースに書き込まれていることを検証します。
パスワードはsecret

docker exec -it <mysql-container-id> mysql -p todos

書き込まれている!

mysql> select * from todo_items;
+--------------------------------------+------+-----------+
| id                                   | name | completed |
+--------------------------------------+------+-----------+
| a53601a3-341e-400c-b861-749d7d7af096 | aaa  |         0 |
| 194777b7-9de9-4014-b17a-8d8582634961 | bbb  |         0 |
| b143b0bd-58d6-4d0a-a629-d48c66978f0d | ccc  |         0 |
+--------------------------------------+------+-----------+
3 rows in set (0.00 sec)
aibizaibiz

Docker Compose

services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 127.0.0.1:3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

起動する

docker compose up -d

終了する

docker compose down
aibizaibiz

起動中のコンテナの中に入って確認するには、

docker ps

で起動中のコンテナIDを調べて

docker container exec -it <コンテナID> bash

コンテナの中から出るには

exit
aibizaibiz

コンテナ内のファイルをホストPCへコピー

docker cp [コンテナID]:[コピーするファイルパス] [コピー先のファイルパス]
// docker cp ************:/usr/local/test.csv /Desktop

ホストPCのファイルをコンテナ内へコピー

$ docker cp [コピーするファイルパス] ************:[コピー先のファイルパス]
// docker cp /Desktop/test.csv ************:/usr/local