Các Câu Hỏi Thường Gặp (FAQ) Khi Phối Hợp ServBay và Docker
Trong quá trình phát triển web local với ServBay, bạn có thể muốn kết hợp Docker để tận dụng môi trường container hóa. FAQ này sẽ giải đáp những vấn đề thường gặp khi phối hợp ServBay và Docker trên macOS, bao gồm cách truy cập các dịch vụ ServBay từ Docker cũng như reverse proxy ứng dụng chạy trong Docker thông qua ServBay.
Q1: Vì sao ServBay thay đổi file hosts
trên hệ thống? Tôi có thể ngăn điều này không?
ServBay tự động thêm các dòng cấu hình vào file hosts
trên hệ thống của bạn (ví dụ mysite.servbay.demo 127.0.0.1
) để bạn có thể truy cập website phát triển local qua tên miền tùy chỉnh (như mysite.servbay.demo
). Các website này thực tế hoạt động trên địa chỉ 127.0.0.1
của máy bạn.
Tuy nhiên, do cơ chế của Docker, file hosts sẽ được đọc từ máy macOS host, tác động khiến mysite.servbay.demo
trỏ về 127.0.0.1
và Docker thực chất sẽ truy cập dịch vụ (bên trong container) của chính nó, không phải host.
Cơ chế cốt lõi:
- Khi bạn tạo một website mới trên ServBay và chỉ định một tên miền (ví dụ
example.servbay.demo
), ServBay sẽ tự động trỏ domain đó về127.0.0.1
. - Đây là cách tiêu chuẩn để truy cập domain local thân thiện. Nếu không thay đổi file
hosts
, bạn chỉ có thể truy cập qua địa chỉ nhưhttp://127.0.0.1:PORT
mà không dùng domain tùy chỉnh.
Vậy có ngăn được không?
Về lý thuyết, bạn có thể xóa thủ công các dòng do ServBay thêm vào, nhưng sẽ khiến bạn không còn truy cập website local qua domain đã cấu hình trên ServBay nữa, từ đó làm mất ý nghĩa của việc mang lại trải nghiệm phát triển local thuận tiện. Một trong những chức năng cốt lõi của ServBay là đơn giản hóa việc tạo và truy cập website local. Nếu bạn không muốn ServBay quản lý entry hosts cho một domain nhất định, tốt nhất không tạo website với domain đó trên ServBay.
Đối với đại đa số các trường hợp phát triển local, việc ServBay tự động quản lý file hosts
là điều nên làm, giúp đơn giản hóa quy trình làm việc.
Q2: Làm sao để Docker container truy cập được đúng các website được quản lý bởi ServBay trên macOS host (như mysite.servbay.demo
) qua tên miền?
Đây là nhu cầu phổ biến nhưng nếu xử lý sai sẽ gặp vấn đề. Khi ServBay chạy một website trên macOS host (mysite.servbay.demo
ánh xạ về 127.0.0.1
trên máy host) thì trong Docker container, 127.0.0.1
sẽ trỏ về chính container đó, không phải máy host (macOS).
Cách sai: Truy cập trực tiếp website ServBay qua host host.docker.internal
Dù Docker Desktop for Mac (và Windows) cung cấp DNS đặc biệt host.docker.internal
để dùng từ trong container trỏ về IP của máy host, bạn tuyệt đối không nên dùng nó trực tiếp làm hostname khi truy cập website của ServBay (ví dụ truy cập http://host.docker.internal/
và kỳ vọng nó hiểu ngầm thành mysite.servbay.demo
).
Vì khi làm như vậy, header HTTP Host
gửi đến web server của ServBay (Caddy, Nginx…) sẽ là host.docker.internal
thay vì mysite.servbay.demo
. Web server này dựa vào giá trị Host
để phân biệt website được truy cập là cái nào. Nếu Host
là host.docker.internal
thay vì domain đúng, request sẽ bị định tuyến sai — đặc biệt với HTTPS, sẽ gặp lỗi SNI (Server Name Indication) do SSL certificate chỉ cấp cho mysite.servbay.demo
chứ không phải host.docker.internal
.
Giải pháp đúng: Bổ sung extra_hosts
khi chạy Docker container
Để ứng dụng trong container truy cập website local qua đúng domain (ví dụ, mysite.servbay.demo
) với header Host
phù hợp, bạn nên thêm entry vào file /etc/hosts
trong container, ánh xạ domain này về IP của máy host. Làm điều này qua extra_hosts
(trong docker-compose.yml
) hoặc --add-host
(khi chạy docker run
) và trỏ về host.docker.internal
hoặc cách tốt hơn là host-gateway
.
Với
docker run
:bashdocker run --add-host=mysite.servbay.demo:host-gateway ... your_image
1(
host-gateway
là giá trị đặc biệt, Docker sẽ tự động thay bằng IP nội bộ của host; từ Docker 20.10+.)Với
docker-compose.yml
:yamlversion: '3.8' # Hoặc cao hơn services: myapp: image: your_image extra_hosts: - "mysite.servbay.demo:host-gateway" # hoặc "mysite.servbay.demo:host.docker.internal" # ...các config khác
1
2
3
4
5
6
7
Sau khi cấu hình, bên trong Docker container:
- Khi ứng dụng truy cập
http://mysite.servbay.demo
(hoặc HTTPS), hệ thống sẽ đọc từ/etc/hosts
để trỏ domain về IP máy host macOS. - Request sẽ đi đến web server của ServBay trên máy host.
- Header HTTP
Host
vẫn làmysite.servbay.demo
, giúp ServBay định tuyến đúng website và trả về SSL certificate hợp lệ (nếu dùng HTTPS).
Q3: Docker container kết nối tới cơ sở dữ liệu do ServBay quản lý (MySQL, PostgreSQL…) hoặc dịch vụ TCP khác bằng cách nào?
Khác với website (phụ thuộc vào header Host
và SNI), khi kết nối đến database hoặc dịch vụ TCP không cần SNI, bạn nên và hoàn toàn có thể sử dụng host.docker.internal
làm hostname.
Các bước:
- Đảm bảo database/package tương ứng trên ServBay đã được kích hoạt và cho phép kết nối từ máy host (thường mặc định cho phát triển local).
- Trong Docker container, cấu hình kết nối như sau:
- Hostname/Server:
host.docker.internal
- Port: Dùng đúng port ServBay cung cấp cho dịch vụ liên quan (ví dụ, MySQL mặc định là
3306
, PostgreSQL là5432
). - User/Password: Theo user database bạn tạo trên ServBay.
- Hostname/Server:
Ví dụ (kết nối tới MySQL của ServBay): Nếu MySQL đang chạy trên port 3306
, cấu hình app trong container sẽ là:
- Host:
host.docker.internal
- Port:
3306
- User:
your_db_user
- Password:
your_db_password
Q4: Khi container truy cập website ServBay qua domain (sử dụng extra_hosts
) trên HTTPS với chứng chỉ ServBay User CA, làm sao container tin tưởng CA này?
Nếu bạn làm theo Q2 (sử dụng extra_hosts
), domain như secure.servbay.demo
sẽ ánh xạ về host. Nếu domain này sử dụng chứng chỉ SSL do ServBay User CA phát hành, container mặc định sẽ không tin tưởng CA này và việc bắt tay SSL sẽ lỗi.
Đường dẫn file CA của ServBay trên macOS host:
- Chứng chỉ gốc ServBay User CA:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- File PEM chứa ServBay User CA, Public CA và Mozilla root:
- Mac ARM:
/Applications/ServBay/package/common/openssl/3.2/cacert.pem
- Mac Intel:
/Applications/ServBay/package/common/openssl/1.1.1u/cacert.pem
- Mac ARM:
Các cách giải quyết:
Có ba phương án phổ biến để container tin tưởng ServBay User CA:
- Cách 1: Thêm CA vào store hệ thống khi build image (Dockerfile) — Dùng khi bạn có thể tùy chỉnh image và muốn toàn hệ thống tin tưởng CA.
- Cách 2: Tin tưởng CA ở cấp ứng dụng (volume + env) — Dùng khi chỉ muốn ứng dụng cụ thể tin CA hoặc không sửa image.
- Cách 3: Tin tưởng CA ở cấp hệ thống khi runtime (volume + command) — Dùng khi không build image nhưng muốn toàn container tin CA.
Cách 1: Tích hợp CA vào hệ thống khi build (Dockerfile)
Khi build Docker image, copy file CA sang và cập nhật store chứng chỉ hệ thống.
- Copy file CA: Đặt
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
vào thư mục build context (cùng Dockerfile). - Ví dụ Dockerfile (Debian/Ubuntu):dockerfile
# Dockerfile FROM ubuntu:latest COPY ServBay-Private-CA-ECC-Root.crt /usr/local/share/ca-certificates/ServBay-User-CA.crt RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && \ update-ca-certificates && \ rm -rf /var/lib/apt/lists/*
1
2
3
4
5
6 - Ví dụ Dockerfile (Alpine):dockerfile
# Dockerfile FROM alpine:latest COPY ServBay-Private-CA-ECC-Root.crt /usr/local/share/ca-certificates/ServBay-User-CA.crt RUN apk add --no-cache ca-certificates && update-ca-certificates
1
2
3
4 - Docker Compose build:yaml
# docker-compose.yml version: '3.8' services: myapp: build: context: ./app_service # Chứa Dockerfile và file CA dockerfile: Dockerfile extra_hosts: ["secure.servbay.demo:host-gateway"]
1
2
3
4
5
6
7
8
Cách 2: Tin tưởng CA ở cấp ứng dụng (volume + biến môi trường)
Mount file CA vào container và cấu hình biến môi trường cho riêng app.
- Ví dụ
docker-compose.yml
:yamlTùy ứng dụng mà biến môi trường sẽ khác, bạn cần tra thêm tài liệu của app.version: '3.8' services: myapp: image: some-base-image volumes: - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/etc/ssl/certs/MyCustomCA.crt:ro environment: # Ví dụ với Node.js: - NODE_EXTRA_CA_CERTS=/etc/ssl/certs/MyCustomCA.crt # Ví dụ với Python (requests): # - REQUESTS_CA_BUNDLE=/etc/ssl/certs/MyCustomCA.crt # Ví dụ chung cho SSL_CERT_FILE: # - SSL_CERT_FILE=/etc/ssl/certs/MyCustomCA.crt extra_hosts: ["secure.servbay.demo:host-gateway"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Cách 3: Tin tưởng CA ở cấp hệ thống runtime (volume + custom command)
Mount file CA, khi start container thì update lại store CA hệ thống — không cần build image riêng nhưng câu lệnh startup sẽ phức tạp hơn.
- Ví dụ
docker-compose.yml
(Debian/Ubuntu):yamlLưu ý:version: '3.8' services: myapp: image: ubuntu:latest # Hoặc base image hỗ trợ update-ca-certificates volumes: # Mount CA vào đúng chỗ mà hệ thống tìm - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro command: > sh -c " echo 'Attempting to update CA certificates...' && if command -v update-ca-certificates > /dev/null; then if [ ! -f /usr/bin/update-ca-certificates ]; then apt-get update && apt-get install -y --no-install-recommends ca-certificates; fi && update-ca-certificates && echo 'CA certificates updated.' else echo 'update-ca-certificates command not found, skipping CA update.' fi && echo 'Starting application...' && exec your_original_application_command_here # Đổi thành CMD gốc của image/app " extra_hosts: ["secure.servbay.demo:host-gateway"] # Nếu cần quyền root để update-ca-certificates: cân nhắc dùng field user: root hoặc entrypoint riêng.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22- Độ phức tạp: Cần đảm bảo command của image khởi chạy đúng, và update CA trước khi start app.
- Quyền hạn: update-ca-certificates thường cần root. Nếu image default chạy không phải root, cần xử lý quyền phù hợp.
- Phụ thuộc: Container phải có sẵn gói
ca-certificates
và công cụ update-ca-certificates (nếu thiếu, script sẽ cố cài). - Time khởi động: Mỗi lần start container sẽ tốn thêm bước update CA.
- Alpine Linux: Sử dụng
apk add --no-cache ca-certificates && update-ca-certificates
thay cho apt.
Nên chọn cách nào?
- Nếu custom được image và muốn mọi chương trình đều tin CA → Cách 1 là lý tưởng nhất.
- Nếu không chỉnh image, chỉ cần app cụ thể tin CA → Cách 2 tiện và nhanh.
- Nếu muốn toàn hệ thống container tin CA mà không build image → Cách 3 phù hợp hơn.
Với chứng chỉ public CA (Let's Encrypt…) Nếu website trên ServBay dùng SSL public như Let's Encrypt (qua ACME), hầu hết các Docker image nền đều đã tin cậy root CA này, không cần thao tác thêm.
Q5: Làm cách nào để cấu hình domain và reverse proxy từ ServBay tới ứng dụng trong Docker container?
Bạn có thể chạy một app trong Docker (ví dụ Node.js lắng nghe port 3000
trong container), rồi muốn gán domain đẹp (như myapp.servbay.demo
) và truy cập từ browser trên host qua ServBay, đồng thời để ServBay tự động quản lý SSL cho app đó.
Các bước thực hiện:
Chạy Docker container, ánh xạ port qua host 127.0.0.1: Đảm bảo port ứng dụng trong container được mapped ra port trên host và chỉ bind vào địa chỉ
127.0.0.1
để chỉ local host có thể truy cập, tránh expose port ra ngoài toàn mạng.bash# Ví dụ: app trong container nghe port 3000, map ra host 127.0.0.1:3001 docker run -d -p 127.0.0.1:3001:3000 your-docker-app-image
1
2Lúc này, truy cập app qua host là
http://127.0.0.1:3001
.Thêm mới website trên ServBay và chọn reverse proxy:
- Truy cập giao diện quản lý ServBay.
- Chọn "Thêm website".
- Domain: Gõ domain bạn muốn (ví dụ
myapp.servbay.demo
). - Loại website: Chọn "Reverse Proxy" từ menu xổ xuống.
- Địa chỉ IP: Nhập
127.0.0.1
. - Port: Nhập port vừa mapped, ví dụ
3001
. - Lưu lại cấu hình mới.
(Tuỳ chọn) Cấu hình SSL cho domain: Sau khi tạo website, mở cấu hình và bật SSL. ServBay hỗ trợ xin chứng chỉ public từ Let's Encrypt (qua ACME) hoặc chọn dùng ServBay User CA/Public CA. Toàn bộ SSL terminates tại ServBay, còn traffic từ ServBay sang Docker (127.0.0.1:3001) có thể giữ HTTP.
Kiểm tra truy cập: Sau khi lưu cấu hình, bạn đã có thể truy cập app qua browser với domain
http://myapp.servbay.demo
hoặchttps://myapp.servbay.demo
(nếu dùng SSL). ServBay sẽ tự động reverse proxy tới container.
Luồng hoạt động tổng quan: Trình duyệt người dùng ->
https://myapp.servbay.demo
->
ServBay (giải quyết SSL, reverse proxy) ->
http://127.0.0.1:3001
(port trên host) ->
App chạy trong Docker container.
Tổng Kết
ServBay giúp đơn giản hoá phát triển web local trên macOS. Khi phối hợp với Docker:
- Để truy cập website ServBay từ container, hãy dùng
extra_hosts
hoặc--add-host
ánh xạ domain vềhost-gateway
đảm bảo HTTP headerHost
chính xác, loại bỏ lỗi SNI. - Để truy cập database hoặc dịch vụ TCP trên ServBay từ container, dùng
host.docker.internal
làm hostname rất thuận tiện. - Để container tin tưởng SSL của ServBay User CA, copy CA vào image rồi update store CA của container.
- Để reverse proxy app Docker qua ServBay, cấu hình website loại "reverse proxy", IP là 127.0.0.1, port là port mapped, domain tuỳ ý.
Hãy luôn đảm bảo các package (web server, database…) của ServBay và Docker containers liên quan đã cấu hình đúng và chạy ổn định.