Docker-compo theo mặc định sẽ tạo mạng ảo mà tất cả các vùng chứa / dịch vụ trong tệp soạn thảo có thể kết nối với nhau bằng một địa chỉ IP. Bằng cách sử dụng các liên kết links
, depends_on
hoặc bí danh mạng mà chúng có thể kết nối với nhau bằng tên máy chủ. Trong trường hợp của bạn, tên máy chủ là tên dịch vụ, nhưng tên này có thể bị ghi đè. (xem: tài liệu
)
Tập lệnh của bạn trong my_common_package
vùng chứa / dịch vụ sau đó sẽ kết nối với mysql
trên cổng 3306
theo thiết lập của bạn. (không phải localhost
trên cổng 3306
)
Cũng lưu ý rằng sử dụng expose
chỉ cần thiết nếu Dockerfile cho dịch vụ không có EXPOSE
tuyên bố. Hình ảnh mysql tiêu chuẩn đã thực hiện điều này.
Nếu bạn muốn ánh xạ một cổng vùng chứa tới localhost
bạn cần sử dụng ports
, nhưng chỉ làm điều này nếu cần thiết.
services:
mysql:
image: mysql:5.6
container_name: test_mysql_container
environment:
- MYSQL_ROOT_PASSWORD=test
- MYSQL_DATABASE=My_Database
- MYSQL_USER=my_user
- MYSQL_PASSWORD=my_password
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
Ở đây chúng tôi đang nói rằng cổng 3306 trong vùng chứa mysql nên được ánh xạ tới localhost trên cổng 3306.
Bây giờ bạn có thể kết nối với mysql bằng localhost:3306
bên ngoài của docker. Ví dụ:bạn có thể thử chạy testsql.py
của mình cục bộ (KHÔNG trong vùng chứa).
Giao tiếp vùng chứa với vùng chứa sẽ luôn xảy ra bằng cách sử dụng tên máy chủ của mỗi vùng chứa. Hãy coi vùng chứa như máy ảo.
Bạn thậm chí có thể tìm thấy trình soạn thảo docker mạng được tạo bằng cách sử dụng docker network list
:
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. sau đó sử dụng docker network inspect <id>
để xem chi tiết.
Địa chỉ IP được chỉ định cho vùng chứa có thể khá ngẫu nhiên, vì vậy cách khả thi duy nhất để giao tiếp vùng chứa với vùng chứa là sử dụng tên máy chủ.