[DOCKER] สร้าง Dockerfile ที่มี User ที่จำเป็นสำหรับ DB2 ครับ

สวัสดีครับ Blog ตอนนี้น่าจะเป็น Blog ที่เกี่ยวกับ Docker อันแรกมั้งๆ ปกติผมจะใช้ Virtual Machine ในการทำงานมากกว่าครับ โดยสำหรับผมได้เอา Docker Image ของ DB2 มาใช้งานครับ โดยจะเป็น Version 11 Fixed Pack 3 ซึ่งเมื่อผม pull ลงมาแล้ว ปรากฏว่าลองอ่าน Document แล้ว ตัว Docker Image มันมีแต่ user db2inst1 เป็นหลักครับ แต่ Database ที่ผมต้องการจะเอามาขึ้นในส่วนของ Application มันต้องการใช้ มี

  • username banana password banana
  • username ingressfun password ingressfun

- แบบที่ 1 : หลังจาก docker run ไปแล้ว เข้า terminal ไปแก้

หลังจาก docker run ไปแล้ว เข้า terminal ของ container ด้วยคำสั่ง docker exec -it <CONTAINER_ID> bash  เช่น docker exec -it 4484a421c205 bash  ครับ

  • แล้วเขียนคำสั่งเพิ่ม user กำหนด password ครับ
  • วิธีนี้มีข้อเสีย คือ ถ้าต้องการสร้าง Container ใหม่ก็ต้องเข้าไปไล่ Run Script ให้

- แบบที่ 2 : ทำ Dockerfile ดีกว่า

ทำ dockerfile ดีกว่า โดยผมทำ image file แยกออกมาอีกอันเลย เอาไว้ใช้งานในองค์กรครับ เอาไปฝากไว้ใน Nexus ก็ได้ครับ (ผมเลือกวิธีนี้นะครับ มาเริ่มกัน)

  • ก่อนอื่นสร้าง Folder ก่อนเลย
  • สร้าง Dockerfile ขึ้นมา โดยเจ้าตัว Docker File มัน คือ ชุดคำสั่ง ที่เราใช้ในเพิ่มความสามารถไปครับ
  • จากโจทย์ที่ผมต้องการ ผมได้สร้าง Dockerfile ตามนี้ครับ
FROM store/ibmcorp/db2_developer_c:11.1.3.3a-x86_64  
LABEL maintainer="Chatri Ngambenchawong"

RUN useradd -ms /bin/bash banana
RUN echo "banana:banana" | chpasswd
RUN useradd -ms /bin/bash ingressfun
RUN echo "ingressfun:ingressfun" | chpasswd
RUN yum -y reinstall glibc-common
RUN sudo localedef -f TIS-620 -i th_TH th_TH%MCEPASTEBIN%
  • มาดูในรายละเอียดครับ ของ dockerfile ครับ
    • FROM  ผมได้ Extend เพิ่มความสามารถมาจาก image เดิมของ DB2 ครับ
    • LABEL  ใส่อะไรก็ได้ เป็น information แต่ต้องอยู่ในรูปแบบ key:value
    • RUN  ใส่คำสั่งที่ต้องการ execute ครับ
ตรงนี้ผมจะเพิ่มคำสั่งสำหรับเพิ่ม user banana และ user ingressfun ครับ
RUN useradd -ms /bin/bash banana
RUN echo "banana:banana" | chpasswd
RUN useradd -ms /bin/bash ingressfun
RUN echo "ingressfun:ingressfun" | chpasswd

#============================
และส่วนถัดมา ผมเพิ่มคำสั่งที่จำเป็นสำหรับการติดตั้งภาษาไทย TIS-620 ลงใน RedHat/CentOS ครับ
RUN sudo localedef -f TIS-620 -i th_TH th_TH%MCEPASTEBIN%
  • ลองรันครับ ด้วยคำสั่ง docker build -t "invdb211:11fp3" . ครับ
    • ของผมมีการเพิ่ม -t "invdb211:11fp3"  เพื่อกำหนด Repository : Tag ให้เรียกใช้ง่ายๆครับ
    • ส่วน .  อันนี้หมายถึงว่า dockerfile ของผมมันอยู่ใน Folder ที่กำหนดแล้วครับ ถ้า dockerfile อีกที่ path อื่นก็ใช้ path ลงไปครับ
  • ระหว่าง Build มี Log แสดงให้เห็นครับ
Step 1/6 : FROM store/ibmcorp/db2_developer_c:11.1.3.3a-x86_64
 ---> 18585aea3e7b
Step 2/6 : LABEL maintainer="Chatri Ngambenchawong"
 ---> Running in 7c1bad3fa83b
Removing intermediate container 7c1bad3fa83b
 ---> a9fbe0b892fb
Step 3/6 : RUN useradd -ms /bin/bash banana
 ---> Running in 7bd11b257970
Removing intermediate container 7bd11b257970
 ---> 630236a8b302
Step 4/6 : RUN echo "banana:banana" | chpasswd
 ---> Running in d0f38091cb95
Removing intermediate container d0f38091cb95
 ---> d95994738b43
Step 5/6 : RUN useradd -ms /bin/bash ingressfun
 ---> Running in 37e4e90c4cd4
Removing intermediate container 37e4e90c4cd4
 ---> a15e7ad12d96
Step 6/6 : RUN echo "ingressfun:ingressfun" | chpasswd
 ---> Running in 972788993cc8
Removing intermediate container 972788993cc8
 ---> 10bd4f9421d9
Successfully built 10bd4f9421d9
Successfully tagged invdb211:11fp3
  • บิ้วเสร็จลองมาดูว่ามี Image ที่พึ่งสร้างด้วยคำสั่ง docker images  ครับ
  • ลองเอา Image มาสร้าง Container ด้วยคำสั่ง docker run --name ERPPROD --restart=always --privileged --ipc=host -p 50003:50000 --env-file /home/adminping/ERPPROD/ERPPROD.env_list -v /home/adminping/ERPPROD/:/database 10bd4f9421d9 ครับ
    • --ipc=host -p 50003:50000  map Port Host = 50003 กับ Port ของ Container 50000
    • --env-file ใส่ Config สำหรับ Initial Container ครับ
    • -v /home/adminping/ERPPROD/:/database  map Volume จาก Host ที่ Path /home/adminping/ERPPROD/  โดยใน Container จะรู้จักชื่อโพลเดอร์ /database
    • 10bd4f9421d9  Id ของ Image ครับ เราจะรู้หลังจาก Run
  • มองลองตรวจกันว่า user ที่ผมเพิ่มสร้างไปมีใน DB2 หรือป่าว โดยเข้าไปใน Docker Image ของ DB2 ด้วยคำสั่ง  docker exec -it bash  เช่น docker exec -it 4484a421c205 bash  ครับ จากนั้นลอง list user ด้วยคำสั่ง cut -d: -f1 /etc/passwd  ครับ ผลลัพธืที่ได้ต้องมี User
    • banana
    • ingressfun

สำหรับวิธีที่ 2 นั้นเห็นว่ามันมีความเป็น Automation มากขึ้นครับ และในตัว dockerfile จริงๆ เราสามารถเขียนให้มันไปอ่าน Backup DB ให้ Path ที่ Map ไว้ แล้วให้มัน Restore ต่อได้เลยก็ได้ครับ ^__^


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.