Skip to main content

Docker Swarm Secret

🔐 Implementasi Using Secrets dengan Docker Swarm​

Pada Docker Swarm, secret digunakan untuk menyimpan data sensitif seperti:

  • Password database
  • API key
  • Token
  • Sertifikat SSL

Swarm akan:

  • Menyimpan secret dalam bentuk encrypted (Raft log encryption)
  • Mengirim secret hanya ke node yang menjalankan service terkait
  • Me-mount secret sebagai file di /run/secrets/
  • Tidak menyimpannya di image atau environment variable

1️⃣ Konsep Dasar​

Saat kita membuat secret:

echo "mypassword123" | docker secret create db_password -

Secret tersebut:

  • Disimpan di manager node
  • Tidak bisa dibaca langsung (hanya bisa di-attach ke service)

2️⃣ Contoh Implementasi Lengkap​

Misalnya kita ingin menjalankan MySQL di Swarm dengan password menggunakan secret.

  • Step 1 — Inisialisasi Swarm (jika belum ada)​

docker swarm init
  • Step 2 — Buat Secret​

echo "StrongRootPass123!" | docker secret create mysql_root_password -

Cek secret:

docker secret ls
  • Step 3 — Deploy Service dengan Secret​

docker service create \
--name mysql \
--secret mysql_root_password \
-e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password \
mysql:8.0

Perhatikan:

  • Kita menggunakan MYSQL_ROOT_PASSWORD_FILE
  • Bukan MYSQL_ROOT_PASSWORD

Karena secret akan tersedia sebagai file di:

/run/secrets/mysql_root_password

3️⃣ Implementasi Menggunakan Docker Compose (Stack)​

File docker-stack.yml:

version: "3.8"

services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
secrets:
- mysql_root_password
volumes:
- db_data:/var/lib/mysql

volumes:
db_data:

secrets:
mysql_root_password:
external: true

Deploy stack:

docker stack deploy -c docker-stack.yml mystack

4️⃣ Cara Aplikasi Membaca Secret​

Di dalam container, secret tersedia sebagai file.

Contoh di Spring Boot:

spring.datasource.password=${MYSQL_PASSWORD:}

Lalu di entrypoint script:

export MYSQL_PASSWORD=$(cat /run/secrets/mysql_root_password)

Atau langsung gunakan _FILE variable jika image mendukungnya.

5️⃣ Best Practices di Production​

✅ 1. Jangan pakai environment variable untuk password​

Environment variable bisa terlihat lewat:

docker inspect

✅ 2. Gunakan Stack bukan service manual​

Karena stack lebih rapi untuk production deployment.

✅ 3. Gunakan Secret Rotation​

Untuk mengganti secret:

docker secret create mysql_root_password_v2 newpass.txt
docker service update --secret-rm mysql_root_password \
--secret-add mysql_root_password_v2 mysql

✅ 4. Gunakan Network Terpisah (Frontend–Backend)​

Seperti arsitektur yang sebelumnya kamu buat:

  • Nginx → frontend network
  • App → backend network
  • DB → backend only

Secret hanya diberikan ke service yang membutuhkan.

6️⃣ Perbedaan Secret vs Config​

FeatureSecretConfig
Data sensitif✅❌
Encrypted✅❌
File mount✅✅
Cocok untukPasswordFile konfigurasi

7️⃣ Keamanan Internal Swarm​

Secret pada Docker Swarm:

  • Disimpan encrypted dalam Raft log
  • Hanya dikirim ke node yang menjalankan task
  • Hilang saat container dihentikan
  • Tidak masuk ke image layer

🔎 Cek Secret di Container​

Masuk ke container:

docker exec -it <container_id> sh
cat /run/secrets/mysql_root_password