Published: 2021-12-19
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オプションを指定するとバックグラウンドで起動するので、コンテナが起動した後も引き続き同じターミナルで入力ができます。
#起動中のコンテナの情報一覧表示
docker ps
#指定したコンテナを停止
docker stop container_name
コンテナを停止するときは、docker stopコマンドを使います。 コンテナ名はdocker psコマンドで確認できます。
console#起動中のコンテナで(pwd)コマンド実行
docker exec -it container_name pwd
#指定した起動中のコンテナにログイン
docker exec -it container_name bash
起動したコンテナに対して何かコマンド操作したい場合は、docker execコマンドで行うことができます。
Dockerfile
DockerHubにあるDockerイメージをもとに、カスタマイズを加えたイメージを作成することができます。 ミドルウェアに追加する設定などはここに記入していきます。
また起動時の環境に依存するものはここには書かず、環境変数などに設定するなどして依存しないようにします。
# ベースとなるイメージを指定(Node.js v16)
FROM node:16
# コンテナ上での作業ディレクトリを指定
WORKDIR /usr/src
# 作成するイメージにファイルをコピー
COPY ./entrypoint.js .
# コマンドを実行(npmコマンドでexpressをインストール)
RUN npm -v && \
npm i -g express
Dockerfileがあるディレクトリを指定してdocker buildコマンドを実行すると、Dockerfileをもとに新たなイメージが生成されます。 これを利用することで、細かにカスタマイズされ再現性のある環境を容易に設置・複製することができるようになります。
consoledocker build . -t my_docker_image
Docker Compose
実際は、Dockerコンテナを1つだけ使って開発することはまれで、複数のコンテナを用いてアプリケーションを開発することがほとんどかと思います。 設定をYAMLファイルで指定することで、同じ環境再現が可能です。
docker-compose.ymlversion: '3.7'
services:
nginx:
container_name: nginx
image: nginx:1.19
ports:
- 8888:80
volumes:
- ./source:/usr/share/nginx/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
node:
container_name: node
tty: true
build: ./docker/node/
ports:
- 5555:5000
volumes:
- ./app:/usr/src/app
- ./package.json:/usr/src/package.json
mysql:
container_name: mysql
image: mysql:8.0
environment:
MYSQL_DATABASE: app_db
MYSQL_ROOT_PASSWORD: YOUR_PASSWORD
MYSQL_USER: app_user
MYSQL_PASSWORD: YOUR_PASSWORD
TZ: Asia/Tokyo
ports:
- 3306:3306
volumes:
- ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
- ./docker/mysql/data:/var/lib/mysql
docker-composeコマンドで立ち上げます。普段の開発では基本的にこちらを使います。
console#開始
docker-compose up -d
#終了
docker-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