[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 bonanza password bonanza
  • username invest password invest

การแก้ไขมันมี 2 วิธีนะ

  • แบบที่ 1 : หลังจาก docker run ไปแล้ว เข้า terminal ของ container ด้วยคำสั่ง docker exec -it <CONTAINER_ID> bash  เช่น docker exec -it 4484a421c205 bash  ครับ
    • แล้วเขียนคำสั่งเพิ่ม user กำหนด password ครับ
    • วิธีนี้มีข้อเสีย คือ ถ้าต้องการสร้าง Container ใหม่ก็ต้องเข้าไปไล่ Run Script ให้
  • แบบที่ 2 : ทำ 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 bonanza 
      RUN echo "bonanza:bonanza" | chpasswd
      RUN useradd -ms /bin/bash invest
      RUN echo "invest:invest" | 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  ใส่อะไรก็ได้ เป็น infomation แต่ต้องอยู่ในรูปแบบ key:value
      • RUN  ใส่คำสั่งที่ต้องการ execute ครับ
        • ตรงนี้ผมจะเพิ่มคำสั่งสำหรับเพิ่ม user bonanza และ user invest ครับ
        • และส่วนถัดมา ผมเพิ่มคำสั่งที่จำเป็นสำหรับการติดตั้งภาษาไทย TIS-620 ลงใน RedHat/CentOS ครับ
    • ลองรันครับ ด้วยคำสั่ง 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 bonanza
       ---> Running in 7bd11b257970
      Removing intermediate container 7bd11b257970
       ---> 630236a8b302
      Step 4/6 : RUN echo "bonanza:bonanza" | chpasswd
       ---> Running in d0f38091cb95
      Removing intermediate container d0f38091cb95
       ---> d95994738b43
      Step 5/6 : RUN useradd -ms /bin/bash invest
       ---> Running in 37e4e90c4cd4
      Removing intermediate container 37e4e90c4cd4
       ---> a15e7ad12d96
      Step 6/6 : RUN echo "invest:invest" | 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 ครับ
    • มองลองตรวจกันว่า user ที่ผมเพิ่มสร้างไปมีใน DB2 หรือป่าว โดยเข้าไปใน Docker Image ของ DB2 ด้วยคำสั่ง  docker exec -it <CONTAINER_ID> bash  เช่น docker exec -it 4484a421c205 bash  ครับ จากนั้นลอง list user ด้วยคำสั่ง cut -d: -f1 /etc/passwd  ครับ ผลลัพธืที่ได้ต้องมี User
      • bonanza 
      • invest 

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