sagara.inkITエンジニアのまとめノート

Dockerによる開発とうまく動かないときの対処法

Dockerは、近年のWebアプリ開発環境におけるデファクトスタンダードになりつつあります。 この記事では、Dockerの簡単な使い方と、よくあるエラーについての解決方法を紹介します。

Dockerのおさらい

コンテナの起動(nginx)

docker runコマンドでコンテナを起動します。

console
docker run -d -p 8000:80 -v `pwd`:/usr/share/nginx/html nginx

上記の場合は、nginxイメージを使用してコンテナを起動します。-vオプションにpwdコマンドを指定することで現在位置をホスティングします。
ブラウザでlocalhost:8000にアクセスすると、-pオプションで指定した8000番ポートでホスティングしていることを確認できます。
-dオプションを指定するとバックグラウンドで起動するので、コンテナが起動した後も引き続き同じターミナルで入力ができます。

console
#起動中のコンテナの情報一覧表示        
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イメージをもとに、カスタマイズを加えたイメージを作成することができます。 ミドルウェアに追加する設定などはここに記入していきます。
また起動時の環境に依存するものはここには書かず、環境変数などに設定するなどして依存しないようにします。

Dockerfile(node.js+Expressの例)
# ベースとなるイメージを指定(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をもとに新たなイメージが生成されます。 これを利用することで、細かにカスタマイズされ再現性のある環境を容易に設置・複製することができるようになります。

console
docker build . -t my_docker_image

Docker Compose

実際は、Dockerコンテナを1つだけ使って開発することはまれで、複数のコンテナを用いてアプリケーションを開発することがほとんどかと思います。 設定をYAMLファイルで指定することで、同じ環境再現が可能です。

docker-compose.yml
version: '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