docker初心者向けdocker-composeからやったほうがいいかもよ

バックエンド

【Docker】初心者はdocker-composeから始めた方がいいかもしれない説【チャーハン例えをお借りして】

個人開発なら使わなくてもいいけれど、

チーム開発ならぜひ使いたい便利ツールといえばやっぱり『Docker(ドッカー)』

某開発コミュニティでも当然のように、

開発室メンバー
開発環境は『Docker』だと便利ですね!

的な流れがあり、たくさんのプロジェクトで実際に『Docker』が使われています。

今回、とある新プロジェクト立ち上げで、

『某開発室』メンバーの方に作成いただいた『Docker開発環境』の立ち上げが
なぜかうまくいかず、ググりにググりまくって得た知見を忘れないように残しておこうと思います。

先に結論を書くと、

docker-compose up コマンドだと起動画面で止まってしまう(ように見える)ので、
docker-compose up -d と -d コマンドをつけて、バックグラウンドで動かせばOKだった、

という結果でした。

アオキ
たかが -d オプション。 されど -d オプションですな。
Sponsored link

そもそもDockerってなんなのさ

2013年3月にリリースされた『Docker』。

ざっくりいうと、パソコンの中にパソコン(サーバー)環境を持てる技術(仮想化技術)で、

ドラえもんの四次元ポケット的なイメージなんですが、

昔からあった『VirtualBox(バーチャルボックス)』や『VMWare(ブイエムウェア)』
それらの技術を活用した『Vagrant(ベイグラント)』と比べて、

  • ハードディスクの使用量が少ない
  • 仮想環境の起動が早い
  • 性能劣化がほとんどない
  • 使い捨ても簡単

といったメリットがあると言われています。

デメリットとして先に書いておくと、

OSがwindowsの場合、windows10pro以外は動作が怪しい事があり(うまく動かないとかなんとか)、

『Docker』使いの方はMacやLinuxが多いようです。

Dockerのメリット

『Docker』の何がいいかというと、

例えばプロジェクトを2つ担当していたりすると、
それぞれデータベースの設定が違ったりするので毎回変更する手間をはぶけたり、

サーバーやデータベースの初期設定って面倒だし時間もかかるので、
『docker-compose.yml』という、
一発で環境構築できるファイルをつくっておけばあっさり構築できるというのがとっても便利なんですよね。

アオキ
環境構築に2〜3日かかっていたのが30分で終わるようになった、という話もあるようです。
Sponsored link

Dockerのイメージと環境構築方法

一口に『Docker』といってもいくつか役割があって、だいぶこんがらがったので図を書いてみました。

公式サイトなどで『Docker』をインストールして立ち上げると、

青い枠の『Dockerホスト』が立ち上がります。

『Dockerホスト』の中で、

  • webサーバならnginx(エンジンエックス)かApache(アパッチ)
  • データベースならmysql(マイエスキューエル)など
  • プログラミング環境(PHPとかRubyとか)

などなどを動かすことができます。

クラウド上の『Dockerレジストリ』の中に、

nginxやapache, mysql, php などのイメージが保管されているので、

それらをダウンロードするとパソコン上に『Dockerイメージ』として保存されます。

実際に使う時には『Dockerイメージ』を『Dockerコンテナ』として実体化すれば使えるようになります。

チャーハンで例えると、

  • 『DockerHub』・・業者用の倉庫
  • 『Dockerイメージ』・・冷凍チャーハン
  • 『Dokcerコンテナ』・・解凍して食べれる状態のチャーハン

という感じだそうです。

アオキ
チャーハンに例えた人すごいよなぁ、そんなセンスを持ちたいもんです。
Sponsored link

Dockerの環境構築方法

開発環境の構築方法は大きく分けると2通りあるのかなと思います。

  1. Dockerレジストリ(DockerHub)から1つずつダウンロードする
  2. docker-compose.ymlファイルに記載してまるっとインストールする

1番は文字通り、

  • webサーバーならnginxかapache
  • データベースならmysqlなど
  • プログラミング言語(laravelならPHPなど)

を一つずつダウンロードして、コンテナとして立ち上げて、という手順になるのですが、

Docker初心者ならなかなか苦戦すると思われるのと(僕はそうでした)、

