「Dockerコンテナがうまく起動しない」そんなときにチェックするコマンドまとめ

「Dockerコンテナがうまく起動しない」チェックするコマンドまとめ

今回はきつかったです。
納期1日前に来るデザイン原稿
納期前週金曜日に行われたDockerの本番環境構築への変更
そして、これに伴うコンテナ未起動問題と修正しようとして行った作業によるDocker立ち上がらない問題。

てんこ盛りでした。

と言う事で、その時の現場検証に使われたコマンドで私が知らなかったものを中心にまとめます。

まず、納期直前に行われたDockerの構築編集について触れてみる

私自身この作り方を知りませんでした。

version: '3'
services:
  fluentd:
    container_name: fluentd
    build:
      context: ./
      dockerfile: docker/fluentd/Dockerfile
      args:
        CHANGE_UID_GID: ${DOCKER_BUILD_ARG_CHANGE_UID_GID:-false}
        CHANGE_UID_GID_BEFORE_UID: ${ARG_CHANGE_UID_GID_BEFORE_UID:-""}
        CHANGE_UID_GID_BEFORE_GID: ${ARG_CHANGE_UID_GID_BEFORE_GID:-""}
    volumes:
      - ./storage/logs:/fluentd/log
    ports:
      - 4224:4224
    networks:
      - hoge

  nginx:
    container_name: nginx
    build:
      context: ./
      dockerfile: docker/nginx/Dockerfile
      args:
        PHPFPM_BACKEND_PATH: ${ARG_PHPFPM_BACKEND_PATH:-phpfpm}
        PHPFPM_BACKEND_PORT: ${ARG_PHPFPM_BACKEND_PORT:-9000}
    ports:
      - ${FORWARD_NGINX_PORT:-80}:80
    volumes:
      - ./:/var/www/html
    networks: - hoge
    logging:
      driver: 'fluentd'
      options:
        fluentd-address: localhost:4224
        tag: docker.nginx.{{.FullID}}
    depends_on:
      - nodejs
      - fluentd

  phpfpm:
    container_name: phpfpm
    image: phpfpm
    build:
      context: ./
      dockerfile: docker/phpfpm/Dockerfile
      args:
        ENVIRONMENT: ${ARG_ENVIRONMENT:-local}
        CHANGE_UID_GID: ${ARG_CHANGE_UID_GID:-false}
        CHANGE_UID_GID_BEFORE_UID: ${ARG_CHANGE_UID_GID_BEFORE_UID:-""}
        CHANGE_UID_GID_BEFORE_GID: ${ARG_CHANGE_UID_GID_BEFORE_GID:-""}
    environment:
      - CONTAINER_ROLE=app
    logging:
      driver: 'fluentd'
      options:
        fluentd-address: localhost:4224
        tag: docker.app.{{.FullID}}
    depends_on:
      - fluentd
    networks: - hoge
    volumes:
      - ./:/var/www/html

  scheduler:
    container_name: scheduler
    image: phpfpm
    environment:
      CONTAINER_ROLE: scheduler
    volumes:
      - ./:/var/www/html
    networks:
      - hoge
    logging:
      driver: 'fluentd'
      options:
        fluentd-address: localhost:4224
        tag: docker.scheduler.{{.FullID}}
    depends_on:
      - phpfpm

  queue-worker:
    container_name: queue-worker
    image: phpfpm
    environment:
      CONTAINER_ROLE: queue-worker
    volumes:
      - ./:/var/www/html
    networks:
       - hoge
    logging:
      driver: 'fluentd'
      options:
        fluentd-address: localhost:4224
        tag: docker.queue-worker.{{.FullID}}
    depends_on:
      - phpfpm

  nodejs:
    container_name: nodejs
    image: nodejs
    build:
      context: ./
      dockerfile: ./docker/nodejs/Dockerfile
      args:
        ENVIRONMENT: ${ARG_ENVIRONMENT:-local}
        YARN_RUN_ENV: ${ARG_YARN_RUN_ENV:-prod}
    volumes:
      - ./:/var/www/html
    networks:
       - hoge
    logging:
      driver: 'fluentd'
      options:
        fluentd-address: localhost:4224
        tag: docker.nodejs.{{.FullID}}
    depends_on:
      - fluentd

  mysql:
    container_name: mysql
    build:
      context: ./
      dockerfile: docker/mysql/Dockerfile
    ports:
      - ${FORWARD_DB_PORT:-3306}:3306
    environment:
      MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
      MYSQL_DATABASE: '${DB_DATABASE}'
      MYSQL_USER: '${DB_USERNAME}'
      MYSQL_PASSWORD: '${DB_PASSWORD}'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - 'hoge-mysql:/var/lib/mysql'
    networks:
      -  - hoge
    logging:
      driver: 'fluentd'
      options:
        fluentd-address: localhost:4224
        tag: docker.mysql.{{.FullID}}
    depends_on:
      - fluentd

  mailhog:
    container_name: mailhog
    image: 'mailhog/mailhog:latest'
    ports:
      - 1025:1025
      - 8025:8025
    networks:
      - hoge
    logging:
      driver: 'fluentd'
      options:
        fluentd-address: localhost:4224
        tag: docker.mailhog.{{.FullID}}
    depends_on:
      - fluentd

