من اخیراً سرور مجازی را تغییر دادم و مجبور شدم دوباره همه چیز را پیکربندی کنم. من ترجیح می دهم که سایت از طریق https قابل دسترسی باشد و گواهی نامه های letsencrypt به طور خودکار دریافت و تمدید شوند. این را می توان با استفاده از دو تصویر داکر nginx-proxy و nginx-proxy-companion به دست آورد.
این راهنمای نحوه راهاندازی یک وبسایت در Docker با پروکسی است که به طور خودکار گواهیهای SSL را دریافت میکند. از سرور مجازی CentOS 7 استفاده شده است.
من فرض می کنم که سرور قبلا خریداری شده، پیکربندی شده است، با استفاده از یک کلید وارد شده است، fail2ban نصب شده است، و غیره.
ابتدا باید docker را نصب کنید.
- ابتدا باید وابستگی ها را نصب کنید
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- مخزن را وصل کنید
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- سپس نسخه docker Community را نصب کنید
$ sudo yum install docker-ce docker-ce-cli containerd.io
- داکر را به راه اندازی اضافه کنید و اجرا کنید
$ sudo systemctl enable docker $ sudo systemctl start docker
- یک کاربر به گروه docker اضافه کنید تا بتوانید docker را بدون sudo اجرا کنید
$ usermod -aG docker user
مرحله بعدی نصب docker-compose است. این ابزار به چندین روش قابل نصب است، اما من ترجیح می دهم از طریق pip manager و virtualenv نصب کنم تا سیستم را با بسته های غیر ضروری شلوغ نکنم.
- پیپ را نصب کنید
$ sudo yum install python-pip
- virtualenv را نصب کنید
$ pip install virtualenv
- در مرحله بعد باید یک پوشه با پروژه ایجاد کنید و آن را مقداردهی اولیه کنید. پوشه ای با هر آنچه برای مدیریت بسته ها نیاز دارید ve نامیده می شود.
$ mkdir docker $ cd docker $ virtualenv ve
- برای شروع استفاده از محیط مجازی باید دستور زیر را در پوشه پروژه اجرا کنید.
$ source ve/bin/activate
- می توانید docker-compose را نصب کنید.
pip install docker-compose
برای اینکه کانتینرها یکدیگر را ببینند، یک شبکه ایجاد می کنیم. به طور پیش فرض، از درایور پل استفاده می شود.
$ docker network create network
در مرحله بعد باید docker-compose را پیکربندی کنید، پروکسی در پوشه پروکسی، سایت تست در پوشه تست قرار خواهد گرفت. به عنوان مثال، من از نام دامنه example.com استفاده می کنم
$ mkdir proxy $ mkdir test $ touch proxy/docker-compose.yml $ touch test/docker-compose.yml
محتوا proxy/docker-compose.yml
version: '3' networks: default: external: name: network services: nginx-proxy: container_name: nginx-proxy image: jwilder/nginx-proxy ports: - 80:80 - 443:443 volumes: - certs:/etc/nginx/certs - vhost.d:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro nginx-proxy-letsencrypt: container_name: nginx-proxy-letsencrypt image: jrcs/letsencrypt-nginx-proxy-companion volumes: - certs:/etc/nginx/certs - vhost.d:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro environment: - NGINX_PROXY_CONTAINER=nginx-proxy volumes: certs: vhost.d: html:
متغیر محیطی NGINX_PROXY_CONTAINER لازم است ظرف letsencrypt ظرف پراکسی را ببیند. پوشه های /etc/nginx/certs /etc/nginx/vhost.d و /usr/share/nginx/html باید توسط هر دو کانتینر به اشتراک گذاشته شود. برای اینکه کانتینر letsencrypt به درستی کار کند، برنامه باید در پورت 80 و 443 قابل دسترسی باشد.
محتوا test/docker-compose.yml
version: '3' networks: default: external: name: network services: nginx: container_name: nginx image: nginx:latest environment: - VIRTUAL_HOST=example.com - LETSENCRYPT_HOST=example.com - [email protected]
در اینجا، متغیرهای محیطی مورد نیاز هستند تا پروکسی به درستی درخواست سرور را پردازش کند و یک گواهی برای نام دامنه صحیح درخواست کند.
تنها چیزی که باقی می ماند اجرای docker-compose است
$ cd proxy $ docker-compose up -d $ cd ../test $ docker-compose up -d
منبع: www.habr.com