forestec

勉強した内容をつらつらと備忘録として記していきます。

docker-composeを使ってみる

docker-composeを使っての環境構築を行なってみたのでその備忘録。

環境

構築する環境は以下。

  • Python3.7.1
  • Redis5.0.2

Dockerfileの作成

Python用のDockerfileを作成します。

FROM python:3.7

RUN pip install redis
RUN pip install hiredis

installしてるのはredishiredisのみです。
必要なものがあれば適宜追記で。

docker-compose.ymlの作成

docker-compose.ymlを以下のように作成します。

version: '2'
services:
  app:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app
    links:
      - redis
    depends_on:
      - redis
    tty: true
  redis:
    restart: always
    image: redis:5.0.2
    volumes:
      - ./data/redis:/data
    command: redis-server --appendonly yes

serviceとしてappredisを記載しています。

app

  • build:
    上記で作成したDockerfileのパスを指定します。

  • ports:
    右側にコンテナ内で使用するポート、左側にそれとマッピングさせるホストのポートを指定します。
    ホストのポートを指定しない場合はランダムで割り振られるようです。

  • volumes:
    コンテナ内のディレクトリをマウントする際に指定します。
    今回は/appをマウントしています。
    左側にはホストのディレクトリを指定。

  • links:
    PythonからRedisを使用出来るようにredisを記載しています。

  • depends_on:
    serviceの依存関係を指定します。
    appより先にredisが立ち上がるようにしています。

  • tty:
    ポート待受とかしていないコンテナの場合、docker-compose upで起動してもすぐに終了してしまいます。
    ttyをtrueに設定しておくことでコンテナが起動し続けます。

redis

  • restart:
    OSの起動時にコンテナを自動起動させるためにalwaysを指定しています。

  • image:
    Dockerイメージを記載。
    redis:5.0.2を指定しています。

  • volumes:
    /dataをマウントすることでデータを永続化させることが出来るようです。

  • command:
    command:を指定することでデフォルトのコマンドの書き換えを行っています。
    --appendonly yesを指定しないとデータが作られないようです。

ビルド

作成したdocker-compose.ymlをビルド

$ docker-compose build

最後にSuccessfullyと表示されていればOK。

起動

$ docker-compose up

これでPython、Redisの各コンテナが立ち上がれば構築完了

動作確認

まずはRedisコンテナに入って確認します。

$ docker exec -it [コンテナ名、またはコンテナID] /bin/bash

コンテナに入れたらredis-cliを使用してみます。

$ redis-cli
127.0.0.1:6379> SET test test
OK
127.0.0.1:6379> GET test
"test"
127.0.0.1:6379>

次はPythonからRedisに接続してみます。 Redisコンテナで以下のコマンドを実行してIPを取得します。

$ hostname -i
172.20.0.2

以下のapp.pyファイルを作成

import redis

# Redisに接続
pool = redis.ConnectionPool(host='172.20.0.2', port=6379, db=0)
r = redis.StrictRedis(connection_pool=pool)

r.set('key', 'value')
print(r.get('key'))

hostに上記で調べたIPを設定。
app.pyを実行。

$ python app.py
b'value'

PythonからもRedisが実行出来ることが確認できました。
これで完了です。