Redis + Python を Docker で試す (CentOS)

2019-02-02

Redis は、Docker Hub の Redis 公式イメージを使ってみる。

● Redis の実行

redis - Docker Hub に書いてあることほぼそのまま。

おそらく最も簡単な実行方法は.. (初回は Docker イメージがダウンロードされる)

[nsmrtks@app-tmp ~]$ docker run --rm redis
1:C 26 Dec 2018 06:47:37.125 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 26 Dec 2018 06:47:37.125 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 26 Dec 2018 06:47:37.125 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 26 Dec 2018 06:47:37.127 * Running mode=standalone, port=6379.
1:M 26 Dec 2018 06:47:37.127 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 26 Dec 2018 06:47:37.127 # Server initialized
1:M 26 Dec 2018 06:47:37.127 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_me
mory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 26 Dec 2018 06:47:37.127 # 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.
1:M 26 Dec 2018 06:47:37.127 * Ready to accept connections

Redis の Docker コンテナがフォアグラウンドで起動した。

Ctrl-C を押すと終了する。 (--rm を指定したのでコンテナも rm される)

^C1:signal-handler (1545807039) Received SIGINT scheduling shutdown...
1:M 26 Dec 2018 06:50:39.522 # User requested shutdown...
1:M 26 Dec 2018 06:50:39.522 * Saving the final RDB snapshot before exiting.
1:M 26 Dec 2018 06:50:39.529 * DB saved on disk
1:M 26 Dec 2018 06:50:39.529 # Redis is now ready to exit, bye bye...

もう少し一般的な実行方法は、Docker Hub の例にもあるように、detach (-d) する。
ついでにコンテナ名も指定しておく (--name)。

[nsmrtks@app-tmp ~]$ docker run --name some-redis -d redis
48e5f06d07511f27c37544880a0dbb4385cea320c9cd700b63ba11a5f8184919

[nsmrtks@app-tmp ~]$ docker ps
CONTAINER ID        IMAGE	〜	COMMAND                  CREATED             STATUS              PORTS		〜	NAMES
48e5f06d0751        redis       〜	"docker-entrypoint.s…"	 27 seconds ago      Up 26 seconds       6379/tcp	〜	some-redis
〜

docker logs で、フォアグラウンドのときと同じメッセージが表示できる。

[nsmrtks@app-tmp ~]$ docker logs some-redis
1:C 26 Dec 2018 06:55:56.934 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 26 Dec 2018 06:55:56.934 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 26 Dec 2018 06:55:56.934 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 26 Dec 2018 06:55:56.935 * Running mode=standalone, port=6379.
1:M 26 Dec 2018 06:55:56.935 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 26 Dec 2018 06:55:56.935 # Server initialized
1:M 26 Dec 2018 06:55:56.935 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_me
mory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 26 Dec 2018 06:55:56.935 # 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.
1:M 26 Dec 2018 06:55:56.936 * Ready to accept connections

Redis をコマンドラインから試すのに、redis-cli というツールがある。 これを Docker Hub の公式 Redis では、先ほどの some-redis に対し、もう 1個コンテナを立ち上げると利用することが出来る。

やはり Docker Hub の例にあるように、docker run に --link を指定してみる。 (docker-compose や Swarm Mode を使ってアクセスすることも出来るだろう)

[nsmrtks@app-tmp ~]$ docker run -it --link some-redis:sider --rm redis redis-cli -h sider -p 6379
sider:6379> 

● redis-cli の試行

登録されているキーを全て表示する。 まだ何もない。

sider:6379> keys *
(empty list or set)

キーに値(文字列)を設定する。

sider:6379> set yourname Mitsuha
OK

再び keys * を実行すると、キーが表示された。

sider:6379> keys *
1) "yourname"

キーを指定して値(文字列)を表示する。 先ほど設定した値が表示された。

sider:6379> get yourname
"Mitsuha"

● Python からの操作

以下などを参考に..

