การรัน Samba บน Mac M Series ผ่าน Docker เป็นทางเลือกในการพัฒนาโปรแกรมที่ใช้ login โดย Active Directory Domain Controller ที่จริง ๆ แล้วเป็นระบบใน Windows Server
การสร้าง Docker container เพื่อ run Samba
- สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
mkdir -p /Users/Shared/Portable/ad-samba-m - ไปที่ folder
cd /Users/Shared/Portable/ad-samba-m - สร้างไฟล์
touch docker-compose.yml - ใส่เนื้อหา
services: ad-samba-m: build: . cap_add: - SYS_ADMIN # Required for Samba AD DC container_name: ad-samba-m-dev dns: - 127.0.0.1 environment: - SAMBA_ADMIN_PASSWORD=Uv6VUzP3e6xe - SAMBA_DNS_FORWARDER=8.8.8.8 - SAMBA_DOMAIN=phunsanit - SAMBA_REALM=PHUNSANIT.LOCAL ports: - "135:135" # RPC - "139:139" # NetBIOS - "3268:3268" # GC - "3269:3269" # GC SSL - "389:389" # LDAP TCP - "389:389/udp" # LDAP UDP - "445:445" # SMB - "464:464" # Kerberos Change Pwd TCP - "464:464/udp" # Kerberos Change Pwd UDP - "53:53" # DNS TCP - "53:53/udp" # DNS UDP - "636:636" # LDAPS - "88:88" # Kerberos TCP - "88:88/udp" # Kerberos UDP restart: unless-stopped volumes: - data:/var/lib/samba - ./config:/etc/samba volumes: data: name: ad-samba-data
SAMBA_ADMIN_PASSWORD=Uv6VUzP3e6xe- คืออะไร: รหัสผ่านของ User
Administratorของโดเมน - ความสำคัญ: คุณต้องใช้รหัสนี้ในการ Login ผ่านเครื่องมือจัดการ AD หรือใช้ในการ Join Domain ของเครื่อง Client อื่น ๆ
- Security: เนื่องจากรหัสนี้อยู่ในไฟล์
docker-compose.ymlอย่าลืมระวังเรื่องการเผลอ Push ไฟล์นี้ขึ้น Public Repo นะครับ
- คืออะไร: รหัสผ่านของ User
SAMBA_DNS_FORWARDER=8.8.8.8- คืออะไร: คือการบอกให้ Samba AD (ซึ่งทำหน้าที่เป็น DNS Server ในตัว) ว่า “ถ้าหาชื่อเว็บหรือ Domain ไหนไม่เจอ ให้ไปถามใครต่อ”
- ทำไมต้องมี: เมื่อคุณตั้งให้เครื่อง Client มาชี้ DNS ที่ Container นี้เพื่อให้รู้จัก
phunsanit.localถ้าแอปนั้นอยากจะออกไป Google ตัว Samba จะไม่รู้จัก มันจึงต้อง “ส่งต่อ” (Forward) คำถามนั้นไปที่8.8.8.8เพื่อให้แอปยังใช้งานอินเทอร์เน็ตได้ปกตินั่นเองครับ
SAMBA_DOMAIN=phunsanit- ชื่อโดเมน มักจะใส่ในตัวแปรชื่อ
DOMAINหรือSAMBA_DOMAIN
- ชื่อโดเมน มักจะใส่ในตัวแปรชื่อ
SAMBA_REALM=PHUNSANIT.LOCAL- คืออะไร: คือชื่อ Kerberos Realm
- ความสำคัญ: ในโลกของ AD ตัว Realm คือชื่อโดเมนในระดับ Authentication ครับ มันจะใช้ร่วมกับชื่อ User เช่น
[email protected] - Tip: ปกติควรตั้งให้ตรงกับ Domain Name ของคุณแต่เป็นตัวพิมพ์ใหญ่ครับ
- สร้างไฟล์
touch entrypoint.sh - ใส่เนื้อหา
#!/bin/bash set -e # Define variables DOMAIN=${SAMBA_DOMAIN:-SAMDOM} REALM=${SAMBA_REALM:-SAMDOM.EXAMPLE.COM} ADMIN_PASSWORD=${SAMBA_ADMIN_PASSWORD:-Password123!} DNS_FORWARDER=${SAMBA_DNS_FORWARDER:-8.8.8.8} # Check if Samba is already provisioned # Check if Samba is already provisioned if [[ ! -f /etc/samba/smb.conf ]] || [[ ! -f /var/lib/samba/private/sam.ldb ]]; then echo "Provisioning Samba AD DC..." # Remove default smb.conf if it exists rm -f /etc/samba/smb.conf # Provision the domain samba-tool domain provision \ --server-role=dc \ --use-rfc2307 \ --dns-backend=SAMBA_INTERNAL \ --realm="$REALM" \ --domain="$DOMAIN" \ --adminpass="$ADMIN_PASSWORD" \ --option="dns forwarder = $DNS_FORWARDER" # Copy kerberos config if [ -f /var/lib/samba/private/krb5.conf ]; then cp /var/lib/samba/private/krb5.conf /etc/krb5.conf fi # --- Add Sample Users --- echo "Creating sample users..." # Function to create user if not exists create_user () { local username="$1" local password="$2" samba-tool user create "$username" "$password" || true # Ignore error if exists echo "Created user: $username" } # Add users (Username Password) create_user "phunsait" "Password123!" create_user "pitt.p" "Password123!" create_user "plusmagi" "Password123!" echo "Samba AD DC provisioned successfully with sample users." else echo "Samba AD DC already provisioned." fi # Start Samba exec samba -i -M standard - ติดตั้งและรัน
docker compose up -d
การทดสอบ
docker logs -f ad-samba-m-dev
การเพิ่ม Users
ระบบมี Script สำหรับเพิ่ม Sample Users ให้รันคำสั่งนี้ใน Host
docker exec -it ad-samba-m-dev samba-tool user create username password123
อ่านเพิ่มเติม