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
.envcủainternal-php.localvà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.localvà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.localvà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
./datalà 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
./runchứa các tập tin unix socket cho việc kết nối IPC:./run/maincho 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;nodesẽ kết nối vớipostgresqlqua 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].confchứ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.localvà./internal-php.localchứ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.envvới biếnHOST_NAMEđịnh nghĩa hostname lànode.localhayphp.local..envcũ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.sockhoặ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/runtrên container. Nếu ứng dụng có dbms, hãy mount../data/[hostname]/dbmsthà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.sockvà sau đó là docker-compose build/up, restart nginx-proxy Hoặc, đơn giản hơn là copyinternal-php.localhoặcinternal-node.localrồ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.localthà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 -dTươ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-proxyvàinternal-node.localhayinternal-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