ติดตั้งและใช้ Docker บน Mac

ในบทความ ออกแบบฐานข้อมูล Simple bank เราได้เรียนรู้วิธีการออกแบบฐานข้อมูล schema ด้วย dbdiagram.io


ในบทความนี้เราจะมาเรียนรู้วิธีติดตั้ง Docker Desktop บนเครื่อง local จากนั้นดาวน์โหลดและเริ่มต้นคอนเทนเนอร์ PostgreSQL

Docker คือ engine ตัวหนึ่งที่มีการทำงานในลักษณะจำลองสภาพแวดล้อมขึ้นมาบนเครื่อง server เพื่อใช้ในการ run service ที่ต้องการ มีการทำงานคล้ายคลึงกับ Virtual Machine เช่น VMWare, VirtualBox, XEN, KVM

นอกจากนี้เรายังจะได้เรียนรู้วิธีตั้งค่าและใช้ TablePlus เพื่อเชื่อมต่อและโต้ตอบกับ Postgres และใช้เพื่อเรียกใช้สคริปต์ SQL ที่เราสร้างขึ้นในครั้งก่อนเพื่อสร้างสคีมาฐานข้อมูลของ Simple Bank

ติดตั้งและใช้ Docker บน Mac


ติดตั้ง docker desktop

เริ่มต้นด้วยการติดตั้ง docker desktop บน Mac เราเพียงแค่ต้องเปิดเว็บไซต์ docker website  นี้แล้วคลิกดาวน์โหลด



หลังจากดาวน์โหลดตัวติดตั้งแล้ว เราก็เปิดมันขึ้นมา แล้วลาก Docker ไปที่โฟลเดอร์ Applications และนั่นแหล่ะ! ติดตั้งเดสก์ท็อป Docker สำเร็จแล้ว



มาเปิดแอปกันเถอะ! จะใช้เวลาสักครู่เพื่อให้ docker desktop เริ่มทำงาน คุณสามารถดูสถานะได้โดยคลิกที่ไอคอนนี้


เริ่มต้นจะเป็นวงกลมสีเทา ต่อมาจะเปลี่ยนเป็นวงกลมเปลี่ยนเป็นสีเขียว แสดงว่าเดสก์ท็อป Docker เริ่มทำงานและพร้อมใช้งาน


ตอนนี้มาเปิดเทอร์มินัลแล้วลองใช้งาน เราใช้คำสั่ง docker ps เพื่อแสดงรายการคอนเทนเนอร์ที่ทำงานอยู่ทั้งหมด ขณะนี้รายการว่างเปล่าเนื่องจากเรายังไม่ได้เรียกใช้คอนเทนเนอร์ใดๆ

docker ps



ถ้าเราเรียก docker images เพื่อแสดงรายการ docker desktop ที่มีอยู่ทั้งหมด ตอนนี้ยังว่าง

docker images



Pull Postgres image


ราจะใช้ PostgreSQL เป็นกลไกจัดการฐานข้อมูลสำหรับแอปของเรา ไปที่ Docker Hub เพื่อค้นหา image


มีหลายผลลัพธ์ แต่เราจะใช้อันแรก https://hub.docker.com/_/postgres เพราะเป็นอิมเมจ Postgres อย่างเป็นทางการ


ดังที่คุณเห็นที่นี่ เราสามารถเรียกใช้ docker pull postgres เพื่อรับภาพนี้ การดำเนินการนี้จะดึง image ที่มีแท็กล่าสุด ในกรณีนี้คือเวอร์ชัน 12

มีรุ่นอื่น ๆ อีกมากมายที่มีแท็กต่างกันเช่นกัน ฉันมักใช้ภาพอัลไพน์ เนื่องจากมีขนาดเล็กมาก ด้วยการกระจายลินุกซ์แบบอัลไพน์น้ำหนักเบา

มาเปิดเทอร์มินัลแล้วเรียกใช้:

docker pull postgres:12-alpine


Docker port mapping


นั่นหมายความว่าอย่างไร?

โดยทั่วไป คอนเทนเนอร์ docker จะทำงานในเครือข่ายเสมือนที่แยกจากกัน ซึ่งแตกต่างจากเครือข่ายโฮสต์ที่เราใช้งานอยู่

ดังนั้นเราจึงไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ Postgres ที่ทำงานบนพอร์ต 5432 ของเครือข่ายคอนเทนเนอร์ได้ เว้นแต่เราจะบอกให้นักเทียบท่าสร้าง “bridge” ประเภทใดประเภทหนึ่งระหว่างเครือข่าย localhost ของเรากับเครือข่ายของคอนเทนเนอร์

เราทำโดยใช้แฟล็ก -p จากนั้นระบุพอร์ตของเครือข่ายโฮสต์ ตามด้วยโคลอน จากนั้นจึงระบุพอร์ตที่เกี่ยวข้องของคอนเทนเนอร์ พวกเขาไม่จำเป็นต้องเหมือนกัน แต่ฉันมักใช้พอร์ตเดียวกันเพื่อให้จำได้ง่ายขึ้น

docker run --name postgres12 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=secret -p 5432:5432 -d postgres:12-alpine



ตอนนี้เมื่อเรากด Enter Docker จะเริ่มคอนเทนเนอร์ Postgres และส่งคืน ID ที่ไม่ซ้ำกันแบบยาว


เราสามารถแสดงรายการคอนเทนเนอร์ที่รันอยู่ทั้งหมดด้วยคำสั่ง