PythonでRedisを扱う(redis-pyの基本) - [Dd]enzow(ill)? with DB and Python
PythonでRedisを参照・更新する - け日記
Welcome to redis-py’s documentation! — redis-py 2.10.5 documentation

今度は、以下のような docker-compose.yaml ファイルを用意してみる。 これを、例えば redispy などというディレクトリに置く。

version: "3.2"
services:
  python:
    build:
      context: .
    depends_on:
      - redis
    tty: true
  redis:
    image: redis

同じディレクトリに、以下のような Dockerfile (「python」イメージ用) と..

FROM centos:7

RUN \
 yum -y install epel-release ;\
 yum -y install python2-pip ;\
 rm -fr /var/cache/yum ; yum clean all

RUN pip install redis

COPY /test.py /

ENTRYPOINT python /test.py

以下のような test.py ファイルを置く。

import redis

# sr = redis.StrictRedis(host='redis', port=6379, db=0)
pool = redis.ConnectionPool(host='redis', port=6379, db=0)
sr = redis.StrictRedis(connection_pool=pool)

print(sr.get('yourname'))

sr.set('yourname', 'Mitsuha')

print(sr.get('yourname'))

docker-compose がインストールされていることが必要である。 (docker-compose をインストールした覚書 を参照)

redispy ディレクトリにて、以下のように実行する。

[nsmrtks@app-tmp redispy]$ docker-compose build
〜

この状態で、以下のように実行すると、test.py が実行され結果が表示された。 (pytyhon test.py を実行した「python」コンテナは直後に終了する)

[nsmrtks@app-tmp redispy]$ docker-compose up
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done
Attaching to redispy_redis_1, redispy_python_1
redis_1   | 1:C 27 Dec 2018 07:45:28.992 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1   | 1:C 27 Dec 2018 07:45:28.992 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1   | 1:C 27 Dec 2018 07:45:28.992 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1   | 1:M 27 Dec 2018 07:45:28.994 * Running mode=standalone, port=6379.
redis_1   | 1:M 27 Dec 2018 07:45:28.994 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1   | 1:M 27 Dec 2018 07:45:28.994 # Server initialized
redis_1   | 1:M 27 Dec 2018 07:45:28.994 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_me
mory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1   | 1:M 27 Dec 2018 07:45:28.994 # 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.
redis_1   | 1:M 27 Dec 2018 07:45:28.994 * Ready to accept connections
python_1  | None
python_1  | Mitsuha
redispy_python_1 exited with code 0

Ctrl-C を押すと、docker-compose が終了する。

^CGracefully stopping... (press Ctrl+C again to force)
Stopping redispy_redis_1  ... done

さらに以下のように実行すると、コンテナが終了 (stop → rm) する。

[nsmrtks@app-tmp redispy]$ docker-compose down
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

あるいは、以下のように detach させて実行する。

[nsmrtks@app-tmp redispy]$ docker-compose up -d
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done

「python」コンテナはすぐに終了するが..

[nsmrtks@app-tmp redispy]$ docker ps -a
CONTAINER ID        IMAGE               〜 COMMAND                  CREATED             STATUS                      PORTS       〜 NAMES
5b150c3eb056        redispy_python      〜 "/bin/sh -c 'python …"  30 seconds ago      Exited (0) 29 seconds ago               〜 redispy_python_1
5978e5574785        redis               〜 "docker-entrypoint.s…"  31 seconds ago      Up 30 seconds               6379/tcp    〜 redispy_redis_1

以下のように実行結果を表示させることが出来る。

[nsmrtks@app-tmp redispy]$ docker logs redispy_python_1
None
Mitsuha

確認したので、コンテナを終了させる。

[nsmrtks@app-tmp redispy]$ docker-compose down
Stopping redispy_redis_1 ... done
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

もし、先ほどの Dockerfile の ENTRYPOINT の行をコメントアウトしておくと、python /test.py は実行されないが、「python」コンテナは終了しなくなる (docker-compose.yaml で「python」について「tty: true」の効果)。

〜

