takaya030の備忘録

PHP、Laravel、Docker などの話がメインです

Windows の git bash (msysgit) 環境の Docker コマンドを手動アップグレード

msysgit にインストールされた docker コマンドを手動アップグレードしたときの手順メモ

動作環境

Windows10 Home Edition
VirtualBox 5.1.6
docker 1.10.3
docker-machine 0.6.0

docker コマンドの最新バージョン

2017/1/1 現在の Latest Release バージョン

docker 1.12.5

dokcer コマンドのダウンロード

以下のリンクからダウンロード。解凍した docker.exe を古い exe と入れ替える
Windows 64bits zip: https://get.docker.com/builds/Windows/x86_64/docker-1.12.5.zip

動作確認

$ docker -v
Docker version 1.12.5, build 7392c3b

$ docker images
Error response from daemon: client is newer than server (client API version: 1.24, server API version: 1.22)

Client API バージョンが合っていないためエラーが出ている
docker-machine upgrade で Docker ホスト(CoreOS)のアップグレードをすることで解消される

$ docker-machine upgrade default
Waiting for SSH to be available...
Detecting the provisioner...
Upgrading docker...
Stopping machine to do the upgrade...
Upgrading machine "default"...
Default Boot2Docker ISO is out-of-date, downloading the latest release...
Latest release for github.com/boot2docker/boot2docker is v1.12.5
Downloading C:\Users\takaya030\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v1.12.5/boot2docker.iso...
0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Copying C:\Users\takaya030\.docker\machine\cache\boot2docker.iso to C:\Users\takaya030\.docker\machine\machines\default\boot2docker.iso...
Starting machine back up...
(default) Check network to re-create if needed...
(default) Waiting for an IP...
Restarting docker...

$ docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
mysql                              5.6                 72010d7c69f5        16 months ago       283.6 MB
centos                             6                   93f242d546bd        18 months ago       203.1 MB
busybox                            latest              63e6ca37d7f4        20 months ago       2.433 MB

Windows + VirtualBox + Docker で動作しているコンテナから XAMPP の MySQL へアクセス

前回 Docker コンテナからホスト OS (Windows)へのアクセス可能なことを確認しましたが、今回はその応用でコンテナから XAMPP の MySQL に接続してみます

動作環境

以下の環境で検証しました
VirtualBoxDocker はインストール済みの前提で話を進めます

Windows10 Home Edition
VirtualBox 5.1.6
docker 1.10.3
docker-machine 0.6.0

デフォルトルートの確認

コンテナからホストOS (Windows) へのアクセスはデフォルトルートを通じて行うことが可能です
デフォルトルートは CoreOS 上で "ip r" と入力することで確認可能です

$ ip r
default via 10.0.2.2 dev eth0  metric 1
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
127.0.0.1 dev lo  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1
172.18.0.0/16 dev br-5b890ae3c1a7  proto kernel  scope link  src 172.18.0.1
172.19.0.0/16 dev br-0fef2cb04591  proto kernel  scope link  src 172.19.0.1
192.168.99.0/24 dev eth1  proto kernel  scope link  src 192.168.99.100

自分の環境ではデフォルトルートのアドレスは 10.0.2.2 でした

XAMPP の MySQL の起動

xampp-controlMySQL を起動します
f:id:takaya030:20161029191234p:plain

コンテナから XAMPP の MySQL に接続

$ mysql -u root -h 10.0.2.2
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.21 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

以上、コンテナから XAMPP の MySQL にアクセス可能なことが確認できました

Windows + VirtualBox + Docker で動作しているコンテナからホスト OS へのアクセス

Docker コンテナからホスト OS (CoreOS,Windows)へのアクセス方法について

動作環境

以下の環境で検証しました
VirtualBoxDocker はインストール済みの前提で話を進めます

Windows10 Home Edition
VirtualBox 5.1.6
docker 1.10.3
docker-machine 0.6.0

ブリッジインターフェースの確認

Docker のネットワークを管理している仮想ブリッジ "docker0" を確認します。
CoreOS 上で "ip a" と入力することで確認可能です。

$ ip a

7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:d4:14:51:45 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

自分の環境では docker0 のアドレスは 172.17.0.1 でした

コンテナから CoreOS へのアクセス

コンテナから CoreOS へのアクセスは仮想ブリッジ "docker0" を通じて行うことが可能です

$ ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.784 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.098 ms
64 bytes from 172.17.0.1: icmp_seq=3 ttl=64 time=0.086 ms
64 bytes from 172.17.0.1: icmp_seq=4 ttl=64 time=0.085 ms

コンテナから Windows へのアクセス

コンテナから Windows へのアクセスはデフォルトルートを通じて行うことが可能です
デフォルトルートは CoreOS 上で "ip r" と入力することで確認可能です

$ ip r
default via 10.0.2.2 dev eth0  metric 1
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
127.0.0.1 dev lo  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1
172.18.0.0/16 dev br-5b890ae3c1a7  proto kernel  scope link  src 172.18.0.1
172.19.0.0/16 dev br-0fef2cb04591  proto kernel  scope link  src 172.19.0.1
192.168.99.0/24 dev eth1  proto kernel  scope link  src 192.168.99.100