docker ps



  • ดังที่คุณเห็นที่นี่ ID คอนเทนเนอร์นี้เป็นคำนำหน้าสั้น ๆ ของคำนำหน้าแบบยาวที่ docker desktop ส่งคืนในคำสั่งก่อนหน้า
  • ชื่อ image คือ postgres พร้อมแท็ก 12-alpine ถ้าเรารัน docker images เราจะเห็นว่ามันเป็นอิมเมจเดียวกันกับที่เราเคยดึงมาก่อนด้วยคำสั่ง docker pull
  • มีข้อมูลเพิ่มเติมหลายอย่าง เช่น เวลาที่สร้างของคอนเทนเนอร์ หรือสถานะของคอนเทนเนอร์
  • และการแมปพอร์ตอย่างที่เราคาดไว้ก็คือการแมปพอร์ต 5432 บน localhost กับพอร์ตเดียวกันในคอนเทนเนอร์
  • และสุดท้ายคือชื่อคอนเทนเนอร์ ซึ่งก็คือ postgres12 ตามที่เราตั้งค่าไว้ในคำสั่ง docker run


ติดตั้ง Table Plus


แสดงวิธีอื่นที่ง่ายกว่าในการจัดการและเล่นกับฐานข้อมูลโดยใช้ Table Plus

Table Plus เป็นเครื่องมือ GUI ที่สามารถพูดคุยกับกลไกฐานข้อมูลประเภทต่างๆ เช่น PostgreSQL, MySQL, Mongo, Redis เป็นต้น ใช้งานง่ายมากและจะช่วยให้เราพัฒนาได้เร็วขึ้นมาก ไปที่ tableplus.com เพื่อดาวน์โหลด



Create a new connection


ตอนนี้เรามาเปิดแอปกัน ยังไม่มีการเชื่อมต่อ db มาสร้างใหม่


มีตัวเลือกกลไกฐานข้อมูลมากมาย แต่ในกรณีของเรา เราใช้ PostgreSQL


  • ตอนนี้เราป้อนชื่อของการเชื่อมต่อ โดยจะเรียกมันว่า postgres12
  • โฮสต์คือ localhost (หรือ 127.0.0.1) และพอร์ตคือ 5432 โดยค่าเริ่มต้น
  • ชื่อผู้ใช้คือ root และรหัสผ่านเป็น secret เนื่องจากเรากำหนดค่าเมื่อรันคอนเทนเนอร์ postgres
  • ชื่อฐานข้อมูลเริ่มต้นคือ root เช่นเดียวกับชื่อผู้ใช้ เนื่องจากเราไม่ได้กำหนดค่าไว้อย่างชัดเจนเมื่อเริ่มต้นคอนเทนเนอร์


มาคลิก Connect ทดสอบเพื่อทดสอบการเชื่อมต่อกัน


ตอนนี้เราสามารถคลิก เชื่อมต่อ เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูล


ขณะนี้ทุกอย่างว่างเปล่าเนื่องจากเรายังไม่ได้สร้างสคีมา แต่เรายังคงสามารถเรียกใช้คิวรีบางรายการได้โดยคลิกที่ไอคอน SQL แล้วลองเขียนคำสั่ง

select now(); 


จากนั้นคลิกปุ่ม Run Current ผลลัพธ์จะปรากฏ วันที่และ เวลา ในส่วนด้านล่าง




Create Simple Bank schema


ตอนนี้ มาเปิดไฟล์ Simple_bank.sql ที่เราได้สร้างขึ้นในการสร้างจากบทความ ออกแบบฐานข้อมูล Simple bank  จากนั้นเลือกคลุมข้อมูลทั้งหมดในไฟล์นี้ แล้วกด Run Current เพื่อเรียกใช้


CREATE TABLE "accounts" (
  "id" bigserial PRIMARY KEY,
  "owner" varchar NOT NULL,
  "balance" bigint NOT NULL,
  "currency" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT (now())
);

CREATE TABLE "entries" (
  "id" bigserial PRIMARY KEY,
  "account_id" bigint NOT NULL,
  "amount" bigint NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT (now())
);

CREATE TABLE "transfers" (
  "id" bigserial PRIMARY KEY,
  "from_account_id" bigint NOT NULL,
  "to_account_id" bigint NOT NULL,
  "amount" bigint NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT (now())
);

ALTER TABLE "entries" ADD FOREIGN KEY ("account_id") REFERENCES "accounts" ("id");

ALTER TABLE "transfers" ADD FOREIGN KEY ("from_account_id") REFERENCES "accounts" ("id");

ALTER TABLE "transfers" ADD FOREIGN KEY ("to_account_id") REFERENCES "accounts" ("id");

CREATE INDEX ON "accounts" ("owner");

CREATE INDEX ON "entries" ("account_id");

CREATE INDEX ON "transfers" ("from_account_id");

CREATE INDEX ON "transfers" ("to_account_id");

CREATE INDEX ON "transfers" ("from_account_id", "to_account_id");

COMMENT ON COLUMN "entries"."amount" IS 'can be negative or positive';

COMMENT ON COLUMN "transfers"."amount" IS 'must be positive';




ตอนนี้เมื่อเรากดปุ่ม refresh เพื่อรีเฟรช จะเห็นตาราง 3 ตารางที่แสดงทางด้านซ้าย คือ: accounts, entries และ transfers



เราสามารถคลิกที่ชื่อเพื่อดูข้อมูลหรือเลือกแท็บ Structure เพื่อดูโครงสร้างสคีมา


มีข้อมูลที่เป็นประโยชน์มากมาย เช่น name, data type, default value, foreign key, is nullable หรือไม่ เป็นต้น

Leave a Reply

Your email address will not be published. Required fields are marked *