• このエントリーをはてなブックマークに追加


お手本

を基に,ベースを ubuntu:13.04 としてビルドしてみる練習.イメージ名は test/nodejs_app

ファイル構成を準備する

構成

$ cd ~/tmp/nodejs_app
$ tree
.
├── Dockerfile
└── src
    ├── index.js
    └── package.json
 
1 directory, 3 files

アプリケーション関連

index.jspackage.json はチュートリアルのとおり.(express のバージョンだけ 4.0.0 に変更しています.)

Dockerfile

Dockerfile はとりあえずこんな感じ:

# DOCKER-VERSION 0.10.0
FROM ubuntu:13.04
RUN  apt-get update
RUN  apt-get install -y curl
RUN  mkdir /tmp/node; cd /tmp/node; curl -L "http://nodejs.org/dist/v0.10.26/node-v0.10.26-linux-x64.tar.gz" | tar zxf -
RUN  if [ ! -d /usr/local/bin ]; then mkdir /usr/local/bin; fi; cp -v /tmp/node/node-v0.10.26-linux-x64/bin/node /usr/local/bin/node
RUN  curl -L "https://www.npmjs.org/install.sh" | clean=no sh
RUN  ldconfig
 
ADD  ./src /src
RUN  cd /src; npm install
 
EXPOSE  8080
CMD [ "node", "/src/index.js" ]

RUN する内容がふくれてきた場合は,シェルスクリプトとかに落としこんで,それを ADD して RUN bash /script/foo.sh みたいにすればすっきりするでしょうか.

ビルドする!

$ sudo docker build -t test/nodejs_app:bar .
Uploading context  72.7 kB
Uploading context
Step 0 : FROM    ubuntu:13.04
 ---> ab4344e23e3a
Step 1 : RUN     apt-get update
 ---> Running in 211a196ce52b
Hit http://archive.ubuntu.com raring Release.gpg
...
Hit http://archive.ubuntu.com raring-security/universe amd64 Packages
Reading package lists...
 ---> 8a247da1250e
Step 2 : RUN     apt-get install -y curl
 ---> Running in 033260120f50
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
...
Running hooks in /etc/ca-certificates/update.d....done.
 ---> a13ba87694ea
Step 3 : RUN     mkdir /tmp/node; cd /tmp/node; curl -L "http://nodejs.org/dist/v0.10.26/node-v0.10.26-linux-x64.tar.gz" | tar zxf -
 ---> Running in 77f96b1eeef2
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 5190k  100 5190k    0     0  1549k      0  0:00:03  0:00:03 --:--:-- 1560k
 ---> 794382b45dac
Step 4 : RUN     if [ ! -d /usr/local/bin ]; then mkdir /usr/local/bin; fi; cp -v /tmp/node/node-v0.10.26-linux-x64/bin/node /usr/local/bin/node
 ---> Running in 7e3febdb7802
'/tmp/node/node-v0.10.26-linux-x64/bin/node' -> '/usr/local/bin/node'
 ---> 8e195c75dd5e
Step 5 : RUN     curl -L "https://www.npmjs.org/install.sh" | clean=no sh
 ---> Running in 42bddedda16c
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6711  100  6711    0     0  19219      0 --:--:-- --:--:-- --:--:-- 21648
tar=/bin/tar
...
install npm@latest
fetching: http://registry.npmjs.org/npm/-/npm-1.4.6.tgz
0.10.26
1.4.6
Skipping 0.x cruft clean
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@1.4.6 /usr/local/lib/node_modules/npm
It worked
 ---> 6df4401438df
Step 6 : RUN     ldconfig
 ---> Running in d3b1d42030e9
 ---> b11e4f73888f
Step 7 : ADD  ./src /src
 ---> fd41aca555a4
Step 8 : RUN  cd /src; npm install
 ---> Running in 74048f492be8
npm http GET https://registry.npmjs.org/express/4.0.0
npm http 200 https://registry.npmjs.org/express/4.0.0
...
express@4.0.0 node_modules/express
├── methods@0.1.0
├── parseurl@1.0.1
...
├── accepts@1.0.0 (mime@1.2.11, negotiator@0.3.0)
└── serve-static@1.0.1 (send@0.1.4)
 ---> 9367e551873d
