2019-02-02
Redis は、Docker Hub の 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>
登録されているキーを全て表示する。 まだ何もない。
sider:6379> keys *
(empty list or set)
キーに値(文字列)を設定する。
sider:6379> set yourname Mitsuha
OK
再び keys * を実行すると、キーが表示された。
sider:6379> keys *
1) "yourname"
キーを指定して値(文字列)を表示する。 先ほど設定した値が表示された。
sider:6379> get yourname
"Mitsuha"
以下などを参考に..
今度は、以下のような 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.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 からパスワードを指定するには、以下などを参考にしたが..
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
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.conf に以下のように指定すれば、コマンドラインに --appendonly yes を指定するのと同じ効果が得られるように思う。
appendonly yes
これらの指定による永続化は、AOF persistence などと呼ばれるようである。
ここで、前述の参考リンクにもあるように、AOF の場合は、Redis
にデータの書き換えを指示するたびに、AOF
のファイルの末尾にデータが追加されていって、たとえ Redis
が抱えるデータの総量が増えていなかったとしても、ファイルが一直線に大きくなっていく。
それを、時あるごとに自動的に最小サイズに縮める設定が存在し、以下を参考にすると、
とりあえずそのまま真似れば 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 コンテナの 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