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