Step 9 : EXPOSE  8080
 ---> Running in 490f24363506
 ---> 71870cdca344
Step 10 : CMD [ "node", "/src/index.js" ]
 ---> Running in 2549cebac77c
 ---> c465062641f5
Successfully built c465062641f5
Removing intermediate container 77f96b1eeef2
Removing intermediate container 7e3febdb7802
Removing intermediate container 3b6ec29995a9
Removing intermediate container 211a196ce52b
Removing intermediate container 033260120f50
Removing intermediate container 42bddedda16c
Removing intermediate container d3b1d42030e9
Removing intermediate container 74048f492be8
Removing intermediate container 490f24363506
Removing intermediate container 2549cebac77c

ビルド完了.

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test/nodejs_app     bar                 c465062641f5        19 minutes ago      230.9 MB
...

イメージができあがりました.

ステップごとのキャッシュ?

そういえば,「成功したステップはキャッシュされる」って,clairvy さんが このあたりのエントリ 書いてたときに言ってた気がします.

確かに,apt-get update のステップとか再ビルドの時とか発動しなかった感じです.(あとで調べたら,--no-cache ってオプションがあり,まぁその名のとおりですね.)

ビルドしたイメージからコンテナを起動する

コンテナを起動する

このあたりはチュートリアルに従って:

$ sudo docker run -p 49160:8080 -d test/nodejs_app
5202d212e7b73b73ede8ff8297b1386448525f0a74c634acf49dfa510daf185b
$ sudo docker ps
CONTAINER ID        IMAGE                    COMMAND              CREATED             STATUS              PORTS                     NAMES
5202d212e7b7        test/nodejs_app:latest   node /src/index.js   14 seconds ago      Up 14 seconds       0.0.0.0:49160->8080/tcp   lonely_wozniak

HTTP リクエストする

$ curl http://localhost:8080/
curl: (7) couldn't connect to host

これは間違いw

$ curl http://localhost:49160/
Hello World

きました.

コンテナに IP アドレスを割り当てて HTTP リクエストしてみる

前エントリ で練習した Pipework を,ここで使ってみます.192.168.10.10 として割り当てた後,http://192.168.10.10:8080/ へリクエストしてみます:

$ sudo pipework br1 5202d212e7b7  192.168.10.10/24
$ curl http://192.168.10.10:8080/
Hello World

期待どおりの結果が得られました.

  • このエントリーをはてなブックマークに追加


参考

ポイントは,次の 2点になるでしょうか:

  • Pipework でブリッジを追加する & ゲストへの IP アドレスを割り当てる
  • ホストのブリッジに IP アドレスを割り当てる

ホスト OS の環境

さくらの VPS,Ubuntu 12.04.

インタフェイス eth0 はこんな感じ:

$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet ***.***.***.***/23 brd ***.***.***.255 scope global eth0
    inet6 ****::****:***:***1:****/64 scope link
       valid_lft forever preferred_lft forever

参考サイトのとおりに進めてみる

Pipework を入れる

$ cd /usr/local/src
$ sudo git clone https://github.com/jpetazzo/pipework.git
Cloning into 'pipework'...
remote: Reusing existing pack: 134, done.
remote: Total 134 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (134/134), 36.66 KiB, done.
Resolving deltas: 100% (68/68), done.
$ sduo ln -sv /usr/local/src/pipework/pipework /usr/local/bin/
`/usr/local/bin/pipework' -> `/usr/local/src/pipework/pipework'
$ sudo pipework
Syntax:
pipework <hostinterface> [-i containerinterface] <guest> <ipaddr>/<subnet>[@default_gateway] [macaddr]
pipework <hostinterface> [-i containerinterface] <guest> dhcp [macaddr]
pipework --wait

Pipework 実行時にエラー?

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0c563183d391        base:latest         /bin/bash           7 minutes ago       Up 7 minutes                            backstabbing_kowalevski
$ sudo pipework br1 0c563183d391 192.168.1.10/24
/usr/local/bin/pipework: line 152: brctl: command not found