#ENTRYPOINT python /test.py

そうしたら、いまいちど以下などのように実行し..

[nsmrtks@app-tmp redispy]$ docker-compose build
redis uses an image, skipping
Building python
〜
Successfully built a09e9eea8231
Successfully tagged redispy_python:latest

[nsmrtks@app-tmp redispy]$ docker-compose up -d
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done

[nsmrtks@app-tmp redispy]$ docker ps
CONTAINER ID        IMAGE               〜 COMMAND                  CREATED              STATUS              PORTS      〜 NAMES
8835c72c36a9        redispy_python      〜 "/bin/bash"              About a minute ago   Up About a minute              〜 redispy_python_1
b4d40d8f38c2        redis               〜 "docker-entrypoint.s…"  About a minute ago   Up About a minute   6379/tcp   〜 redispy_redis_1

以下のようにすれば「python」コンテナの中に入って実行することが出来る。

[nsmrtks@app-tmp redispy]$ docker exec -it redispy_python_1 bash
[root@8835c72c36a9 /]# python /test.py
None
Mitsuha
[root@8835c72c36a9 /]# python /test.py
Mitsuha
Mitsuha

最後は、やはり以下のようにコンテナを終了させておく。

[root@8835c72c36a9 /]# exit
[nsmrtks@app-tmp redispy]$ docker-compose down
Stopping redispy_python_1 ... done
Stopping redispy_redis_1  ... done
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

● パスワードの設定

Redis にパスワードを設定することが出来る。

以下などを参考にする。

Redisの認証について | shimar's blog
Redisチートシート(設定編) - Qiita
Redis configuration – Redis

redis.conf の編集(作成)が必要である。 そこで、docker-compose.yaml を以下のように変更する。

version: "3.2"
services:
  python:
    build:
      context: python
    depends_on:
      - redis
    tty: true
  redis:
    build:
      context: redis

ディレクトリ構成を、新たに python というディレクトリと redis というディレクトリを作成し、それまでの Dockerfile と test.py は python ディレクトリに移動する。
redis ディレクトリの下に、以下の redis.conf ファイルと Dockerfile を作成する。 (Dockerfile は redis - Docker Hub に書いてあることそのままである)

redis.conf

requirepass Taki

Dockerfile

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

この状態で実行すると..

[nsmrtks@app-tmp redispy]$ docker-compose build
Building redis
〜
Successfully built c23e33cd7cec
Successfully tagged redispy_redis:latest
Building python
〜
Successfully built 43b1e939ae71
Successfully tagged redispy_python:latest

[nsmrtks@app-tmp redispy]$ docker-compose up
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done
Attaching to redispy_redis_1, redispy_python_1
redis_1   | 1:C 07 Jan 2019 06:47:30.248 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1   | 1:C 07 Jan 2019 06:47:30.248 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1   | 1:C 07 Jan 2019 06:47:30.248 # Configuration loaded
redis_1   | 1:M 07 Jan 2019 06:47:30.250 * Running mode=standalone, port=6379.
redis_1   | 1:M 07 Jan 2019 06:47:30.251 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1   | 1:M 07 Jan 2019 06:47:30.251 # Server initialized
redis_1   | 1:M 07 Jan 2019 06:47:30.251 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_me
mory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1   | 1:M 07 Jan 2019 06:47:30.251 # 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.
redis_1   | 1:M 07 Jan 2019 06:47:30.251 * Ready to accept connections
python_1  | Traceback (most recent call last):
python_1  |   File "/test.py", line 7, in 
python_1  |     print(sr.get('yourname'))
python_1  |   File "/usr/lib/python2.7/site-packages/redis/client.py", line 1207, in get
python_1  |     return self.execute_command('GET', name)
python_1  |   File "/usr/lib/python2.7/site-packages/redis/client.py", line 755, in execute_command
python_1  |     return self.parse_response(connection, command_name, **options)
python_1  |   File "/usr/lib/python2.7/site-packages/redis/client.py", line 768, in parse_response
python_1  |     response = connection.read_response()
python_1  |   File "/usr/lib/python2.7/site-packages/redis/connection.py", line 638, in read_response
python_1  |     raise response
python_1  | redis.exceptions.ResponseError: NOAUTH Authentication required.
redispy_python_1 exited with code 1
^CGracefully stopping... (press Ctrl+C again to force)
Stopping redispy_redis_1  ... done

