Setiap wadah memiliki localhost sendiri
Setiap layanan berjalan dalam wadahnya sendiri. Dari perspektif wadah Ubuntu, redis tidak mendengarkan di localhost.
Gunakan jaringan Docker
Agar container Anda dapat berkomunikasi, container tersebut harus berada di jaringan Docker yang sama. Ini terdiri dari tiga langkah:
- Buat jaringan Docker
- Beri nama wadah Anda
- Lampirkan wadah Anda ke jaringan yang Anda buat
Dengan ini dilakukan, wadah dapat berbicara satu sama lain menggunakan nama mereka seolah-olah mereka adalah nama host.
Ada lebih dari satu cara untuk menguliti kucing ini... Saya akan melihat dua dalam jawaban ini, tetapi mungkin ada beberapa cara lain untuk melakukannya yang tidak saya ketahui (seperti menggunakan Kubernetes atau Swarm, misalnya).
Melakukannya dengan tangan
Anda dapat membuat jaringan untuk aplikasi ini menggunakan docker network
perintah.
# Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
Saat Anda menjalankan penampung redis, pastikan penampung tersebut memiliki nama, dan berada di jaringan ini. Anda dapat mengekspos port secara eksternal (ke macOS) jika Anda mau (menggunakan -p
), tetapi itu tidak perlu hanya untuk wadah lain untuk berbicara dengan redis.
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Sekarang jalankan wadah Ubuntu Anda. Anda dapat memberi nama juga jika Anda mau, tetapi saya tidak akan repot dalam contoh ini karena yang ini tidak menjalankan layanan apa pun.
docker run -it --network my_redis_app ubuntu bash
Sekarang dari dalam wadah Ubuntu, Anda harus dapat mencapai redis menggunakan nama redis_server
, seolah-olah itu adalah nama DNS.
Melakukannya menggunakan Compose
Saya cenderung membuat pengaturan seperti ini menggunakan Compose, karena lebih mudah untuk menulisnya ke dalam file YAML (IMO). Berikut ini contoh di atas, ditulis ulang dalam bentuk docker-compose.yml:
version: '2'
services:
redis:
image: <IMAGE ID>
networks:
- my_redis_app
ports: 6379:6379
ubuntu:
image: ubuntu:latest
networks:
- my_redis_app
networks:
my_redis_app:
driver: bridge
Dengan ini, Anda dapat menjalankan docker-compose up -d redis
dan buat layanan redis Anda online menggunakan jaringan Docker tertentu. Compose akan membuatkan jaringan untuk Anda, jika belum ada.
Kurang masuk akal untuk menjalankan wadah Ubuntu seperti itu... tentu saja interaktif. Tapi saya berasumsi setelah Anda melakukan redis, Anda akan menambahkan semacam wadah aplikasi, dan mungkin proxy web seperti nginx... taruh saja yang lain di bawah services
juga, dan Anda dapat mengelola semuanya bersama-sama.
Sejak ubuntu
bersifat interaktif, Anda dapat menjalankannya secara interaktif:
# without -d, container is run interactively
docker-compose run ubuntu bash
Dan sekarang di Ubuntu, Anda seharusnya dapat terhubung ke redis menggunakan namanya, yang dalam contoh ini adalah redis
.