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オプションを指定するとバックグラウンドで起動するので、コンテナが起動した後も引き続き同じターミナルで入力ができます。

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