Dockerによる開発とうまく動かないときの対処法
Dockerは、近年のWebアプリ開発環境におけるデファクトスタンダードになりつつあります。 この記事では、Dockerの簡単な使い方と、よくあるエラーについての解決方法を紹介します。
Dockerのおさらい
コンテナの起動(nginx)
docker run
コマンドでコンテナを起動します。
docker run -d -p 8000:80 -v
pwd:/usr/share/nginx/html nginx
上記の場合は、nginxイメージを使用してコンテナを起動します。
-v
オプションにpwd
コマンドを指定することで現在位置をホスティングします。
ブラウザでlocalhost:8000にアクセスすると、-p
オプションで指定した8000番ポートでホスティングしていることを確認できます。
-d
オプションを指定するとバックグラウンドで起動するので、コンテナが起動した後も引き続き同じターミナルで入力ができます。
1#起動中のコンテナの情報一覧表示
2docker ps
3
4#指定したコンテナを停止
5docker stop container_name
コンテナを停止するときは、docker stop
コマンドを使います。
コンテナ名はdocker ps
コマンドで確認できます。
1#起動中のコンテナで(pwd)コマンド実行
2docker exec -it container_name pwd
3
4#指定した起動中のコンテナにログイン
5docker exec -it container_name bash
起動したコンテナに対して何かコマンド操作したい場合は、docker exec
コマンドで行うことができます。
DockerHubにあるDockerイメージをもとに、カスタマイズを加えたイメージを作成することができます。
ミドルウェアに追加する設定などはここに記入していきます。
また起動時の環境に依存するものはここには書かず、環境変数などに設定するなどして依存しないようにします。
1# ベースとなるイメージを指定(Node.js v16)
2FROM node:16
3
4# コンテナ上での作業ディレクトリを指定
5WORKDIR /usr/src
6
7# 作成するイメージにファイルをコピー
8COPY ./entrypoint.js .
9
10# コマンドを実行(npmコマンドでexpressをインストール)
11RUN npm -v && \\
12npm i -g express
Dockerfileがあるディレクトリを指定してdocker build
コマンドを実行すると、Dockerfileをもとに新たなイメージが生成されます。
これを利用することで、細かにカスタマイズされ再現性のある環境を容易に設置・複製することができるようになります。
docker build . -t my_docker_image
Docker Compose
実際は、Dockerコンテナを1つだけ使って開発することはまれで、複数のコンテナを用いてアプリケーションを開発することがほとんどかと思います。 設定をYAMLファイルで指定することで、同じ環境再現が可能です。
1version: '3.7'
2
3services:
4 nginx:
5 container_name: nginx
6 image: nginx:1.19
7 ports:
8 - 8888:80
9 volumes:
10 - ./source:/usr/share/nginx/html
11 - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
12
13 node:
14 container_name: node
15 tty: true
16 build: ./docker/node/
17 ports:
18 - 5555:5000
19 volumes:
20 - ./app:/usr/src/app
21 - ./package.json:/usr/src/package.json
22
23 mysql:
24 container_name: mysql
25 image: mysql:8.0
26 environment:
27 MYSQL_DATABASE: app_db
28 MYSQL_ROOT_PASSWORD: YOUR_PASSWORD
29 MYSQL_USER: app_user
30 MYSQL_PASSWORD: YOUR_PASSWORD
31 TZ: Asia/Tokyo
32 ports:
33 - 3306:3306
34 volumes:
35 - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
36 - ./docker/mysql/data:/var/lib/mysql
docker-compose
コマンドで立ち上げます。普段の開発では基本的にこちらを使います。
1#開始
2docker-compose up -d
3
4#終了
5docker-compose down
Dockerがうまく動かないときに気をつけること
よくあるエラー
"Is the docker daemon running?"
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Dockerプロセスが立ち上がっていないです。Docker Desktopを起動しましょう。
"port is already allocated"
ポートが既に利用されています。ホスト側のポート番号を変更しましょう。
ERROR: for city-proxy Cannot start service proxy: driver failed programming external connectivity on endpoint sample-app (082155c1d1e23f77a1f7c670585bb41863f08055df0ef393098133a562d873c9): Bind for 0.0.0.0:8080 failed: port is already allocated