networks:
  hoge
    driver: bridge
volumes:
  hoge-mysql:
    driver: local
  hoge-mysql-test:
    driver: local

networks: / volumes: という形で用意し、パーツ分けしたコンテナを統合しています。

例えば、Nodejsはnodejs:というコンテナを作成してしまい networks: - hogeで繋げてあげるとフレームワーク内のnode.jsとして扱えるというもの。

これね、nodeだけでバージョン管理できたりと効果が非常に高いそうです。

目次的なやつを書いときます

  • GitHubからReadできるようにする【wgetで取得】
  • 一発で行けるからつい使うけど、問題発生時は分けましょう【起動しない時の問題切分け】
  • UPができなくてもコンテナの中に入る方法はある
  • Dockerの存在確認【Dockerのバージョンが知りたくなる時がある】

一発で行けるからつい使うけど、問題発生時は分けましょう
docker-compose build
docker-compose up

Dockerの存在確認
docker --version
docker-compose --version

立ち上がってないコンテナに入る
docker-compose run --rm phpfpm sh

今回の原因その1

^M
改行コードの「^M」を削除する方法: 小粋空間

改行コード「^M」を削除する方法を紹介します。

改行コードが化けている。これはJISエンコードでCRLF改行が入ると出てくるらしい
UTF8じゃなければ、そりゃ走らないだろう。

ただこれを解決しても起動しないコンテナが...。

wgetで取得できるようにする

EC2にgit cloneする方法 #AWS - Qiita

EC2にコードを展開する時、git cloneでやると簡単にDeployできます。 なんとなく手順を覚えているものの、ところどころ忘れていることもあるので、やり方をまとめておきま…

DeployKey 生成

$ cd ~/.ssh
$ ssh-keygen -t rsa
Enter file in which to save the key (): github_key
Enter passphrase (empty for no passphrase): [Enter]
Enter same passphrase again: [Enter]
$ vi ~/.ssh/config
Host github.com
  User git
  IdentityFile ~/.ssh/github_key
$ cat ~/.ssh/github_key.pub

ココで生成された鍵をGitHubにDeployKeyとして登録するとGitHubからReadできるようになる。

$ chmod 600 ~/.ssh/config
$ ssh -T git@github.com

これを実行した後にWgetをインストールする

$ sudo yum install -y wget

問題の切り分け方法

まずは、imageなどをすべて消す。
その後、Buildだけ実行
buildが実行出来たら次は起動プロセスを確認
最後に、個別にコンテナを指定して個別に起動確認する

$ docker-compose build mysql
$ docker-compose run --rm mysql sh
$ docker-compose up
$ docker ps

これで、コンテナが起動しない理由を個別×パートで確認することができる。

$ docker-compose down

Dockerの存在確認

コンテナが立ち上がらない時、Dockerのバージョンを確認するときがあります。
例えば、開発PC上では動いているのに本番サーバーで docker-compose up -d --buildしたら動かなくなったとか。

そんな時に確認するものにバージョン情報があります。

$ docker --version
$ docker-compose --version

これでバージョン確認はOK。

立ち上がってないコンテナに入る

このコマンド知らなかったんですよね。

$ docker-compose run --rm phpfpm sh

Buildが完了していて、且つ起きなかったコンテナに入ることができます。
なんで up で起きなかったかの状況確認に最適です。

まとめ

研修のつもりで外部の企業さんにエンジニアとしてお仕事をもらうようになって2か月が経過しました。
おかげで新しい気付きを沢山もらいつつ、刺激的にお仕事できています。
ただ、このブログの更新がおろそかになってますが...。

まぁ、忙しいのはいいことだ!

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。