dockerメモ
このチュートリアルで、概要が理解できる
Docker新旧コマンド
サンプルリポジトリを取得
git clone https://github.com/docker/getting-started.git
エラー
Command 'docker' not found, but can be installed with:
sudo apt install docker.io
エラー
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/r/runc/runc_1.1.4-0ubuntu1~20.04.1_amd64.deb 404 Not Found [IP: 91.189.91.39 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
sudo apt-get update
インストール成功したけど、なんかこの後うまく動かない。。
環境構築についての注意
windows10+wsl2
windows docker desktopをインストール
ubuntu20.04
windowsのC:\Users\aibizフォルダにdockerフォルダを作成
vscodeでターミナルはpower shellを使うのが良い
vscodeでターミナルはgit bashを使うのが良い
pcを複数ユーザーで使用している場合、「docker-users」グループにユーザーの権限付与も忘れずに
このへんの設定も必要?
VSCodeを起動する。
Ubuntu20.04でWSLに接続する。
/home/aibizsasaki/docker に移動する
(つまり~/docker/)
VSCodeのターミナルでbashを起動してサンプルプロジェクトをgit cloneして
チュートリアルの内容を実行する
にアクセス成功した。
# 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コンテナ内でビルドし、実行するための手順を提供しています。
docker image build -t getting-started .
docker container run -dp 3000:3000 getting-started
http://localhost:3000にアクセスする
docker hubにサインインして getting-started リポジトリを新規作成する
docker image push aibiz20sasaki/getting-started
→ エラーになる
ローカルのImageの名前を変更する
docker image tag getting-started aibiz20sasaki/getting-started
ボリュームマウント:
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デスクトップで操作で、コンテナ実行できた。
→このコマンドならOK
docker container run -dp 3000:3000 --mount type=volume,src=todo-db,target=//etc/todos getting-started
ボリュームを使用するときに、Docker はデータをどこに保存しますか?
docker volume inspect todo-db
バインドマウント:
例えば、~/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
検証
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 が作成される
例
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が起動することがわかります。
ログ確認
docker logs -f <container-id>
終了はCtrl+C
nodemon?
ネットワークを作成
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)
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
dockerでwordpressを実行する方法
docker composeのサンプルいろいろ
起動中のコンテナの中に入って確認するには、
docker ps
で起動中のコンテナIDを調べて
docker container exec -it <コンテナID> bash
コンテナの中から出るには
exit
コンテナ内のファイルをホストPCへコピー
docker cp [コンテナID]:[コピーするファイルパス] [コピー先のファイルパス]
// docker cp ************:/usr/local/test.csv /Desktop
ホストPCのファイルをコンテナ内へコピー
$ docker cp [コピーするファイルパス] ************:[コピー先のファイルパス]
// docker cp /Desktop/test.csv ************:/usr/local