自分の環境ではデフォルトルートのアドレスは 10.0.2.2 でした

$ ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=62 time=0.226 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=62 time=0.466 ms
64 bytes from 10.0.2.2: icmp_seq=3 ttl=62 time=0.537 ms
64 bytes from 10.0.2.2: icmp_seq=4 ttl=62 time=0.435 ms

以上、コンテナから CoreOS、Windows 双方にアクセス可能なことが確認できました

Docker 版 Rails5 で Hello world

Docker で構築した Ruby on Rails5 の環境で "Hello world!" を表示してみる

コントローラ作成

Docker ホストOS 上で下記コマンドで作成

$ docker-compose run --rm web rails generate controller hello
      create  app/controllers/hello_controller.rb
      invoke  erb
      create    app/views/hello
      invoke  test_unit
      create    test/controllers/hello_controller_test.rb
      invoke  helper
      create    app/helpers/hello_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/hello.coffee
      invoke    scss
      create      app/assets/stylesheets/hello.scss

index のアクション作成

app/controllers/hello_controller.rb

class HelloController < ApplicationController
	def index
		render :text => "Hello, world!"
	end
end

ルーティング

config/routes.rb

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  resources :hello do
	  root 'hello#index'
  end
end

動作確認

web ブラウザで http://192.168.99.100:3000/hello を開いて "Hello, world!" と表示されれば成功です

Docker で Rails5 + MySQL の開発環境を構築する

前回 Docker で Ruby on Rails5 のサーバーを単体で起動させましたが、今回は MySQL 連携させてみました。

設定ファイルおよび操作手順について

こちらのサイトに記載されている手順とほぼ同じです。
qiita.com


以下、内容を変更した設定ファイルです。

Dockerfile

#
# ruby 2.3 + rails 5.0.0.1
#
# 2016-10-10
#

FROM ruby:2.3
MAINTAINER takaya030

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

Gemfile

source "https://rubygems.org"
gem 'rails', '5.0.0.1'

docker-compose.yml

version: '2'
services:
  db:
    image: mysql:5.6
    container_name: rr5_db
    environment:
      MYSQL_ROOT_PASSWORD: root
  web:
    build: .
    image: rr5_web
    container_name: rr5_web
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

Docker で Ruby on Rails5 の開発環境を構築する

Docker で Ruby on Rails5 の開発環境のベースイメージを作成したときの手順メモ

設定ファイルおよび操作手順について

こちらのサイトに記載されている手順で rails5 もセットアップできました。
qiita.com


以下、内容を変更した設定ファイルです。

Dockerfile

#
# ruby 2.3 + rails 5.0.0.1
#
# 2016-10-05
#

FROM ruby:2.3
MAINTAINER takaya030

ENV APP_ROOT /usr/src/myapp

WORKDIR $APP_ROOT

RUN apt-get update && \
    apt-get install -y nodejs \
                       mysql-client \
                       postgresql-client \
                       sqlite3 \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global build.nokogiri --use-system-libraries && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem

# bundle install でカレントディレクトリに rails5 をインストールした後、
# 以下をコメントアウトして再度 docker build を実行する

#COPY . $APP_ROOT
#
#EXPOSE  3000
#CMD ["rails", "server", "-b", "0.0.0.0"]

Gemfile

source "https://rubygems.org"
gem 'rails', '5.0.0.1'

docker-compose.yml

version: '2'
services:
  app:
    build: .
    image: developer_name/project_name
    container_name: project_name_app
    environment:
      RAILS_ENV: development
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/usr/src/myapp
    ports:
      - "3000:3000"

Docker で nginx + php-fpm + Laravel5.3 の開発環境を作る

DockerLaravel 5.3 の開発環境を構築した際の手順メモ

検証環境

以下の環境で検証しました
VirtualBoxDocker はインストール済みの前提で話を進めます

Windows10 Home Edition
VirtualBox 5.0.16
docker 1.10.3
docker-machine 0.6.0
docker-compose 1.6.2

準備作業

Windowsのエディタで php のコードを編集した結果を直ちに反映させるため、Windows のフォルダを VirtualBox にマウントし、そこに Laravel をインストールします
マウント手順は下記の記事を参照してください
takaya030.hatenablog.com

C:\workspace をマウントした後、C:\workspace\laravel53 フォルダを作成します

Docker イメージの作成のための各種ファイル

ファイル構成

l53
│  docker-compose.yml
│
├─nginx
│      Dockerfile
│      server.conf
│
└─php7
        bashrc
        Dockerfile
        index.php
        mysupervisord.conf

各ファイルの内容

l53/docker-compose.yml
nginx: 
  build: ./nginx
  ports: 
    - "80:80"
    - "9000:9000"
  links: 
    - php7

php7: 
  build: ./php7
  hostname: laraweb
  ports: 
    - "2022:22"
  volumes: 
    - /workspace/laravel53:/webapp
