วิธี Run Docker ใน Docker Container


เตรียมพร้อมก่อน
- ในเครื่องของเราจะต้องติดตั้ง docker ไว้แล้ว
เนื้อหา
วิธี Run Docker ใน Docker Container มีหลายวิธี ในบทความนี้จะแสดงตัวอย่างการใช้ dock.sock โดยให้ container เรียกไปที่ docker ของเครื่อง host ในเนื้อหาจะการใช้คำสั่ง docker เบื้อต้นเช่นการใช้งาน images และ container
run container
เริ่มจาก run pull images ก่อนจากนั้น run container ด้วยคำสั่งด่านล่าง ในตัวอย่างนี้จะใช้ jenkins
docker pull jenkins/jenkins:2.426.2-jdk17docker run --rm --user=root -it jenkins/jenkins:2.426.2-jdk17 bash
ลองสั่ง docker ps
เพื่อตรวจสอบว่ามี container อะไรทำงานอยู่บ้าง
docker ps
จะพบว่า bash: docker: command not found
คือ jenkins container ไม่รู้จักคำสั่ง docker ต้องติดตั้ง docker ก่อน
apt update && curl -fsSL https://get.docker.com | sh
jenkins container เป็นเหมือนการจำลองเครื่อง linux ที่ไม่ได้ติดตั้งโปรแกรมอะไรไว้เลย
สามารถเช็คว่าเป็น os อะไรด้วยคำสั่ง
cat /etc/os-release
หากใครใช้ container ตัวอื่นที่ไม่ใช่ jenkins อาจจะไม่ได้ใช้คำสั่ง apt ในการติดตั้งโปรแกรมต่างๆ
หลังจากติดตั้งสำเร็จ ลองสั่ง docker ps
อีกครั้ง
docker ps
ผลที่ได้ Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
ตัว jenkins container ยังไม่ run docker หากเราเคยใช้ docker desktop ตัว error นี้จะพบตอนที่สั่ง docker ps
แต่ยังไม่ได้เปิดโปรแกรม docker desktop
เราจะไม่ start docker deamon ใน jenkins container แต่จะให้เรียกใช้ docker ของเครื่อง host แทนผ่าน docker.sock
docker deamon จะ start หลังจากเปิด docker desktop แต่ใน linux เราไม่มี docker desktop ใช้คำสั่ง systemctl start docker
docker.sock คืออะไร
docker จะคุยกันผ่าน docker.sock กรณีที่ไม่ได้อยู่ใน host เดียวกัน สามารถใช้ /var/run/docker.sock
เพื่อสื่อสารกันได้โดย mount ตัว docker.sock จากเครื่อง host เข้าไปไว้ใน jenkins container
mount คือการนำ folder ในเครื่อง host ไปไว้ใน container
หรือจะเรียกว่าทำ volume ก็ได้
เพิ่ม option ตอนสั่ง docker run -v /var/run/docker.sock:/var/run/docker.sock
docker run --rm --user=root -v /var/run/docker.sock:/var/run/docker.sock -it jenkins/jenkins:2.426.2-jdk17 bash
สั่ง docker ps
ได้แล้ว แจ๋วเลย เท่านี้เราก็สามารถใช้ docker ภายใน container ได้แล้ว เย่
ถ้าขึ้น error bash: docker: command not found
ต้องกลับไปติดตั้ง docker อีกครั้งเพราะเราใส่ option —rm หมายความว่าจะลบ container ทิ้งทุกครั้งเมื่อปิดการทำงาน
สร้าง docker file
เขียน Dockerfile ไว้จะได้ไม่ต้องสั่งติดตั้ง docker ใน container ทุกรอบ ช่วยประหยัดเวลาและไม่ต้องพิมพ์บ่อยๆ
FROM jenkins/jenkins:2.426.2-jdk17USER rootRUN apt update && curl -fsSL https://get.docker.com | shRUN usermod -aG docker jenkinsUSER jenkins
สร้าง docker images ชื่อ jenkins-lab ใส่ tag version 0.0.1 ด้วยคำสั่ง build ที่ไฟล์ Dockerfile
docker build -t jenkins-lab:0.0.1 .# หรือdocker build -t jenkins-lab:0.0.1 -f ./Dockerfile .
จะเห็นคำสั่งที่ไม่ได้ระบุชื่อไฟล์ โดย defalut จะเรียกหาไฟล์ชื่อ Dockerfile หากตั้งชื่อื่นให้เพิ่ม option -f
เมื่อเสร็จแล้วใช้คำสั่งตรวจสอบว่ามี image ชื่อ jenkins-lab เลขเวอร์ชั่น 0.0.1
docker images
จากนั้นสร้าง jenkins container ด้วยคำสั่ง run เปลี่ยนชื่อ image เป็นที่เราตั้ง jenkins-lab:0.0.1
docker run --rm --user=root -v /var/run/docker.sock:/var/run/docker.sock -it jenkins-lab:0.0.1 bash
อ่านเพิ่ม