test.py でパスワードを指定していないので、予想通りアクセス拒否された。

redis-py からパスワードを指定するには、以下などを参考にしたが..

CentOS 7 : Redis : Python から利用する : Server World
Welcome to redis-py’s documentation! — redis-py 2.10.5 documentation

ConnectionPool に password=〜 を与えた所、アクセスすることが出来た。

test.py

import redis

# sr = redis.StrictRedis(host='redis', port=6379, db=0)
pool = redis.ConnectionPool(host='redis', port=6379, db=0, password='Taki')
sr = redis.StrictRedis(connection_pool=pool)

print(sr.get('yourname'))

sr.set('yourname', 'Mitsuha')

print(sr.get('yourname'))
[nsmrtks@app-tmp redispy]$ docker-compose down
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

[nsmrtks@app-tmp redispy]$ docker-compose build
Building redis
〜
Successfully built 3018ba80d1e2
Successfully tagged redispy_redis:latest
Building python
〜
Successfully built e8b52d1f62dc
Successfully tagged redispy_python:latest

[nsmrtks@app-tmp redispy]$ docker-compose up
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done
Attaching to redispy_redis_1, redispy_python_1
redis_1   | 1:C 07 Jan 2019 07:13:43.073 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1   | 1:C 07 Jan 2019 07:13:43.073 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1   | 1:C 07 Jan 2019 07:13:43.073 # Configuration loaded
redis_1   | 1:M 07 Jan 2019 07:13:43.076 * Running mode=standalone, port=6379.
redis_1   | 1:M 07 Jan 2019 07:13:43.076 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1   | 1:M 07 Jan 2019 07:13:43.076 # Server initialized
redis_1   | 1:M 07 Jan 2019 07:13:43.076 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_me
mory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1   | 1:M 07 Jan 2019 07:13:43.076 # 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.
redis_1   | 1:M 07 Jan 2019 07:13:43.076 * Ready to accept connections
python_1  | None
python_1  | Mitsuha
redispy_python_1 exited with code 0
^CGracefully stopping... (press Ctrl+C again to force)
Stopping redispy_redis_1  ... done

[nsmrtks@app-tmp redispy]$ docker-compose down
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

◎ redis-cli からアクセスする場合

AUTH コマンドで認証を通すことが出来る。

試すには、まず先ほどの redis コンテナを docker-compose up -d で detach させて起動する。

[nsmrtks@app-tmp redispy]$ docker-compose up -d
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done

[nsmrtks@app-tmp redispy]$ docker ps
CONTAINER ID        IMAGE		〜 COMMAND                  CREATED             STATUS              PORTS	〜 NAMES
6a1af399d1f9        redispy_redis	〜 "docker-entrypoint.s…"  10 seconds ago      Up 8 seconds        6379/tcp	〜 redispy_redis_1
48e5f06d0751        redis		〜 "docker-entrypoint.s…"  12 days ago         Up 12 days          6379/tcp	〜 some-redis

ここで、先ほどと同様の --link を使った手法では接続できなかったが..

[nsmrtks@app-tmp redispy]$ docker run -it --link redispy_redis_1:sider --rm redis redis-cli -h sider -p 6379
docker: Error response from daemon: Cannot link to /redispy_redis_1, as it does not belong to the default network.

redispy_redis_1 コンテナ自身で redis-cli コマンドを起動すると、試すことが出来た。

[nsmrtks@app-tmp redispy]$ docker exec -it redispy_redis_1 redis-cli -h localhost -p 6379
localhost:6379> keys *
(error) NOAUTH Authentication required.
localhost:6379> auth Taki
OK
localhost:6379> keys *
1) "yourname"
localhost:6379> get yourname
"Mitsuha"
localhost:6379> 

