Tôi đã phải giải quyết vấn đề tương tự và có thể giải quyết nó mà không cần dừng bất kỳ container nào đang chạy. Đây là một giải pháp cập nhật kể từ tháng 2 năm 2016, sử dụng Docker 1.9.1. Dù sao, câu trả lời này là phiên bản chi tiết của câu trả lời của @ ricardo-branco, nhưng sâu hơn cho người dùng mới.
Trong kịch bản của tôi, tôi muốn tạm thời kết nối với MySQL đang chạy trong một thùng chứa và vì các thùng chứa ứng dụng khác được liên kết với nó, việc dừng, cấu hình lại và chạy lại bộ chứa cơ sở dữ liệu là không khởi động.
Vì tôi muốn truy cập cơ sở dữ liệu MySQL bên ngoài (từ Sequel Pro thông qua đường hầm SSH), tôi sẽ sử dụng cổng 33306
trên máy chủ. (Không 3306
, chỉ trong trường hợp có một phiên bản MySQL bên ngoài đang chạy.)
Khoảng một giờ điều chỉnh iptables tỏ ra không có kết quả, mặc dù:
Từng bước, đây là những gì tôi đã làm:
mkdir db-expose-33306
cd db-expose-33306
vim Dockerfile
Chỉnh sửa dockerfile
, đặt cái này bên trong:
# Exposes port 3306 on linked "db" container, to be accessible at host:33306
FROM ubuntu:latest # (Recommended to use the same base as the DB container)
RUN apt-get update && \
apt-get -y install socat && \
apt-get clean
USER nobody
EXPOSE 33306
CMD socat -dddd TCP-LISTEN:33306,reuseaddr,fork TCP:db:3306
Sau đó, xây dựng hình ảnh:
docker build -t your-namespace/db-expose-33306 .
Sau đó chạy nó, liên kết với container đang chạy của bạn. (Sử dụng -d
thay vì -rm
giữ nó ở chế độ nền cho đến khi dừng và xóa rõ ràng. Tôi chỉ muốn nó chạy tạm thời trong trường hợp này.)
docker run -it --rm --name=db-33306 --link the_live_db_container:db -p 33306:33306 your-namespace/db-expose-33306