2015年12月8日火曜日

Macにhomebrewでdocker toolbox入れてredis動かしてみた

最近はやりのdockerを試したかったので、Macにhomebrewで入れてみました。

まずはhomebrewを最新にして、検索。ちゃんと出てきた。
$ brew update
$ brew search dockertoolbox
Caskroom/cask/dockertoolbox

homebrewでdockertoolboxをインストール。
一緒にvirtualboxもインストールされた。
LaunchpadにインストールされたvirtualboxとDocker Quickstart TerminalとKitematicが配置されている。
$ brew install Caskroom/cask/dockertoolbox
==> Installing brew-cask from caskroom/homebrew-cask
Error: brew-cask-0.55.0 already installed
To install this version, first `brew unlink brew-cask'
==> brew cask install Caskroom/cask/dockertoolbox
==> Satisfying dependencies
==> Installing Cask dependencies: virtualbox
virtualbox ...
==> Downloading http://download.virtualbox.org/virtualbox/5.0.10/VirtualBox-5.0.10-104061-OSX.dmg
######################################################################## 100.0%
==> Running installer for virtualbox; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
Password:
==> installer: Package name is Oracle VM VirtualBox
==> installer: Installing at base path /
==> installer: The install was successful.
🍺  virtualbox staged at '/opt/homebrew-cask/Caskroom/virtualbox/5.0.10-104061' (4 files, 87M)
done
complete
==> Downloading https://github.com/docker/toolbox/releases/download/v1.9.0d/DockerToolbox-1.9.0d.pkg
######################################################################## 100.0%
==> Running installer for dockertoolbox; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
==> installer: Package name is Docker Toolbox
==> installer: Installing at base path /
==> installer: The install was successful.
🍺  dockertoolbox staged at '/opt/homebrew-cask/Caskroom/dockertoolbox/1.9.0d' (204M)

まずはdockerを動かすホストマシンをvirtualboxに設定して作成。
$ docker-machine create --driver virtualbox default
Creating CA: /Users/xxx/.docker/machine/certs/ca.pem
Creating client certificate: /Users/xxx/.docker/machine/certs/cert.pem
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Provisioning created instance...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
To see how to connect Docker to this machine, run: docker-machine env default

作成したものはここにファイルが作られるようです
$ ls -al ~/.docker/machine/machines/default/
total 81344
drwx------  13 xxx  staff       442 11 17 12:23 .
drwx------   3 xxx  staff       102 11 17 12:22 ..
-rw-r--r--   1 xxx  staff  31457280 11 17 12:22 boot2docker.iso
-rw-r--r--   1 xxx  staff      1038 11 17 12:23 ca.pem
-rw-r--r--   1 xxx  staff      1074 11 17 12:23 cert.pem
-rw-------   1 xxx  staff      2943 11 17 12:24 config.json
drwx------   5 xxx  staff       170 11 17 12:23 default
-rw-------   1 xxx  staff  10158080 11 17 12:25 disk.vmdk
-rw-------   1 xxx  staff      1679 11 17 12:22 id_rsa
-rw-------   1 xxx  staff       381 11 17 12:22 id_rsa.pub
-rw-------   1 xxx  staff      1679 11 17 12:23 key.pem
-rw-------   1 xxx  staff      1675 11 17 12:23 server-key.pem
-rw-r--r--   1 xxx  staff      1123 11 17 12:23 server.pem

docker-machineの状態を見てみると、起動しているようです。
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   -        virtualbox   Running   tcp://192.168.99.100:2376 

次に以下のコマンドを実行する。特に何も表示はされません。
$ eval "$(docker-machine env default)"

続いてredisのコンテナイメージを持ってきます。
$ docker pull redis:3.0.5
3.0.5: Pulling from library/redis
141ed44bf003: Pull complete 
e2e4a15f0f05: Pull complete 
bde7d1a2c3f2: Pull complete 
30fde03bce2b: Pull complete 
57f91d220af6: Pull complete 
85decd8581c3: Pull complete 
dc733a1e5ab9: Pull complete 
9702d439a536: Pull complete 
1f7c80b73750: Pull complete 
f947b6a7c248: Pull complete 
9dc7228b2288: Pull complete 
53ba438d7aa7: Pull complete 
fad954217030: Pull complete 
a06a2b579a40: Pull complete 
05239cc42ab0: Pull complete 
fd59e10ac3c9: Pull complete 
7159515e5dce: Pull complete 
Digest: sha256:5b408fc3c12a800ca36ca243f9bdcc3f8efed8608572a509b7fbdcbef3e76b8c
Status: Downloaded newer image for redis:3.0.5

Dockerfileを作成します。
FROM redis:3.0.5

# log file
RUN touch /var/log/redis.log && chmod 755 /var/log/redis.log && chown redis:redis /var/log/redis.log

# conf file
ADD redis.conf /tmp/redis.conf
RUN mkdir -p -m 755 /usr/local/etc/redis && chown redis:redis /usr/local/etc/redis && cp /tmp/redis.conf /usr/local/etc/redis && chown redis:redis /usr/local/etc/redis/redis.conf && rm /tmp/redis.conf

EXPOSE 6379

CMD ["redis-server","/usr/local/etc/redis/redis.conf"]

redis.confも同じディレクトリに配置します。
vim redis.conf
適切な内容を記述

コンテナイメージを作成します。
$ docker build -t redis:3.0.5 .
Sending build context to Docker daemon 44.54 kB
Step 1 : FROM redis:3.0.5
 ---> 7159515e5dce
Step 2 : RUN touch /var/log/redis.log && chmod 755 /var/log/redis.log && chown redis:redis /var/log/redis.log
 ---> Running in afdf261202ed
 ---> 779d22d0e041
Removing intermediate container afdf261202ed
Step 3 : ADD redis.conf /tmp/redis.conf
 ---> 69591881edca
Removing intermediate container d64a9c967b0f
Step 4 : RUN mkdir -p -m 755 /usr/local/etc/redis && chown redis:redis /usr/local/etc/redis && cp /tmp/redis.conf /usr/local/etc/redis && chown redis:redis /usr/local/etc/redis/redis.conf && rm /tmp/redis.conf
 ---> Running in 9304d5f32d59
 ---> 250ea953a1a9
Removing intermediate container 9304d5f32d59
Step 5 : EXPOSE 6379
 ---> Running in 2d3f10877d3b
 ---> bec30d81d359
Removing intermediate container 2d3f10877d3b
Step 6 : CMD redis-server /usr/local/etc/redis/redis.conf
 ---> Running in 28d5ce42be84
 ---> e5d21ff31a69
Removing intermediate container 28d5ce42be84
Successfully built e5d21ff31a69

コンテナを起動する。
Unable to findとか言われてるので怪しいのだが、
ちゃんと起動していた。。。
$ docker run -d --name redis_server redis:3.0.5
Unable to find image 'redis:3.0.5' locally
3.0.5: Pulling from library/redis
141ed44bf003: Pull complete 
e2e4a15f0f05: Pull complete 
bde7d1a2c3f2: Pull complete 
30fde03bce2b: Pull complete 
57f91d220af6: Pull complete 
85decd8581c3: Pull complete 
dc733a1e5ab9: Pull complete 
9702d439a536: Pull complete 
1f7c80b73750: Pull complete 
f947b6a7c248: Pull complete 
9dc7228b2288: Pull complete 
53ba438d7aa7: Pull complete 
fad954217030: Pull complete 
a06a2b579a40: Pull complete 
05239cc42ab0: Pull complete 
fd59e10ac3c9: Pull complete 
7159515e5dce: Pull complete 
Digest: sha256:5b408fc3c12a800ca36ca243f9bdcc3f8efed8608572a509b7fbdcbef3e76b8c
Status: Downloaded newer image for redis:3.0.5
ea875fae4d9d6c70b8a4393b5d2dff0795776b3fa21eb929628d68d5b602432c

コンテナが起動していることを確認。
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2d17e74d25e2        redis:3.0.5         "/entrypoint.sh redis"   14 minutes ago      Up 14 minutes       6379/tcp            redis_server

redisに接続するため、接続するIPを調べる
$ docker-machine ip default
192.168.99.100 

telnetで接続してみたら繋がらなかった
$ telnet
telnet> open 192.168.99.100 6379          
Trying 192.168.99.100...
telnet: connect to address 192.168.99.100: Connection refused
telnet: Unable to connect to remote host
telnet> quit

コンテナを停止して削除し、ポートを指定してコンテナを再度作り直す
$ docker stop redis_server
redis_server
$ docker rm redis_server
redis_server

$ docker run -d --name redis_server -p 6379:6379 redis:3.0.5
f59a2531a0c46a780b78084c7e0b75508750d472532df62ff44b62305613d45a

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
f59a2531a0c4        redis:3.0.5         "/entrypoint.sh redis"   3 seconds ago       Up 2 seconds        0.0.0.0:6379->6379/tcp   redis_server

今度はtelnetで接続できた
$ telnet
telnet> open 192.168.99.100 6379
Trying 192.168.99.100...
Connected to 192.168.99.100.
Escape character is '^]'.
INFO
$2067
# Server
redis_version:3.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:b26e24044465030c
redis_mode:standalone
os:Linux 4.1.12-boot2docker x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.7.2
process_id:1
run_id:23e122e716026918b41998ce6cec3a4af9590fe6
tcp_port:6379
uptime_in_seconds:178
uptime_in_days:0
hz:10
lru_clock:4902862
config_file:/usr/local/etc/redis/redis.conf

# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:296832
used_memory_human:289.88K
used_memory_rss:9207808
used_memory_peak:296832
used_memory_peak_human:289.88K
used_memory_lua:36864
mem_fragmentation_ratio:31.02
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1447743260
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_current_size:0
aof_base_size:0
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

# Stats
total_connections_received:1
total_commands_processed:0
instantaneous_ops_per_sec:0
total_net_input_bytes:6
total_net_output_bytes:0
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0

# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:0.17
used_cpu_user:0.18
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace


参考URL
https://docs.docker.com/v1.8/installation/mac/
https://blog.docker.com/2015/08/docker-toolbox/
http://qiita.com/rubytomato@github/items/dd2e605706b03ad60f00

2015年12月1日火曜日

CtoCサービスの開発の裏側を公開! プロダクト責任者、CTOが全て語ります! に参加してきました

こちらのイベントに参加してきました。
CtoCサービスの開発の裏側を公開! プロダクト責任者、CTOが全て語ります!
http://connpass.com/event/22515/

メルカリ、フンザ、ココナラのCOO、CTOの方々の話を聞いたり、
実際にCtoCのサービスをやってる方々と話す機会を設けていただき、
自分もCtoCのサービスをやってる身としては、有意義な時間を過ごすことができました。

つらつらとメモったことについて、載せていきます。

◯Founderが語る、プロダクトへの想い
・メルカリ
 従業員200名(日米合計)
 半数以上がカスタマーサポート
 エンジニア、デザイナー40名(9割はアメリカ)

ローンチのときのエピソード
 開発6ヶ月
 ios/android両方
 クオリティを下げないように機能を削った
  検索ができない→想定以上に出品→ SQLのlikeでとりあえず→ちゃんと検索作る
  振り込み申請できない→ アプリのアップデートでできればよいよね

 CtoCこのモデルは最初きつい、地道にチューニングしていく。一点越えるとわーっと増えていく。

中長期の話、チャレンジしたい話
 アメリカの改修が日本に反映されたり
 メルカリのID使って、メルカリの経済圏でまわしていきたい
 BtoCでもモバイルで新しい体験を作っていきたい

会社のカルチャー
 ウノウ、mixiからの人多め
 go bold

・フンザ
 従業員23名(エンジニア5名)
 mixi子会社
 2015年9月 流通26.5億円

ローンチのときのエピソード
 チケットなので、写真がないので、人気(ひとけ)がない
 KPI2倍ルール→2倍にならないものはやらない
 退会半年間できない

   5ヶ月くらいトラフィックの波が来なかった
  転機 サマーソニックのチケットだけがやたら売買されている →恩としてサマソニに協賛(1億円)

 CtoCの機能でブーストかかるようなものはない

中長期の話、チャレンジしたい話
 スマホの中には音楽の情報がつまっている
  itunesとチケットキャンプの情報をマッチングして、プッシュしたりとか。
  位置情報とマッチングしてプッシュしたりとか。

会社のカルチャー
 少数精鋭、一人当たりの生産性、責任

・ココナラ
 従業員20名
 ユーザー数20万人、取引件数 26000/月

ローンチのときのエピソード
 クローズドベータでローンチ
  →一回作り直している wantedlyモデルw
  長い相談してると時給がさがる
   文字を制限したら非難轟々
   →作り直す
 買い気
  コミュニテイっぽい雰囲気→買える感なくなる(商品に見えない)→ボタンとかECっぽくしてみる
 プライシング
  同じ内容でも価格が違うときに適正がわからない
  わかりやすいようにワンコインで

  出品者が増えて慣れてきて窮屈になってきた→価格をあげていった

中長期の話、チャレンジしたい話
 プロダクトを作ったときのモデルを見直した。
 モデルに即した形に機能を減らしたり、fine tuningしたりしてる。
 アプリに。

会社のカルチャー
 サービスに共感してるメンバー
 難しいところが好きみたいなメンバー
 サービスを伸ばすんだという気概があるメンバー
 言いたいことを言って、それがすべてサービスのためになる会社


◯CtoCサービスの裏側
・メルカリ
プロダクト立ち上げ時のチーム体制や採用について
 最初は知り合いに声をかけてウノウのつながりやjingaのつながり
 最初のリリース時も20人いないくらい
 知り合いが知り合いを呼んで
 スキルがあるだけではだめで、文化がマッチするかどうかも含めて

利用している技術の選定
 一番自信のあるものにする
 一人で作っていくものではないので、同じレベルで開発できる人が集められる技術を使う
 PHP
 学習コストが低いもの

機能追加や機能改善の判断軸はどこに置いているか?サービス設計の思想などあれば。
 ディレクターとエンジニアが近いところにいる

会社や開発チームをまとめるためにやっていること
 全体に対して何かをやるのではなく、一人一人に対して話すことを増やしている
 10人以下なら意思疎通は簡単だが、どんどん増えてくとこうやったほうがいい

エンジニアのキャリアパスについて
 急激に成長している会社に身を置くのが大事

 どういうエンジニアがいるか
  平均年齢が高い
  10年前とかにばりばりネット企業で活躍していた

技術的に苦労した点
 そんなにない
 ゲームの方が書き込みとか多くて難しい
 CtoCは安定的に動かす、そんなに難しくない

どこまでオペレーションで済ませ、どこから自動化するかの判断のポイント
 まず手動でやることを考え、耐えられなくなったら自動化
 最初にめっちゃがんばって自動化作っても、手でやった方が早いってなるともったいない
 デフォルトは人間にがんばってもらう

・フンザ
プロダクト立ち上げ時のチーム体制や採用について
 元同僚とか紹介などつながりで。
 初めて半年で1人、1年で1人増えた
 カルチャーにマッチするかを重視

利用している技術の選定
 python django
 AWS
 MySQL
自信を持って使える技術

機能追加や機能改善の判断軸はどこに置いているか?サービス設計の思想などあれば。
 技術的負債を残さないようにしたい
  新しく入った人にがっかりさせたくない
 できませんを絶対に言わない

 納得できないことがあったら、とことん話あって、納得して仕事する

会社や開発チームをまとめるためにやっていること
 チームのモチベーションを下げることは、リーダー的な人のダブルスタンダードな振る舞い

エンジニアのキャリアパスについて
 1つの技術を極めるのが大事。自分の拠り所になる技術があるからサービスが作れたと思う
 限界を定めないことが大事。
 webからアプリにの流れは続く
 データ解析とかやれる人とかいい。

技術的に苦労した点
 どうやってユーザーの書き込みなどをエレガントに監視していくか
  禁止ワードみたいな
 普通の人がどう使っているかみたいなところが難しい

どこまでオペレーションで済ませ、どこから自動化するかの判断のポイント
 手動か自動かだけでなく、手動でやっていることをいかに短くやれるかも考慮
 手動でのエラーレートが高いものは自動化を考える

・ココナラ
プロダクト立ち上げ時のチーム体制や採用について
 基本1人でシステム作ってる
 内製にこだわる
 一部外注したり、知り合いのフリーランスにお願いしたりとか
 ないところから作っていくのを楽しめるメンバーかが重症

利用している技術の選定
PHP CakePHP
MySQL
最初に担当してたエンジニアが一番得意な言語

機能追加や機能改善の判断軸はどこに置いているか?サービス設計の思想などあれば。
 数字を見て根拠を出してやるかを検討する
 やった後にちゃんと数値を見て反省を行う

会社や開発チームをまとめるためにやっていること
 みんなが目指すべき目標を共有していく
 みんなで一緒にランチを食べるとかも意外と重要

エンジニアのキャリアパスについて
 単に人並みにできるってことがいくらあっても市場的にはつらいかな
 長い時間を培った技術などをつけて差別化していかないとつらい
 10年たっても変わらない技術などを身につけていく

技術的に苦労した点
 いかに運用コストをかけないようにまわしていくかとか。
 決済手段を幅広く用意しているが、各社思想が違うのでどうモデルに組み込んでいくかとか。

どこまでオペレーションで済ませ、どこから自動化するかの判断のポイント
 あえて管理ツールでできないようにしてるフローも残してたりする