実際の現場ではコンテナ1つということはなく、

3つも4つも組み合わせて使うので(例えばwebサーバーとmysqlとphpなど)、

最初から2番の 『docker-compose.yml』 ファイルでインストールしつつ覚えていった方がいいんじゃないかなと思います。

アオキ
『docker-compose サンプル』とかでググるといろいろでてくると思います。

『docker-compose』はとにかく便利で、

  • DockerHubからいくつでも必要なイメージをダウンロード
  • DockerイメージをDockerコンテナとして実行

をまるっと実施してくれます。

アオキ
ちなみに『docker-compose』をチャーハンで例えると、
アオキ
「複数段あって温め順等を設定できる高機能な電子レンジ」だそうです。なるほど。
Sponsored link

docker-composeファイルサンプル


『docker-compose』をざっくり言うと、

複数のコンテナを同時にインストールしたり起動させたりするツールです。

イメージはなぜかタコ。

『docker-compose.yml』ファイルをつくって、その中に起動させたいツールの情報を書いていきます。

今回の内容はこちら。

version: "2"

services:
  nginx:
    image: nginx:alpine
    volumes:
      - ./docker/nginx/conf.d/:/etc/nginx/conf.d/
      - ./public:/var/www/public
    ports:
      - 80:80
    links:
      - phpfpm
    depends_on:
      - phpfpm
  phpfpm:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    volumes:
      - ./:/var/www/
    links:
      - mysql
    depends_on:
      - mysql
    environment:
      - DB_HOST=mysql
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=database
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
    ports:
      - 3306:3306

yml(ヤメル)という書き方で書かれていて、コロン(:)の後に改行し、段落をつけて書かれています。

よくよく見ると、

  • サービスとして、nginxと、phpfpmと、mysqlという3つがある
  • nginxとmysqlの中にはimage という記載がある。(『DockerHub』からダウンロードする)
  • nginxとmysqlはポート番号を指定している。
  • linkの後に各サービスを書いている(繋げている)
  • depends_on で依存関係
  • phpfpmは「dockerfile」を読み込む

という内容が読み取れます。

アオキ
英語の単語そのままなので、ちょっと慣れると読むのは簡単かも。

続いて、nginxの設定ファイル。 docker/nginx/conf.d/default.conf という箇所に保存されていました。