[nsmrtks@app-tmp redispy]$ docker-compose down
Stopping redispy_redis_1 ... done
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

● 値の永続化

redis - Docker Hub によれば、例えば以下のようにすれば、/data 以下にデータが保存されるとある。

$ docker run --name some-redis -d redis redis-server --appendonly yes

前述までの実行例では、appendonly を指定しておらず、いまいちど /data の中を見てみると、以下のように空であった。

[nsmrtks@app-tmp redispy]$ docker-compose up -d
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done

[nsmrtks@app-tmp redispy]$ docker exec -it redispy_redis_1 bash
root@f4292e0c240b:/data# pwd
/data
root@f4292e0c240b:/data# ls -a
.  ..
root@f4292e0c240b:/data# exit

[nsmrtks@app-tmp redispy]$ docker logs redispy_python_1
None
Mitsuha

[nsmrtks@app-tmp redispy]$ docker-compose down
Stopping redispy_redis_1 ... done
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

以下によれば、

Redis Persistence – Redis

redis.conf に以下のように指定すれば、コマンドラインに --appendonly yes を指定するのと同じ効果が得られるように思う。

appendonly yes

これらの指定による永続化は、AOF persistence などと呼ばれるようである。

ここで、前述の参考リンクにもあるように、AOF の場合は、Redis にデータの書き換えを指示するたびに、AOF のファイルの末尾にデータが追加されていって、たとえ Redis が抱えるデータの総量が増えていなかったとしても、ファイルが一直線に大きくなっていく。
それを、時あるごとに自動的に最小サイズに縮める設定が存在し、以下を参考にすると、

The self documented redis.conf for Redis 4.0

とりあえずそのまま真似れば redis.conf に以下のように追記すればいいようである。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

ここまでの redis.conf をまとめると、以下のようになる。

requirepass Taki
appendonly yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

これで Redis 自体はデータを永続化するようになったはずだが、/data の中身は、Docker コンテナを停止・消去すると消えてしまうので、/data を Docker のボリュームとしてマウントしておかねばならない。
そこで、docker-compose.yaml が以下のようになるように追記する。 (末尾の 4行を追加)

version: "3.2"
services:
  python:
    build:
      context: python
    depends_on:
      - redis
    tty: true
  redis:
    build:
      context: redis
    volumes:
      - redisdata:/data
volumes:
  redisdata:

これで試してみると..

[nsmrtks@app-tmp redispy]$ docker-compose build
Building redis
〜
Successfully built 7b38fd3e173d
Successfully tagged redispy_redis:latest
Building python
〜
Successfully built e8b52d1f62dc
Successfully tagged redispy_python:latest

以下のように、docker-compose down して再度 up しても、以前のデータを覚えているようになった。

[nsmrtks@app-tmp redispy]$ docker-compose up -d
〜
Creating network "redispy_default" with the default driver
Creating volume "redispy_redisdata" with default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done

[nsmrtks@app-tmp redispy]$ docker logs redispy_python_1
None
Mitsuha

[nsmrtks@app-tmp redispy]$ docker-compose down
Stopping redispy_redis_1 ... done
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

[nsmrtks@app-tmp redispy]$ docker-compose up -d
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done

[nsmrtks@app-tmp redispy]$ docker logs redispy_python_1
Mitsuha
Mitsuha

また、以下のように redispy_redisdata という Docker ボリュームが作られた。

[nsmrtks@app-tmp redispy]$ docker volume ls
DRIVER              VOLUME NAME
〜
local               redispy_redisdata
〜

なお redis コンテナの /data の下は以下のようにファイルが作られていた。

