Repo này có khả năng phục vụ nhiều host trên các containers khác nhau của docker thông qua nginx làm proxy. Tất cả các containers này cùng chung một network là nginx-proxy
Internet ---------> Nginx (docker-container) --------> php-fpm (docker-container)
|
|
-------> nodejs (docker-container)
- hostname được đặt ở file
.env
củainternal-php.local
vàinternal-node.local
Tạo nginx-proxy network: docker network create nginx-proxy
Tạo pgadmin network: docker network create pgadmin
(được sử dụng để kết nối internal-pgadmin.local với postgresql của node.local cho việc quản lý postgresql nếu muốn)
Tạo phpmyadmin network: docker network create phpmyadmin
(tương tự với mysql và php.local)
- Vào thư mục
nginx-proxy
:
- build:
docker-compose build
- start nginx:
docker-compose up -d
- Vào thư mục
internal-php.local
:
- build:
docker-compose build
- start site php.local
docker-compose up
(Ctrl-C để stop site php.local) - thêm
127.0.0.1 php.local
vào/etc/hosts
, truy cập: http://php.local - nếu không muốn thêm vào file hosts, bạn có thể sử dụng
curl --resolve php.local:80:127.0.0.1 http://php.local/
- Vào thư mục
internal-node.local
:
- build:
docker-compose build
- start site node.local
docker-compose up
(Ctrl-C để stop site node.local) - thêm
127.0.0.1 node.local
vào/etc/hosts
, truy cập: http://node.local - nếu không muốn thêm vào file hosts, bạn có thể sử dụng
curl --resolve node.local:80:127.0.0.1 http://node.local/
- Cây thư mục:
$ tree -a .
.
├── data
│ ├── node.local
│ │ └── postgresql
│ └── php.local
│ ├── mysql
│ └── redis
├── internal-node.local
│ ├── app
│ │ └── app.js
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── entrypoint.sh
│ ├── .env
│ └── postgresql
│ └── Dockerfile
├── internal-php.local
│ ├── conf
│ │ ├── custom-php-fpm.conf
│ │ └── custom-php.ini
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── .env
│ ├── mysql
│ │ └── Dockerfile
│ └── redis
│ ├── Dockerfile
│ ├── entrypoint.sh
│ └── redis.conf
├── nginx-proxy
│ ├── conf.d
│ │ ├── default.conf
│ │ ├── node.local.conf
│ │ └── php.local.conf
│ ├── docker-compose.yml
│ └── Dockerfile
├── public_html
│ ├── node.local
│ │ └── index.html
│ └── php.local
│ ├── index.php
│ ├── nginx-index.html
│ └── phpinfo.php
├── README.md
└── run
├── main
│ ├── node.local
│ │ └── unix.sock
│ └── php.local
│ └── unix.sock
├── node.local
│ └── postgresql
│ ├── .s.PGSQL.5432
│ └── .s.PGSQL.5432.lock
└── php.local
├── mysqld
│ └── mysqld.sock
└── redis
└── redis.sock
- thư mục
./data
là nơi lưu trữ data của csdl, redis,.. bạn nên lưu trữ data của ứng dụng vào đây để tiện cho việc backup sau này - thư mục
./run
chứa các tập tin unix socket cho việc kết nối IPC:./run/main
cho việc kết nối IPC giữa nginx và apps,./run/[HOST_NAME]/*
cho việc kết nối IPC giữa app với dbms hoặc các container khác mà app cần tới, ví dụ: với app node.local, file unix socket./run/node.local/postgresql/.s.PGSQL.5432
được dùng để giao tiếp giữa node và postgresql;node
sẽ kết nối vớipostgresql
qua file/var/run/postgresql/.s.PGSQL.5432
(đọc file ./internal-node.local/docker-compose.yml) - thư mục
./public_html/[HOST_NAME]
được sử dụng để lưu trữ trang web tương ứng với từng HOST_NAME (node.local hay php.local) - các files
./nginx-proxy/conf.d/[HOST_NAME].conf
chứa thông tin cấu hình của nginx tương ứng với từng HOST_NAME - các thư mục
./internal-node.local
và./internal-php.local
chứa thông tin cấu hình của container cũng như php hay nodejs. Trong các thư mục này chứa file.env
với biếnHOST_NAME
định nghĩa hostname lànode.local
hayphp.local
..env
cũng chứa thông tin đăng nhập database - Sau khi bạn thay đổi cấu hình nginx, hãy restart lại container
nginx-proxy
Đơn giản là backup thư mục data
, ví dụ như:
sudo zip data.zip data -r
- Chuyển file data.zip đến server đích:
unzip data.zip
Backup các thư mục sau: internal-*
, public_html
, nginx-proxy
. Ví dụ
zip backup.zip internal-* public_html nginx-proxy -r
- Chuyển file backup.zip đến server đích:
unzip backup.zip
Xác định hostname. Ví dụ bạn muốn tạo website với hosttname là: example.com
- Tạo thư mục
internal-example.com
: Setup container trong này, file .env với HOST_NAME=example.com. App cần listen unix file với đường dẫn/home/run/unix.sock
hoặc tcp (ưu tiên unix file). Mount../public_html/[hostname]/
thành thư mục bạn cần trên container, mount../run/main/[hostname]
thành/home/run
trên container. Nếu ứng dụng có dbms, hãy mount../data/[hostname]/dbms
thành nơi lưu data trên container của dbms đó - Tạo file config của nginx
./nginx-proxy/conf.d/[hostname].conf
: File config cần cấu hình sao cho nginx kết nối với app qua tcp hoặc unix file/home/run/[hostname]/unix.sock
và sau đó là docker-compose build/up, restart nginx-proxy Hoặc, đơn giản hơn là copyinternal-php.local
hoặcinternal-node.local
rồi thay đổi một chút, một chút hihi (tham khảo dưới đây) =)))
Ví dụ hostname là example.com
- Copy những thứ cần thiết từ php.local
cp internal-php.local internal-example.com -r
cp nginx-proxy/conf.d/php.local.conf nginx-proxy/conf.d/example.com.conf
cp public_html/php.local public_html/example.com -r
- Thay
php.local
thànhexample.com
sed -i 's/php.local/example.com/g' internal-example.com/.env nginx-proxy/conf.d/example.com.conf
- Vào thư mục
internal-example.com
docker-compose build
docker-compose up
- Restart nginx: vào thư mục
nginx-proxy
docker-compose stop
docker-compose up -d
Tương tự, copy internal-node.local
và file cấu hình cũng như thư mục public_html/node.local
. Sau đó thay thế node.local thành hostname của bạn
- Hãy chắc chắn rằng bạn đã start
nginx-proxy
vàinternal-node.local
hayinternal-php.local
. - Sử dụng
docker ps
để kiểm tra container nào đang chạy
Đơn giản, hãy chmod 777 thư mục bạn muốn ghi lên đó.
Bạn có thể chmod ./public_html/[hostname]
hoặc docker exec
rồi chmod /home/public_html
trong container
Hãy đọc các tệp docker-compose.yml
trong internal-php.local
và internal-node.local
để hiểu hơn về cấu trúc.
Nếu bạn thấy có gì sai sai, cứ tạo một issue, pull request để fix lại vấn đề đó. Cảm ơn bạn!
@vinhjaxt