brctl というものがないらしい.

bridge-utils パッケージを入れればよいらしい.

$ sudo apt-get -y install bridge-utils
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  python-central libvncserver0 libgsoap1
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
  bridge-utils
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 32.0 kB of archives.
After this operation, 142 kB of additional disk space will be used.
Get:1 http://jp.archive.ubuntu.com/ubuntu/ precise-updates/main bridge-utils amd64 1.5-2ubuntu7 [32.0 kB]
Fetched 32.0 kB in 0s (141 kB/s)
Selecting previously unselected package bridge-utils.
(Reading database ... 106135 files and directories currently installed.)
Unpacking bridge-utils (from .../bridge-utils_1.5-2ubuntu7_amd64.deb) ...
Processing triggers for man-db ...
Setting up bridge-utils (1.5-2ubuntu7) ...
$ sudo pipework br1 0c563183d391 192.168.1.10/24
Warning: arping not found; interface may not be immediately reachable

さらに 「arping がない」と言われるので,これも入れる.

$ sudo apt-get -y install arping
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  python-central libvncserver0 libgsoap1
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  libnet1
The following NEW packages will be installed:
  arping libnet1
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 75.3 kB of archives.
After this operation, 267 kB of additional disk space will be used.
Get:1 http://jp.archive.ubuntu.com/ubuntu/ precise/main libnet1 amd64 1.1.4-2.1 [49.4 kB]
Get:2 http://jp.archive.ubuntu.com/ubuntu/ precise/universe arping amd64 2.09-2 [25.9 kB]
Fetched 75.3 kB in 0s (164 kB/s)
Selecting previously unselected package libnet1.
(Reading database ... 106160 files and directories currently installed.)
Unpacking libnet1 (from .../libnet1_1.1.4-2.1_amd64.deb) ...
Selecting previously unselected package arping.
Unpacking arping (from .../arping_2.09-2_amd64.deb) ...
Processing triggers for man-db ...
Setting up libnet1 (1.1.4-2.1) ...
Setting up arping (2.09-2) ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place

気を取り直して

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2aa3698efed5        base:latest         /bin/bash           7 seconds ago       Up 6 seconds                            silly_fermat
$ sudo pipework br1 2aa3698efed5 192.168.1.21/24

エラー・警告がなくなりました.

割り当て前後におけるコンテナの ifconfig を比較してみる

before:

root@2aa3698efed5:/# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 96:6e:8c:76:0e:ef
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::946e:8cff:fe76:eef/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:5 errors:0 dropped:2 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:378 (378.0 B)  TX bytes:468 (468.0 B)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

after:

root@2aa3698efed5:/# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 96:6e:8c:76:0e:ef
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::946e:8cff:fe76:eef/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:5 errors:0 dropped:2 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:378 (378.0 B)  TX bytes:468 (468.0 B)
 
eth1      Link encap:Ethernet  HWaddr 7a:46:04:45:de:a9
          inet addr:192.168.1.21  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::7846:4ff:fe45:dea9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:468 (468.0 B)  TX bytes:510 (510.0 B)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

インタフェイス eth1 が追加され,その IP アドレスが指定したものになりました.

ホスト側のブリッジに IP アドレスを割りてる

$ sudo ip addr add 192.168.1.254/24 dev br1

これは特に問題なく.

しかし,ping 192.168.1.21 してもうまくいかず,原因を調べられるほどネットワークの知識もなく,いったん中断.

とりあえずつながった

いくらか試行錯誤?して,割り当てる IP アドレスを 192.168.1.* でないものにしたところ,とりあえず ping が通ったので,そのあたりを記録しておきます.

先の 192.168.1.21 に代わり,192.168.10.21 を割り当ててみます:

$ sudo pipework br1 ... 192.168.10.21/24
$ sudo ip addr add 192.168.10.1/24 dev br1

こうしたら ping が通りました...

コンテナをもうひとつ立ち上げて,192.168.10.22 を割り当ててみます:

$ sudo pipework br1 ... 192.168.10.22/24

ホスト → 2台目ゲスト,1台目ゲスト・2台目ゲスト間,いずれも ping が通りました.

  • このエントリーをはてなブックマークに追加


現象とその対策

VirtualBox を 4.3.8 から 4.3.10 に上げてから,以前のエントリ のような環境下で生成した vagrant box を up すると,次のようなエラーが出るようになりました:

% cd /path/to/myproj/vm/mysql
% vagrant up
...
GuestAdditions 4.3.10 running --- OK.
==> server: Checking for guest additions in VM...
==> server: Setting hostname...
==> server: Configuring and enabling network interfaces...
==> server: Mounting shared folders...
    server: /vagrant => /path/to/myproj/vm/mysql
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:
 
mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` /vagrant /vagrant

エラーメッセージとかで検索したところ,次が目に入りました:

vagrant@projectX:~$ sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions

https://gist.github.com/AubreyHewes/9889323#file-gistfile1-sh-L31

GuestAdditions 関連のライブラリが適切な場所にない(?)ことが原因で,シンボリックリンクを張っておけば OK,ってことですかね.

Packer の provisioner に追記

...
    "provisioners": [
        {
            "type": "shell",
            "execute_command": "echo 'vagrant' | {{.Vars}} sudo -E -S sh '{{.Path}}'",
            "scripts": [
                ...
                "provisioners/_/vbox.sh",
                ...
            ]
        }
    ],
...

このスクリプトで VirtualBox GuestAdditions をインストールするまわりのことをしている(veewee が生成したのを拝借してるだけ)ので,これに次を追記しました:

# ref: https://gist.github.com/AubreyHewes/9889323
if [ ! -d /usr/lib/VBoxGuestAdditions ]; then
    ln -s /opt/VBoxGuestAdditions-$VBOX_VERSION/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions
fi

vbox.sh 全体のスクリプトは次のような感じ:

# Without libdbus virtualbox would not start automatically after compile
apt-get -y install --no-install-recommends libdbus-1-3
 
# Remove existing VirtualBox guest additions
/etc/init.d/virtualbox-ose-guest-utils stop
rmmod vboxguest
aptitude -y purge virtualbox-ose-guest-x11 virtualbox-ose-guest-dkms virtualbox-ose-guest-utils
aptitude -y install dkms
 
# Install the VirtualBox guest additions
VBOX_VERSION=$(cat /home/vagrant/.vbox_version)
VBOX_ISO=VBoxGuestAdditions_$VBOX_VERSION.iso
mount -o loop $VBOX_ISO /mnt
yes|sh /mnt/VBoxLinuxAdditions.run
umount /mnt
 
# ここを追加!
# ref: https://gist.github.com/AubreyHewes/9889323
if [ ! -d /usr/lib/VBoxGuestAdditions ]; then
    ln -s /opt/VBoxGuestAdditions-$VBOX_VERSION/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions
fi
 
# Cleanup
rm $VBOX_ISO

再度 vagrant up

現在の VM を棄てて,改めて Packer で生成した box を add しなおして,再度 up:

% cd /path/to/myproj/vm/mysql
% vagrant destroy
...
% vagrant box add --name myproj.mysql --force ...
...
% vagrant up
Bringing machine 'server' up with 'virtualbox' provider...
==> server: Importing base box 'myproj.mysql'...
==> server: Matching MAC address for NAT networking...
==> server: Setting the name of the VM: myproj-dev.mysql
==> server: Clearing any previously set network interfaces...
==> server: Preparing network interfaces based on configuration...
    server: Adapter 1: nat
    server: Adapter 2: bridged
==> server: Forwarding ports...
    server: 22 => 2222 (adapter 1)
    server: 22 => 55022 (adapter 1)
    server: 3306 => 55306 (adapter 1)
==> server: Running 'pre-boot' VM customizations...
==> server: Booting VM...
==> server: Waiting for machine to boot. This may take a few minutes...
    server: SSH address: 127.0.0.1:2222
    server: SSH username: vagrant
    server: SSH auth method: private key
    server: Error: Connection timeout. Retrying...
==> server: Machine booted and ready!
GuestAdditions 4.3.10 running --- OK.
==> server: Checking for guest additions in VM...
==> server: Setting hostname...
==> server: Configuring and enabling network interfaces...
==> server: Mounting shared folders...
    server: /vagrant => /path/to/myproj/vm/mysql
==> server: Running provisioner: shell...
    server: Running: /var/folders/vk/959p08hd1fxckylcr4gcflm80000gn/T/vagrant-shell20140408-12599-1yptuwn
...

shared folder に関するエラーなし!

念のため中を覗いてみます:

% vagrant ssh
Welcome to Ubuntu 13.04 (GNU/Linux 3.8.0-19-generic x86_64)
 
 * Documentation:  https://help.ubuntu.com/
Your Ubuntu release is not supported anymore.
For upgrade information, please visit:
http://www.ubuntu.com/releaseendoflife
 
New release '13.10' available.
Run 'do-release-upgrade' to upgrade to it.
 
Last login: Tue Apr  8 13:50:35 2014 from 10.0.2.2
vagrant@myproj-mysql-vm-dev:~$ ls -l /usr/lib/VBoxGuestAdditions
lrwxrwxrwx 1 root root 53 Apr  8 13:21 /usr/lib/VBoxGuestAdditions -> /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions
vagrant@myproj-mysql-vm-dev:~$ ls /vagrant/
Vagrantfile  etc  home  provisioner
vagrant@myproj-mysql-vm-dev:~$

大丈夫っぽい!

  • このエントリーをはてなブックマークに追加


メモ

ss-1396406023

ER図を書くこと,そこから “Synchronize Model with Database” で稼働中のデータベースとの差分 SQL を拾うこと,それだけのために MySQLWorkbench を使っております.

先ほど 6.1.4 が出ていることに気づいたので,早速入れてみました.

で,問題.冒頭のスクリーンショットのいちばん下の行,NULL: 有効, 非NULL: 無効 というコメントですが,コメントの途中に /* comment trancated */ が挿入され,その後がおかしくなっています.しかも,このような部分を含む文字列は,クリップボードへコピーされないみたい. “Copy to Clipboard” ボタンを押してもだw (含めないように選択すればコピーは可能です.)

取り急ぎ,変更前の 6.0.9 に戻すとします.

  • このエントリーをはてなブックマークに追加


2014-03-29 のときのログ.

雨沢峠

記録区間については次を参考:

今回は「インナー 3速」というよくわからない縛りで走ってみました.

バイクタイム: 24:42
停止時間: 0:00
距離: 6.21 km
平均: 時速 15.08 km
最高スピード: 時速 28.77 km
登り: 312 メートル
降り: 0 メートル

何を思ったか同じ縛りでもう 1回上ってみました.足がもうヤバスw:

バイクタイム: 27:30
停止時間: 0:00
距離: 6.22 km
平均: 時速 13.56 km
最高スピード: 時速 24.44 km
登り: 310 メートル
降り: 0 メートル

まずはコンスタントに 25分を切れるようになるところから.

その他のルート

出発 〜 雨沢峠スタート地点:

バイクタイム: 1:03:27
停止時間: 1:24
距離: 23.02 km
平均: 時速 21.77 km
最高スピード: 時速 48.77 km
登り: 258 メートル
降り: 166 メートル

下って近くのファミマでポカリを補充して再度スタート地点まで:

バイクタイム: 17:45
停止時間: 0:00
距離: 7.79 km
平均: 時速 26.32 km
最高スピード: 時速 52.93 km
登り: 60 メートル
降り: 362 メートル

2本目を終えて帰り:

バイクタイム: 48:44
停止時間: 0:00
距離: 20.25 km
平均: 時速 24.93 km
最高スピード: 時速 55.98 km
登り: 84 メートル
降り: 510 メートル

おわりに

合わせて 60km ちょっと,でした.

現在,足よりも上半身が筋肉痛です><

1 of 11712345...102030...117