[nsmrtks@app-tmp redispy]$ docker exec -it redispy_redis_1 bash
root@48c3257ddb08:/data# ls -a
.  ..  appendonly.aof
root@48c3257ddb08:/data# ls -l
total 4
-rw-r--r--. 1 redis redis 126 Jan  9 06:57 appendonly.aof
root@48c3257ddb08:/data# cat appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
SET
$8
yourname
$7
Mitsuha
*2
$6
SELECT
$1
0
*3
$3
SET
$8
yourname
$7
Mitsuha

最後に忘れずに docker-compose down しておいた。

root@48c3257ddb08:/data# exit
exit

[nsmrtks@app-tmp redispy]$ docker-compose down
Stopping redispy_redis_1 ... done
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

● Docker コンテナ/ネットワークの外からアクセスする

これまでの例の Docker コンテナの Redis に、Docker コンテナやネットワークの外からアクセスしたいことがあるかもしれない。

これまでの例では、クライアント (redis-cli や Python) から Redis サーバへは、docker run に --link を指定したり、docker-compose で作ったネットワーク内から (ホスト名「redis」を指定して) アクセスしたりしていた。
はたまた、Redis サーバが動いているのと同じ Docker コンテナ内から docker-cli を実行したりしていた。

docker-compose で実行した例では、docker ps で見ても分かる通り、Redis のポート 6379 は、docker-compose のネットワーク内で閉じているから、そのままでは外からアクセスすることは出来ない。

[nsmrtks@app-tmp redispy]$ docker ps
CONTAINER ID        IMAGE		〜 COMMAND                  CREATED             STATUS              PORTS	〜 NAMES
d3e3055aca60        redispy_redis	〜 "docker-entrypoint.s…"  12 seconds ago      Up 10 seconds       6379/tcp	〜 redispy_redis_1
〜

そこで、docker-compose.yaml に ports の定義を追加すれば、外からでもアクセスすることが出来るようになる。
(ports: から始まる 4行を追加)

version: "3.2"
services:
  python:
    build:
      context: python
    depends_on:
      - redis
    tty: true
  redis:
    build:
      context: redis
    volumes:
      - redisdata:/data
    ports:
      - target: 6379
        published: 6379
        protocol: tcp
volumes:
  redisdata:

これで実行すると、以下の docker ps の PORTS の所を見て分かる通り、Docker コンテナ/ネットワークの外からでも、Redis サーバにポート 6379 でアクセスできるようになった。

[nsmrtks@app-tmp redispy]$ docker-compose build
Building redis
〜
Successfully built 7b38fd3e173d
Successfully tagged redispy_redis:latest
Building python
〜
Successfully built e8b52d1f62dc
Successfully tagged redispy_python:latest

[nsmrtks@app-tmp redispy]$ docker-compose up -d
〜
Creating network "redispy_default" with the default driver
Creating redispy_redis_1 ... done
Creating redispy_python_1 ... done

[nsmrtks@app-tmp redispy]$ docker ps
CONTAINER ID        IMAGE		〜 COMMAND                  CREATED             STATUS              PORTS			〜 NAMES
0fc5a415ed6e        redispy_redis	〜 "docker-entrypoint.s…"  5 seconds ago       Up 4 seconds        0.0.0.0:6379->6379/tcp	〜 redispy_redis_1

docker-cli による例では、これで docker run に --link を指定したりするのではなく、以下の例などのようにして、Docker コンテナの Redis サーバに、外からアクセスできるようになった。

[nsmrtks@app-tmp redispy]$ ifconfig | egrep 192
        inet 192.168.100.13  netmask 255.255.255.0  broadcast 192.168.100.255

[nsmrtks@app-tmp redispy]$ docker run -it --rm redis redis-cli -h 192.168.100.13 -p 6379
192.168.100.13:6379> auth Taki
OK
192.168.100.13:6379> keys *
1) "yourname"
192.168.100.13:6379> get yourname
"Mitsuha"
192.168.100.13:6379> 

[nsmrtks@app-tmp redispy]$ docker-compose down
Stopping redispy_redis_1 ... done
Removing redispy_python_1 ... done
Removing redispy_redis_1  ... done
Removing network redispy_default

以上


index