สร้าง docker image สำหรับ MS SQL Server 2019
18 June 2021
เห็น Microsoft มีการออก MS SQL Server ที่ทำงานบน Linux ได้ และมีการนำมาทำเป็น docker image ทำให้สามารถสร้าง database server ที่เป็น MS SQL Server ขึ้นมาได้อย่างรวดเร็ว วันนี้เลยมาลองทำดูครับ โดยจะใช้เครื่อง server เป็น ubuntu linux (ขอบคุณ GCP ที่มีเครื่องให้ใช้ทำ blog มาตลอด)
หลังจากได้เครื่องมาแล้วก็ทำการติดตั้ง docker และ docker-compose กันก่อน ถ้าใครยังไม่เคยลงให้ไปอ่านวิธีการลงได้ที่นี้ครับ
เสร็จแล้วก็มาเริ่มกันเลย
โดยเรามาเริ่มจากการสร้าง directory ที่จะใช้สำหรับสร้าง file ต่าง ๆ ที่เกี่ยวข้องในการสร้าง docker image ขึ้นมาก่อนครับ โดยในที่นี้จะสร้างไว้ใน “/opt/mssql” โดยใช้คำสั่ง
sudo mkdir -p /opt/mssql
จากนั้นให้เปลี่ยน directory เข้าไปทำงานที่ /opt/mssql
cd /opt/mssql
โดยในการสร้าง docker image เราจะมีการสร้าง file ขึ้นมาจำนวน 5 files ดังนี้
- Dockerfile สำหรับใช้สร้าง image
- entrypoint.sh ใช้สำหรับเป็นคำสั่ง start mssql หลัง docker container ทำงาน
- initialize.sh และ init-db.sql สำหรับใช้สร้าง database ครั้งแรก
- docker-compose.yml สำหรับใช้ start container
- .env file กำหนดชื่อ project
จากนั้นให้สร้าง file ชื่อ “Dockerfile” โดยใช้ scipt ตามนี้
# Dockerfile
# https://hub.docker.com/_/microsoft-mssql-server
FROM mcr.microsoft.com/mssql/server:2019-CU11-ubuntu-18.04
EXPOSE 1433
WORKDIR /app
COPY ./entrypoint.sh ./
COPY ./initialize.sh ./
COPY ./init-db.sql ./
USER root
RUN chmod +x ./entrypoint.sh
RUN chmod +x ./initialize.sh
ENTRYPOINT ["./entrypoint.sh"]
สร้าง file “entrypoint.sh”
#!/bin/bash
# entrypoint.sh
# Exit immediately if a command exits with a non-zero status.
set -e
# Run initialize.sh and start SQL Server
./initialize.sh & /opt/mssql/bin/sqlservr
สร้าง file “initialize.sh”
#!/bin/bash
# initialize.sh
# How to connect to SQL Server:
# https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash#connect-to-sql-server
# sqlcmd Utility options: https://docs.microsoft.com/en-us/sql/tools/sqlcmd-utility?view=sql-server-ver15#syntax
INPUT_SQL_FILE="init-db.sql"
until /opt/mssql-tools/bin/sqlcmd -S localhost,1433 -U sa -P "$MSSQL_SA_PASSWORD" -i $INPUT_SQL_FILE > /dev/null 2>&1
do
echo -e "\033[31mSQL server is unavailable - sleeping"
sleep 1 # Sleep in a second
done
echo -e "\033[31mDone initialize a database"
สร้าง file “init-db.sql”
-- init-db.sql
CREATE DATABASE my-db;
สร้าง file “docker-componse.yml” (file yml มีความสำคัญเรื่องการเว้นวรรคนะครับ หากเว้นวรรคผิดอาจทำให้ทำงานผิดได้ครับ)
https://dynatrace-apac.github.io/bootcamp# docker-compose.yml
# https://docs.docker.com/compose/compose-file/compose-file-v3/
version: "3.8"
services:
db:
build:
context: .
dockerfile: Dockerfile
container_name: ${COMPOSE_PROJECT_NAME:?err}_db
ports:
- 1433:1433
volumes:
- mssql_data:/var/opt/mssql/data
- mssql_log:/var/opt/mssql/log
- mssql_backup:/var/opt/mssql/backup
# https://docs.docker.com/compose/compose-file/compose-file-v3/#environment
environment:
# List of SQL Server environment variables
# https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-ver15#environment-variables
- ACCEPT_EULA=Y
- MSSQL_PID=Express
- MSSQL_SA_PASSWORD=12345Abc$$ # Escape $ with $$
- MSSQL_DATA_DIR=/var/opt/mssql/data
- MSSQL_LOG_DIR=/var/opt/mssql/log
- MSSQL_BACKUP_DIR=/var/opt/mssql/backup
- MSSQL_COLLATION=Thai_CI_AS
networks:
- compose_network
# Create name volumes managed by Docker to not lose data when remove a container
# https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes
volumes:
mssql_data:
mssql_log:
mssql_backup:
networks:
compose_network:
สร้าง file “.env”
# .env
# https://docs.docker.com/compose/reference/envvars/#compose_project_name
# Explicitly set volume's prefix or use -P with a docker run command.
COMPOSE_PROJECT_NAME=sql_server_compose
หลังจากที่เราสร้าง file ทั้งหมดเสร็จแล้วเราจะได้ file ทั้งหมดดังนี้
จากใน file docker-compose.yml เราจะเห็นว่ามีการอ้างอิง volume ที่ใช้สำหรับเก็บข้อมูลต่าง ๆ ของ MS SQL Server ดังนี้
เราจึงต้องสร้างที่เก็บข้อมูลเพื่อให้สามารถ map กับ volume ใน docker-compose.yml ได้ โดยใช้คำสั่ง
sudo mkdir -p /var/opt/mssql/data
sudo mkdir -p /var/opt/mssql/log
sudo mkdir -p /var/opt/mssql/backup
ตอนนี้เราก็พร้อมที่จะสร้าง docker image สำหรับ MS SQL Server กันแล้วครับ 😄
โดยใช้คำสั่ง
sudo docker build .
ใช้เวลาตั้งแต่เริ่มสร้างจนเสร็จ ประมาณ 2 นาที
image มีขนาด 1.43GB
ถึงตอนนี้เรามี image พร้อมที่จะนำมาใช้สร้างเป็น MS SQL Server แล้ว จากนี้เรามาลอง run กัน โดยใช้คำสั่ง
sudo docker-compose up -d
หลังจาก MS SQL Server start ขึ้นมาแล้ว เราจะพบว่ามี port 1433 LISTEN ขึ้นมา
เรามาทดสอบกันโดยใช้โปรแกรม dbeaver connect ไปที่ database server ที่เราเพิ่งสร้างขึ้น โดยมีข้อมูลสำหรับสร้าง connection ดังนี้
Host=34.122.171.4 (หมายเลข ip ตามเครื่องที่สร้าง)Port=1433 (default port number, you can ignore)Database=my-dbUsername=saPassword=12345Abc$
เสร็จแล้วลองกดปุ่ม “Test Connection”
ผลทดสอบ → ผ่านเป็นที่เรียบร้อย
ลองทดสอบสร้าง database “my-db” สร้าง table “employee” ลอง insert ข้อมูลเข้าไปก็ผ่านทุกขั้นตอน
เรียบร้อยครับ เท่านี้เราก็มี image สำหรับสร้างเครื่อง MS SQL Server เอาไว้ใช้งานแล้ว 😄