Mỗi vùng chứa có máy chủ cục bộ riêng của nó
Mỗi dịch vụ chạy trong vùng chứa riêng của nó. Từ quan điểm của vùng chứa Ubuntu, redis không lắng nghe trên localhost.
Sử dụng mạng Docker
Để các vùng chứa của bạn giao tiếp với nhau, chúng phải ở trên cùng một mạng Docker. Điều này bao gồm ba bước:
- Tạo mạng Docker
- Đặt tên cho vùng chứa của bạn
- Đính kèm các vùng chứa của bạn vào mạng bạn đã tạo
Khi điều này được thực hiện, các vùng chứa có thể nói chuyện với nhau bằng cách sử dụng tên của chúng như thể chúng là tên máy chủ.
Có nhiều cách để lột da con mèo này ... Tôi sẽ xem xét hai cách trong câu trả lời này, nhưng có thể có một vài cách khác để làm điều đó mà tôi không quen thuộc (chẳng hạn như sử dụng Kubernetes hoặc Swarm).
Làm bằng tay
Bạn có thể tạo mạng cho ứng dụng này bằng docker network
lệnh.
# Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
Khi bạn chạy vùng chứa redis, hãy đảm bảo rằng nó có tên và nằm trên mạng này. Bạn có thể hiển thị các cổng ra bên ngoài (cho macOS) nếu bạn muốn (sử dụng -p
), nhưng điều đó không cần thiết chỉ để các vùng chứa khác nói chuyện với redis.
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Bây giờ hãy chạy vùng chứa Ubuntu của bạn. Bạn có thể đặt tên cho nó nếu bạn muốn, nhưng tôi sẽ không bận tâm trong ví dụ này vì ví dụ này không chạy bất kỳ dịch vụ nào.
docker run -it --network my_redis_app ubuntu bash
Bây giờ từ bên trong vùng chứa Ubuntu, bạn sẽ có thể truy cập redis bằng tên redis_server
, như thể đó là một tên DNS.
Làm điều đó bằng Soạn thư
Tôi có xu hướng xây dựng các thiết lập như thế này bằng cách sử dụng Soạn thư, vì việc ghi nó vào tệp YAML (IMO) dễ dàng hơn. Đây là một ví dụ về điều trên, được viết lại ở dạng docker-compost.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
Với điều này tại chỗ, bạn có thể chạy docker-compose up -d redis
và có dịch vụ redis của bạn trực tuyến bằng một mạng Docker cụ thể. Soạn sẽ tạo mạng cho bạn, nếu nó chưa tồn tại.
Sẽ ít hợp lý hơn nếu chạy vùng chứa Ubuntu theo cách đó ... tất nhiên, nó có tính tương tác. Nhưng tôi cho rằng một khi bạn bắt đầu redis, bạn sẽ thêm một số loại vùng chứa ứng dụng và có lẽ một proxy web như nginx ... chỉ cần đặt những cái khác dưới services
và bạn có thể quản lý tất cả chúng cùng nhau.
Kể từ ubuntu
tương tác, bạn có thể chạy nó một cách tương tác:
# without -d, container is run interactively
docker-compose run ubuntu bash
Và bây giờ trong Ubuntu, bạn có thể kết nối với redis bằng cách sử dụng tên của nó, trong ví dụ này chỉ đơn giản là redis
.