@Konboi memo

主に技術に関してつらつらと。

docker composeのlinksの値をアプリケーションコードで使用する

はじめに

前回の記事では コマンドライン上から使ってみた。 ただ、実際はアプリケーションのコード側で使いたい場合が多い。

なので、そうするにはどうしたらいいのか調べてみた。

準備

まずは実行するための環境を作ります。

アプリを実行するコンテナを作ります

# Dockerfile

FROM ruby:latest

CMD mkdir app
ADD ./app app/
WORKDIR /app
RUN bundle install
CMD bundle exec ruby app.rb

必要なgemのインストールためのGemfile

# Gemfile

source :rubygems

gem 'redis'

( 1個しか書かないGemfileは初めてかいたかも

アプリケーションコード

# app.rb
require 'redis'

redis = Redis.new(
  :host => ENV['SERVER_PORT_6379_TCP_ADDR'],
  :port => 6379,
)

redis.set("docker", "coooool")
value = redis.get("docker")

puts value

redisに値をセットしてから取り出して表示する。 簡単なコードですね。

重要な部分は ENV['SERVER_PORT_6379_TCP_ADDR’], です。

Environment variables reference命名規則が定義されてます。

今回は name_PORT_num_protocol_ADDR

  • name は link で渡ってきている SERVER
  • num には EXPOSE されている値が入ってくる

そのため SERVER_PORT_6379_TCP_ADDR となります。

実行してみる

あとは docker-compose.yml を設定して実行するだけです

# docker-compose.yml

server:
  command: redis-server
  image: redis:2.8
app:
  build: .
  links:
    - server
$ docker-compose up

Recreating dockercomposesample_server_1...
Recreating dockercomposesample_app_1...
Attaching to dockercomposesample_server_1, dockercomposesample_app_1
server_1 | [1] 20 May 12:10:21.287 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
server_1 |                 _._
server_1 |            _.-``__ ''-._
server_1 |       _.-``    `.  `_.  ''-._           Redis 2.8.20 (00000000/0) 64 bit
server_1 |   .-`` .-```.  ```\/    _.,_ ''-._
server_1 |  (    '      ,       .-`  | `,    )     Running in stand alone mode
server_1 |  |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
server_1 |  |    `-._   `._    /     _.-'    |     PID: 1
server_1 |   `-._    `-._  `-./  _.-'    _.-'
server_1 |  |`-._`-._    `-.__.-'    _.-'_.-'|
server_1 |  |    `-._`-._        _.-'_.-'    |           http://redis.io
server_1 |   `-._    `-._`-.__.-'_.-'    _.-'
server_1 |  |`-._`-._    `-.__.-'    _.-'_.-'|
server_1 |  |    `-._`-._        _.-'_.-'    |
server_1 |   `-._    `-._`-.__.-'_.-'    _.-'
server_1 |       `-._    `-.__.-'    _.-'
server_1 |           `-._        _.-'
server_1 |               `-.__.-'
server_1 |
server_1 | [1] 20 May 12:10:21.288 # Server started, Redis version 2.8.20
server_1 | [1] 20 May 12:10:21.290 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
server_1 | [1] 20 May 12:10:21.290 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
server_1 | [1] 20 May 12:10:21.290 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
server_1 | [1] 20 May 12:10:21.359 * DB loaded from disk: 0.069 seconds
server_1 | [1] 20 May 12:10:21.360 * The server is now ready to accept connections on port 6379
app_1    | coooool
dockercomposesample_app_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping dockercomposesample_server_1...

ちゃんと coooool が表示されています

最後に

docker-compose で使っているimageを作り直すときはimageを削除してから docker-compose build して検証していたのだけれどもっと良い方法あるのかな。

docker compose を使ってみた

はじめに

実際に docker-compose を使ってみた。

今回はsampleとしてredis-serverのコンテナとredis-clientのコンテナをそれぞれたて、 client側からserverへベンチをかけてみる。

設定

# docker-compose.yml
server:
  command: redis-server
  image: redis:2.8
client:
  image: redis:2.8
  command: redis-benchmark -h server -t set -n 10000 -r 100000
  links:
    - server

結果

$ docker-compose up
Creating dockercomposesample_server_1...
Pulling image redis:2.8...
Pulling repository redis
03887134769f: Download complete
21e4345e9035: Download complete
b3d362b23ec1: Download complete
29809ed33dfd: Download complete
b720af9a6508: Download complete
c215cb712b89: Download complete
8d9a45a71a91: Download complete
8da9d27ff257: Download complete
8bd3343cbfc6: Download complete
37f5dcde0b92: Download complete
50c44c3f8567: Download complete
6286474082db: Download complete
4d2be13a8d7c: Download complete
41bec594de38: Download complete
c95d0010b5d8: Download complete
5a0b2bd2db6b: Download complete
5992cb8c188e: Download complete
Status: Downloaded newer image for redis:2.8
Creating dockercomposesample_client_1...
Attaching to dockercomposesample_server_1, dockercomposesample_client_1
server_1 | [1] 20 May 09:25:26.467 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
server_1 |                 _._
server_1 |            _.-``__ ''-._
server_1 |       _.-``    `.  `_.  ''-._           Redis 2.8.20 (00000000/0) 64 bit
server_1 |   .-`` .-```.  ```\/    _.,_ ''-._
server_1 |  (    '      ,       .-`  | `,    )     Running in stand alone mode
server_1 |  |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
server_1 |  |    `-._   `._    /     _.-'    |     PID: 1
server_1 |   `-._    `-._  `-./  _.-'    _.-'
server_1 |  |`-._`-._    `-.__.-'    _.-'_.-'|
server_1 |  |    `-._`-._        _.-'_.-'    |           http://redis.io
server_1 |   `-._    `-._`-.__.-'_.-'    _.-'
server_1 |  |`-._`-._    `-.__.-'    _.-'_.-'|
server_1 |  |    `-._`-._        _.-'_.-'    |
server_1 |   `-._    `-._`-.__.-'_.-'    _.-'
server_1 |       `-._    `-.__.-'    _.-'
server_1 |           `-._        _.-'
server_1 |               `-.__.-'
server_1 |
server_1 | [1] 20 May 09:25:26.472 # Server started, Redis version 2.8.20
server_1 | [1] 20 May 09:25:26.472 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for t
his to take effect.
server_1 | [1] 20 May 09:25:26.472 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' a
s root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
server_1 | [1] 20 May 09:25:26.472 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
server_1 | [1] 20 May 09:25:26.472 * The server is now ready to accept connections on port 6379
====== SET ======1856.68
client_1 |   10000 requests completed in 0.69 seconds                                                                                                                                                                                                                [26/2270]
client_1 |   50 parallel clients
client_1 |   3 bytes payload
client_1 |   keep alive: 1
client_1 |
client_1 | 46.05% <= 1 milliseconds

…
< 省略>
…

client_1 | 99.85% <= 88 milliseconds
client_1 | 100.00% <= 136 milliseconds
client_1 | 14409.22 requests per second
client_1 |
client_1 |
dockercomposesample_client_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping dockercomposesample_server_1...
Exception in thread Thread-1 (most likely raised during interpreter shutdown):
Traceback (most recent call last):
  File "/compose/build/docker-compose/out00-PYZ.pyz/threading", line 810, in __bootstrap_inner
  File "/compose/build/docker-compose/out00-PYZ.pyz/threading", line 763, in run
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.cli.multiplexer", line 41, in _enqueue_output
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.cli.log_printer", line 62, in _make_log_generator
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.container", line 140, in wait
  File "/compose/build/docker-compose/out00-PYZ.pyz/docker.client", line 918, in wait
  File "/compose/build/docker-compose/out00-PYZ.pyz/docker.client", line 79, in _post
  File "/compose/build/docker-compose/out00-PYZ.pyz/requests.sessions", line 425, in post
  File "/compose/build/docker-compose/out00-PYZ.pyz/requests.sessions", line 383, in request
  File "/compose/build/docker-compose/out00-PYZ.pyz/requests.sessions", line 486, in send%

こんな感じで client側からserverに接続できた。

なんで redis-benchmark -h server で接続できるのか

というとclient側の/etc/hosts

172.17.1.11  b799fcf887da
127.0.0.1    localhost
::1          localhost ip6-localhost ip6-loopback
fe00::0      ip6-localnet
ff00::0      ip6-mcastprefix
ff02::1      ip6-allnodes
ff02::2      ip6-allrouters

172.17.1.9   dockercomposesample_server_1 f27c07cbc850
172.17.1.9   server f27c07cbc850 dockercomposesample_server_1
172.17.1.9   server_1 f27c07cbc850 dockercomposesample_server_1

が設定されているので server という値で接続できるようになっている。

figあらためdocker-composeのインストール

はじめに

figに関しては下記の記事が参考になると思います

ただfigは昨年、docker社が買収し 、現在は Docker Compose となった模様です

img

ということで figあらためdocker-compose をインストールしてみたのでそれのメモです

インストール

公式サイト にインストール方法が書かれているのでそれに沿ってインストールしてみます

現在の最新版は 1.2.0 が最新の用です

公式では /usr/local/bin/ 以下にダウンロードしていますが、今回は ~/bin/ 以下にダウンロードしてみます。

$ curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-`uname -s`-`uname -m` > ~/bin/docker-compose
$ chmod +x ~/bin/docker-compose
$ docker-compose —version
docker-compose 1.2.0

特に問題なくインストールできました

boot2docker の https での通信をoff にする

はじめに

dockerをdockerコマンドではなくライブラリを使って接続しようとしたときにhttpsの認証周りが上手くできなかったので色々やってみました。

前提条件

  • boo2docker, docker は homebrew を使ってインストールしています
  • dockerコマンド経由だったらhttpsでも特に問題なかったです
$ boot2docker version
Boot2Docker-cli version: v1.6.1
Git commit: 076b58d

$ docker version
Client version: 1.6.1
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 97cd073
OS/Arch (client): darwin/amd64

設定

結論から言うとboot2dockerで起動されたubuntu内の設定ファイルに追記してあげればhttpで通信できました。

設定ファイルを更新

boot2docker ssh
sudo su - 
vi /var/lib/boot2docker/profile
# pofile

DOCKER_TLS=no

を追記して から boot2docker restart することで httpで通信できました

ただ、それまで問題なく動いていたdocker コマンドの挙動がおかしくなったのであまりオススメはできません。

他にもやり方があったら教えて欲しいです。

ワイルドスピード スカイミッションを見た

GWの締めにとワイルドスピード スカイミッションを見た。

IMAX 3D で見たけど、映画の内容と相まってすごい迫力で非常によかった。

ネタバレになるからあまり書かないけど、ほんとに出演者のポール・ウォーカーさんが亡くなったんだなってつらくなった。

次回作もやるらしいが、どういう展開になるのだろうか。

若手Webエンジニア交流会 #9 で発表しました #wakateweb

はじめに

運営していただいた方々、非常に楽しい時間を過ごせました!

そして、会場提供していただいた、SmartNewsさんありがとうございました。 オフィス見学もさせていただき非常に綺麗なオフィスで羨ましかったです!!

発表資料

こちら発表になります

サンプルのレポジトリはこちらになります。

Konboi/docker-practice · GitHub

発表の補足

現在のチームではdevサーバーのDB ServerにRDSを使用していています。

新しいbranchで開発環境を立てるときはstg環境からdbをdumpして新規DB作ってmaster branch に merge されたら該当のDBを削除するというような運用をしています。

その他必要なことも docker_run.sh でごにょごにょやっています。

まとめ

docker x mirage で快適な開発環境を導入してみてはいかがでしょうか?

旅する勉強会 #0 運用x効率化の話をしました

はじめに

旅する勉強会ってなんぞやという方はこちらの記事をご覧ください

旅する勉強会 - tech.kayac meetup #0 を開催します

発表資料

資料です

感想

当日は社外で発表するという経験がないので緊張し早口になってしまい、聞きづらい発表になってしまったかと思います。 すいませんm( )m

運用してると不具合は出てしまうものですが、不具合が出るとチームの雰囲気も良くはなくなるし、補填処理とか色々とやらないといけない作業が発生してしまうので少なくなるにこしたことはありません。

運用してた経験からどうやって防いできたかというのが伝わってくれれば幸いです。

〇〇はどうしてる?? 等々聞きたい事あれば勉強会などで声をかけていただければと思います。