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してるのはredis
とhiredis
のみです。
必要なものがあれば適宜追記で。
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
としてapp
とredis
を記載しています。
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が実行出来ることが確認できました。
これで完了です。