@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 して検証していたのだけれどもっと良い方法あるのかな。