l53/nginx/Dockerfile
FROM nginx:latest
MAINTAINER takaya030

ADD server.conf /etc/nginx/conf.d/server.conf
l53/nginx/server.conf
server {
    listen 80 default;
    server_name _;
    root /webapp/public;
    index index.php index.html index.htm;
    charset utf-8;

    access_log off;
    error_log off;

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

    location ~ ^/index.php$ {
        fastcgi_pass l53_php7_1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

server {
    listen 9000 default;
    server_name _;
    root /var/www/html;
    index index.php index.html index.htm;
    charset utf-8;

    access_log off;
    error_log off;

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

    location ~ ^/index.php$ {
        fastcgi_pass l53_php7_1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}
l53/php7/bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# git prompt
if [ -f $HOME/.git-completion.bash ]; then
	source $HOME/.git-completion.bash
fi
if [ -f $HOME/.git-prompt.sh ]; then
	source $HOME/.git-prompt.sh
	export PS1='\[\033]0;$TITLEPREFIX:${PWD//[^[:ascii:]]/?}\007\]\n\[\033[32m\]\u@\h\[\033[35m\]: \[\033[33m\]\w\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ '
fi

# User specific aliases and functions
alias ls='ls -F --color=auto'
alias ll='ls -la --color=auto'
alias la='ls -a --color=auto'
alias sl='ls -F --color=auto'
alias glog='git log --oneline --decorate --graph --branches --tags --remotes'
l53/php7/Dockerfile
#
# php7-fpm
#
# 2016-09-18
#   PHP 7.0.11

FROM php:7-fpm
MAINTAINER takaya030

# php
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt \
  && apt-get clean

# sshd, scp, sudo, unzip, tar
RUN apt-get install -y openssh-server openssh-client sudo tar unzip supervisor && \
    apt-get clean

# gcc (for building git)
RUN apt-get install -y build-essential libssl-dev gettext curl expat openssl zlibc libcurl4-openssl-dev \
	&& apt-get clean

# git
RUN curl -O https://www.kernel.org/pub/software/scm/git/git-2.9.3.tar.gz && \
	tar xvzf git-2.9.3.tar.gz && \
	cd git-2.9.3 && \
	make configure && \
	./configure --prefix=/usr/local --with-curl --with-expat && \
	make all && \
	make install && \
	cd .. && \
	rm -r git-2.9.3 git-2.9.3.tar.gz

# for git prompt
RUN curl -L https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash > /etc/skel/.git-completion.bash && \
	curl -L https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh > /etc/skel/.git-prompt.sh 
ADD ./bashrc /etc/skel/.bashrc

# composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# phpunit
RUN curl -L https://phar.phpunit.de/phpunit.phar > /usr/local/bin/phpunit && \
	chmod +x /usr/local/bin/phpunit

# node, npm, gulp
RUN apt-get install -y nodejs npm && \
	npm cache clean && \
	npm install n -g && \
	n stable && \
	apt-get purge -y nodejs npm && \
	apt-get clean && \
	/usr/local/bin/npm install --global gulp-cli

# initialize for ssh
RUN sed -i '/pam_loginuid\.so/s/required/optional/' /etc/pam.d/sshd && \
	/usr/sbin/service ssh start && \
	/usr/sbin/service ssh stop

# create login user
RUN useradd -d /home/laravel -m -s /bin/bash laravel && \
	echo laravel:****laravel | chpasswd && \
	echo 'laravel ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# timezone
RUN cp -p /usr/share/zoneinfo/Japan /etc/localtime && \
	echo "date.timezone = Asia/Tokyo" > /usr/local/etc/php/conf.d/myphp.ini

# supervisor
COPY ./mysupervisord.conf /etc/supervisor/conf.d/

COPY index.php /var/www/html/

EXPOSE 22 9000

CMD ["/usr/bin/supervisord"]
l53/php7/index.php
<?php
	phpinfo();
l53/php7/mysupervisord.conf
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
nodaemon=true               ; (start in foreground if true;default false)

[program:sshd]
command=/usr/sbin/sshd -D

[program:php-fpm]
command=/usr/local/sbin/php-fpm

Docker イメージの作成

Docker ホストに上記のファイルを配置した後、以下のコマンドでイメージを作成します

$ cd l53
$ docker-compose build

コンテナの起動

$ cd l53
$ docker-compose up -d

ssh でログイン

$ ssh -p 2022 laravel@192.168.99.100

※パスワードは "****laravel"

Laravel 5.3 のインストール

ssh でログインしたコンテナ上で以下のコマンドを実行する

$ cd /webapp
$ composer create-project "laravel/laravel" --prefer-dist .

動作確認

WEBブラウザで http://192.168.99.100 にアクセスすると Laravel の welcome ページが表示されます
f:id:takaya030:20160920230537p:plain

また http://192.168.99.100:9000 にアクセスすると phpinfo が表示されます
f:id:takaya030:20160920230600p:plain

更新履歴

  • (2016-09-27) l53/php7/Dockerfilenode, npm, gulp のインストールを追加