docker buildするとimageがnoneになる

phpのimageにNew relicを入れたのdocker imageをつくろうと

$ vim Dockerfile

FROM php:5-apache
RUN a2enmod rewrite
RUN apt-get update \ 
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libjpeg-dev libmcrypt-dev wget \
  && docker-php-ext-install pdo_mysql mysqli mbstring iconv mcrypt zip \ 
  && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
  && docker-php-ext-install -j$(nproc) gd \ 
  && wget -O - https://download.newrelic.com/548C16BF.gpg | apt-key add - && \ 
    echo "deb http://apt.newrelic.com/debian/ newrelic non-free" > /etc/apt/sources.list.d/newrelic.list \
&&   apt-get -yq install newrelic-php5

$ docker build -t test .
とすると

$ docker images

REPOSITORY                     TAG                   IMAGE ID            CREATED             SIZE
<none>                         <none>                e1e4ef76e658        1 hour ago        440.3 MB

と、REPOSITORY、TAGがに..
しかたなく

$ docker tag e1e4ef76e658 test

とかして、使ってみましたが、Newrelicが入ってない..
Dockerfileをよくみると、リポジトリ追加後に、apt-get updateを忘れていました
追加して

$ vim Dockerfile

FROM php:5-apache
RUN a2enmod rewrite
RUN apt-get update \ 
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libjpeg-dev libmcrypt-dev wget \
  && docker-php-ext-install pdo_mysql mysqli mbstring iconv mcrypt zip \ 
  && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
  && docker-php-ext-install -j$(nproc) gd \ 
  && wget -O - https://download.newrelic.com/548C16BF.gpg | apt-key add - && \ 
    echo "deb http://apt.newrelic.com/debian/ newrelic non-free" > /etc/apt/sources.list.d/newrelic.list

RUN apt-get update && \ 
    apt-get -yq install newrelic-php5

再ビルド
$ docker build -t test .

これで、ちゃんと名前がつくようになりました

Dockerを使ってrails 5を動かしてみる

DockerとRails5を試してみました

Quickstart: Compose and Rails
をベースに行いました
dockerやdocker-composeはインストール済み、Ubuntu 14.04上で行いました

Dockerfileを用意

$ vim Dockerfile

FROM ruby:2.3.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install -j4
ADD . /myapp

Gemfileを用意します

$ vim Gemfile

source "https://rubygems.org"
gem 'rails', '>= 5.0.0.beta4', '< 5.1'

Quickstartの手順通り、Gemfile.lockを用意

$ touch Gemfile.lock

docker-compose.ymlを用意

$ vim docker-compose.yml

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

rails newしてrailsアプリを作っておりきます

$ docker-compose run web rails new . –force –database=postgresql –skip-bundle

railsアプリのファイル権限がrootになっているので、権限を変えます

$ sudo chown -R $USER:$USER .

javascriptランタイムのために、therubyracerのコメントアウト状態を解除

$ vim Gemfile

gem 'therubyracer', platforms: :ruby

railsのデータベース設定を用意

$ config/database.yml

development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test

buildして立ち上げます

$ docker-compose build
$ docker-compose up

http://(server domain):3000 にアクセス!

https://gyazo.com/a41526a2386d9c78b718cdee0dc619bb

rails5が立ち上がっています!

scaffoldして簡単に画面を作ってみます

$ docker-compose run web rails generate scaffold Article title:string
$ docker-compose run web rails db:migrate
$ docker-compose up

http://(server domain):3000/articles にアクセス!

https://gyazo.com/9da374e51b901d68da2b9f69eceddebc

できてます

このままだと docker rm でコンテナを消すとデータベースのデータが消えます

$ docker-compose run web rails db:migrate

すれば戻りますが、データベースをホスト側に保存させてみます

volumes を bind します
postgresql用のディレクトリをホスト側へ用意

$ mkdir -p datastore/postgresql

docker-compose.yml に バインドさせる設定を追記

$ vim docker-compose.yml

version: '2'
services:
  db:
    image: postgres
    volumes:
      - ./datastore/postgresql:/var/lib/postgresql/data
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

$ docker-compose build
$ docker-compose up

これでデータベースのデータもホスト側へ保存されるようになりました
ここまでくれば開発ができそうです

Dockerでvolumeの権限が変わる

Dockerでデータベースのデータを消えないようにホスト側へマウントして使おうとdocker-compose.ymlを用意

$ vim docker-compose.yml

version: '2'                                                                                                                                                                                                 
services:                                                                       
  web:                                                                          
    build: containers/web                                                       
    ports:                                                                      
      - "10080:80"                                                              
    volumes:                                                                    
      - ./www:/var/www/html                                                     
    depends_on:                                                                 
      - db                                                                      
  db:                                                                           
    build: containers/mysql                                                     
    volumes:                                                                    
      - "./datastore/mysql:/var/lib/mysql"  

$ docker-compose build
$ docker-compose up

マウントしていたディレクトリをホスト側で確認してみたら

$ ls -al /datastore/mysql

total 176160
drwxrwxr-x 5 newrelic newrelic     4096  5月  7 12:45 .
-rw-rw---- 1 newrelic newrelic       56  5月  6 16:49 auto.cnf
drwx------ 2 newrelic newrelic    12288  5月  6 19:32 database
-rw-rw---- 1 newrelic newrelic 79691776  5月  7 12:46 ibdata1
-rw-rw---- 1 newrelic newrelic 50331648  5月  7 12:46 ib_logfile0
-rw-rw---- 1 newrelic newrelic 50331648  5月  6 16:49 ib_logfile1
drwx------ 2 newrelic newrelic     4096  5月  6 16:49 mysql
drwx------ 2 newrelic newrelic     4096  5月  6 16:49 performance_schema

と、勝手にownerがnewrelicに!なんでだ、と思って権限を確認してみたら

ホスト側
$ cat /etc/passwd

newrelic:x:999:999:New Relic daemons:/opt/newrelic:/bin/false

コンテナの中
$ cat /etc/passwd

mysql:x:999:999::/home/mysql:/bin/sh

おそらくUIDで判断してるんだと..
データボリュームってのを使うとよさそうです
また今度試します

参考:
Manage data in containers

ansibleでUbuntu 14.04へDockerをインストールする

ansibleでUbuntu 14.04へDockerをインストールしてみようとPlaybookに

- name: download docker install script
  get_url: url=https://get.docker.com/ dest=~/docker.sh mode=0755

と書いて実行したらエラーが

Failed to validate the SSL certificate for get.docker.com:443. Use validate_certs=False or make sure your managed systems have a valid CA certificate installed.

とかなんとか

Getting SSL issue again · Issue #12161 · ansible/ansible
で議論されてるっぽいです

ホスト側のpython 2.7.9以上を入れないとSNIに対応してないからget_urlがこける様子
ansibleの作法からちょっと外れますが、shellでそのままいくと

- name: instal docker
  shell: "curl -fsSL https://get.docker.com/ | sh"

無事インストールされました
python上げてもいいはずです