Traefik'i Docker Container'lar için ters proxy olarak kullanma.
Öncelikle Docker üzerinde Traefik ve uygulama container'larının ortak çalışacağı bir network oluşturuyoruz.
docker network create web
Yeni oluşturduğumuz Docker Network'ümüzü güvenlik duvarı üzerinden yapılandırmamız gerekiyor. Bunun için aşağıdaki adımları takip ediyoruz.
- Yeni oluşturduğumuz Docker Network'ümüzün VPS üzerindeki Connection DEVICE bilgisine erişmemiz gerekiyor. Docker Network'lerini listeliyoruz.
docker network ls
Buradaki NETWORK_ID bilgisi ile VPS üzerindeki network bağlantılarımızı karşılaştırarak doğru bağlantıya yetkilendirme yapacağız.
- Daha sonra VPS üzerindeki network bağlantıları listeliyoruz.
nmcli connection show
DEVICE alanındaki değer ile bağlantımıza güvenlik duvarı üzerinden yetkilendirme yapacağız.
- Firewall üzerinden yeni oluşturduğumuz Docker Network'üne yetki tanımlıyoruz.
firewall-cmd --permanent --zone=trusted --change-interface=br-ff48477ab8a4
firewall-cmd --reload
Öncelikle Traefik Dashboard erişim için bir yönetici parolası oluşturacağız. Traefik yapılandırma dosyasında yönetici giriş bilgileri şifreli bir şekilde tutuluyor. Bu bilgileri iki şekilde şifreleyebilirsiniz.
Önce htpasswd
için gerekli paketleri yüklüyoruz.
sudo apt-get install apache2-utils
Daha sonra htpasswd
ile Dashboard için kullanacağımız şifreyi oluşturuyoruz. SECURE_PASSWROD
alanına kullanmak istediğini şifrenizi girin.
htpasswd -nb admin SECURE_PASSWROD
Programdan çıktı şu şekilde görünecektir:
admin:$apr1$9r5rUTis$nqG/J4R7365QtB7JBlc2N0
https://hostingcanada.org/htpasswd-generator/ adresi üzerinden Username
ve Password
alanlarını doldurduktan sonra Mode
alanını *Apache specific salted MD5 (insecure but common) seçerek şifrenizi oluşturabilirsiniz.
Traefik Dashboard şifremizi hazırlıladıktan sonra traefik.toml
dosyamızı hazırlıyoruz. Ben repo içerisine örnek bir dosya bıraktım.
Yapılandırma dosyamız aşağıdaki gibi görünecek;
defaultEntryPoints = ["http", "https"]
[entryPoints]
[entryPoints.dashboard]
address = ":8080"
[entryPoints.dashboard.auth]
[entryPoints.dashboard.auth.basic]
users = ["admin:YOUR_SECURE_PASSWORD"]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
certFile = "certs/yourdomain.com.crt"
keyFile = "certs/yourdomain.com.key"
[api]
entrypoint="dashboard"
[docker]
domain = "yourdomain.com"
watch = true
network = "web"
- Traefik'i bütün istekleri
https
üzerine yönlendireck şekilde yapılandırıyoruz. - Yayın yapacağımız adresimizin sertifika dosyasını örnekteki gibi
.key
ve.crt
olarak tanımlıyoruz. (Sertifika dosyamızı.key
ve.crt
olarak nasıl ayıracağımızı bu repoda anlattım; https://github.com/barisates/docker-registry-server#ssl-certificate) - Bir önceki adımda oluşturduğumu şifremiz
YOUR_SECURE_PASSWORD
kısmına gelecek.
Öncelikle Traefik için bir docker-compose
dosyası hazırlıyoruz. Ben repo içerisine örnek bir dosya bıraktım, içerik aşağıdaki gibi görünüyor;
version: "3"
services:
traefik:
network_mode: web
container_name: traefik
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- ./certs:/certs
ports:
- 80:80
- 443:443
labels:
- traefik.frontend.rule=Host:monitor.yourdomain.com
- traefik.port=8080
image: traefik:1.7.2-alpine
Daha sonra root
klasörüne gidiyoruz. Yapılandırma dosyamızı (traefik.toml), docker-compose ve sertifika dosyalarımızı bu dizine kopyalıyoruz. root
klasörümüz aşağıdaki gibi görünecektir.
root
│ traefik.toml
│ docker-compose.yml
└───certs
│ yourdomain.com.crt
│ yourdomain.com.key
Şimdi Treafik konteynırımızı çalıştırabiliriz;
docker-compose up -d
Docker komutları ile Traefik konteynırınızı başlatmak için;
docker run -d \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $PWD/traefik.toml:/traefik.toml \
-v $PWD/certs:/certs \
-p 80:80 \
-p 443:443 \
-l traefik.frontend.rule=Host:monitor.yourdomain.com \
-l traefik.port=8080 \
--network web \
--name traefik \
traefik
Artık aynı VPS üzerinde çalışan Docker konteynırlarınızı, SSL desteği ile birlikte barındırabilirsiniz. Örnek olarak bir uygulamayı yayına alalım;
version: "3"
services:
your-project-name:
image: registry.yourdomain.com/your-project:latest
network_mode: web
container_name: your-project-name
restart: always
labels:
- traefik.backend=your-project-name
- traefik.frontend.rule=Host:api.yourdomain.com
- traefik.docker.network=web
- traefik.port=80
Yukarıdaki şekilde bir ayarlama ile uygulamalarınızı Traefik ile yayına alabilirsiniz.