server {
    listen       0.0.0.0:80;
    server_name  localhost;
    charset      utf-8;

    root /var/www/public;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ .php$ {
        fastcgi_pass  phpfpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}
アオキ
うん、ここはもうちょい読み解き必要やな。

続いて『Dockerfile』。

『Dockerfile』はさながらチャーハンのレシピ。

FROM php:7.2-fpm-alpine

RUN docker-php-ext-install pdo_mysql

この2行。

FROM php:7.2-fpm-alpine は『DockerHub』からダウンロードで、

RUN docker-php-ext-install pdo_mysql で phpとmysqlの実行と思われます。

これらを準備して、『docker-compose up -d』というコマンドを打つことで、

「複数段あって温め順等を設定できる高機能な電子レンジ」がガリガリ勝手に動いて、

10分もしないうちに、仮想環境内に、

  • webサーバー(nginx)
  • データベース(mysql)
  • プログラミング環境(PHP)

がインストールされると。

他のプロジェクトでは追加で、

  • PHPのライブラリどっさりインストール
  • メールサーバーインストール
  • 自動マイグレート(データベース内のテーブル作成)
  • 自動シーダー投入(ダミーデータをデータベースに保存)

なんかもやっちゃったりしてます。

これらを一つずつ考えながらつくっていくと結構な時間がかかるし途中でやめちゃう可能性大なので、

最初は『docker-compose サンプル』などでググってできあがった状態をダウンロードした方がいいんじゃないかなと思います。

アオキ
『Docker』めっさ便利!ってのを体感できると覚える気力が増しまっせ。
Sponsored link

Docker環境構築でつまずいた件 portがかぶってる

すんなり動けばいいんですが、
すんなり動かないこともままあるのが『Docker』。

一つ目はこんなエラーメッセージでした。

ERROR for cannot start service mysql: b’driver failed programming external connectivity on endpoint
Bind for 0.0.0.0:3306 failed: port is already allocated

ポート3306がすでに使われていると。

ポート番号被っていると起動できないので、

docker-compose down でコンテナ停止して
docker-compose ps でコンテナ状態確認して(ステータスがExit 0 なら停止中)

そこから再度 docker-compose up -d

それでもだめならゾンビプロセスが残ってる可能性があるので、

sudo lsof -i:3306
などで動いているプロセスを確認して
sudo kill 3306

などで強制終了かけた後に

docker-compose up -d で高機能電子レンジを動かすといいかも、です。

docker-compose up で止まっちゃってみえる

こちらはだいぶ時間がかかりました。

docker-dompose up とうって、順調に起動が進んでいって、

mysqld: ready for connections.
socket: ‘/var/run/mysqld/mysqld.sock’ port:3306 MySQL Community Server (GPL)

という表示のあとに止まってしまうという。

冒頭にも書きましたが、

-d オプションをつけないと、表画面で起動されるのでコマンド受け付けなくなっちゃうんですよね・・

(この場合はCtrl+Cで止めるしかなくなる)

別ターミナルだせば動かせるようなのですが、素直に -d オプションつけた方がいいかなと思ってます。

おまけ dockerよく使うコマンド

docker-compose up -d ・・docker-compose.ymlの内容を実行

docker-compose ps ・・プロセス状況確認

docker-compose down ・・コンテナ停止

docker exec -it mysql bash ・・コンテナに入る (mysqlに入るなど)

mysql -h 127.0.0.1 -u xxx -p yyy ・・mysqlコンテナに入った後にmysqlにログイン

docker container ls 実行中コンテナ表示
docker container ls -a 実行停止問わず全てのコンテナ表示

docker image -a ダウンロード済みイメージ一覧

『docker-compose.yml』が作られていれば、upとpsとdownのコマンドが増えると思います。

Sponsored link

docker まとめ

『docker』はとても便利な反面、高機能な分わかりづらい箇所もいくつかあり、

とくにDockerイメージからDockerコンテナをつくって、それを連携させる、というのは

最初から取り組むとなかなかハードル高い感じがするので、

先人の知恵を盛大にお借りして、『docker-compose.yml』ファイルのサンプルをいくつかみて、

実際に試してみて、ちょっとずつ覚えていくのがいいんじゃないかなと思ってます。

『Docker』を組み合わせた『Kubenetes(クーベネティス』というツールもあり、

新しいツールがどんどん出てきてますが、ちょっとずつでも覚えていきたいもんですな。

アオキ
それにしてもチャーハンの例えはすごいよなぁ(チャーハン食べたくなるわー)

参考サイト

dockerが起動できない (port is already allocated)

Dockerについてなるべくわかりやすく説明する←チャーハンネタ

Dockerで開発環境構築を10倍楽にしたはなし←カヤックさん

コンテナ未経験新人が学ぶコンテナ技術入門←NTT新人さん、さすがのクオリティ

アオキ
ツイッターでも記事ネタ含めちょろちょろ書いていくので、よろしければぜひフォローお願いしますm(_ _ )m

アオキのツイッターアカウント


関連記事一覧 (一部広告あり)

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


最近の記事

アーカイブ

  1. オンライン教材

    【AWS】【初心者向け】インフラの基礎からわかる講座をリリースしました【Udem…
  2. オンライン教材

    【ChatGPT】エンジニア編をリリースしました
  3. オンライン教材

    ChatGPTをビジネス活用する講座をリリースしました【Udemy】
  4. オンライン教材

    【React】初心者向け講座をリリースしました【MUI】【Udemy】
  5. バックエンド

    【Laravel第4弾】Vue.js3(CompositionAPI+Scrip…
PAGE TOP
Ads Blocker Image Powered by Code Help Pro

広告ブロックを摘出しました!!

ブラウザ拡張を使用して広告をブロックしていることが摘出されました。

ブラウザの広告ブロッカーの機能を無効にするか、
当サイトのドメインをホワイトリストに追加し、「更新」をクリックして下さい。

あなたが広告をブロックする権利があるように、
当方も広告をブロックしている人にコンテンツを提供しない権利と自由があります。

Powered By
100% Free SEO Tools - Tool Kits PRO