Đây là hai câu trả lời có thể có: (1) thiết lập các cổng trực tiếp với Docker và sử dụng Nginx / Apache để ủy quyền cho các vhosts hoặc (2) sử dụng Dokku để quản lý các cổng và vhosts cho bạn (đó là cách tôi đã học cách làm Phương pháp 1).
Phương pháp 1a (chỉ định trực tiếp các cổng với docker)
Bước 1: Thiết lập nginx.conf hoặc Apache trên máy chủ, với việc gán số cổng mong muốn. Máy chủ web này, chạy trên máy chủ lưu trữ, sẽ thực hiện ủy quyền vhost. Không có gì đặc biệt về điều này đối với Docker - nó là dịch vụ lưu trữ vhost bình thường. Phần đặc biệt xuất hiện tiếp theo, trong Bước 2, để làm cho Docker sử dụng số cổng máy chủ chính xác.
Bước 2: Buộc gán số cổng trong Docker bằng "-p" để đặt ánh xạ cổng của Docker và "-e" để đặt các biến môi trường tùy chỉnh trong Docker, như sau:
port=12345
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
echo $id
echo $id > /app/files/CONTAINER
docker ps
docker logs $id
docker kill $id
Phương pháp 1b Cổng ứng dụng được mã hóa cứng
... nếu ứng dụng của bạn sử dụng cổng được mã hóa cứng, ví dụ như cổng 5000 (tức là không thể định cấu hình thông qua biến môi trường PORT, như trong Phương pháp 1a), thì nó có thể được mã hóa cứng thông qua Docker như thế này:
publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
Phương pháp 2 (để Dokku tìm ra các cổng)
Hiện tại, một lựa chọn khá tốt để quản lý vhosts Docker là Dokku . Một lựa chọn sắp tới có thể là sử dụng Flynn , nhưng hiện tại Flynn chỉ mới bắt đầu và chưa sẵn sàng. Do đó, chúng tôi sẽ sử dụng Dokku ngay bây giờ: Sau khi làm theo hướng dẫn cài đặt Dokku, đối với một miền, hãy bật vhosts bằng cách tạo tệp "VHOST":
echo yourdomain.com > /home/git/VHOST
Bây giờ, khi một ứng dụng được đẩy qua SSH đến Dokku (xem tài liệu Dokku để biết cách thực hiện việc này), Dokku sẽ xem xét tệp VHOST và đối với ứng dụng cụ thể được đẩy (giả sử bạn đã đẩy "container-1"), nó sẽ tạo tệp sau:
/home/git/container-1/nginx.conf
Và nó sẽ có các nội dung sau:
upstream container-1 { server 127.0.0.1:49162; }
server {
listen 80;
server_name container-1.yourdomain.com;
location / {
proxy_pass http://container-1;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Khi máy chủ được khởi động lại, Dokku sẽ đảm bảo rằng Docker khởi động ứng dụng với cổng được ánh xạ tới cổng được triển khai ban đầu của nó (49162 ở đây), thay vì được gán ngẫu nhiên một cổng khác. Để đạt được chỉ định xác định này, Dokku lưu cổng được chỉ định ban đầu vào /home/git/container-1/PORT
và trong lần khởi chạy tiếp theo, nó đặt PORT
môi trường thành giá trị này và cũng ánh xạ các nhiệm vụ cổng của Docker thành cổng này ở cả phía máy chủ và phía ứng dụng. Điều này trái ngược với lần khởi chạy đầu tiên, khi Dokku sẽ thiết lập PORT=5000
và sau đó tìm ra bất kỳ cổng ngẫu nhiên nào mà Dokku ánh xạ ở phía VPS thành 5000 trên phía ứng dụng. Đó là khoảng thời gian (và thậm chí có thể thay đổi trong tương lai), nhưng nó hoạt động!
Cách thức hoạt động của VHOST là: khi thực hiện thao tác đẩy ứng dụng qua SSH, Dokku sẽ thực thi các hook nằm trong đó /var/lib/dokku/plugins/nginx-vhosts
. Các hook này cũng nằm trong mã nguồn Dokku ở đây và chịu trách nhiệm ghi các nginx.conf
tệp với cài đặt vhost chính xác. Nếu bạn không có thư mục này /var/lib/dokku
, hãy thử chạy dokku plugins-install
.