ก่อนที่เราจะไปทำความรู้จักกับ Docker นั้น เราก็มาทำความรู้จักกับ Container Technology กันก่อนดีกว่า ซึ่งบริษัทแรกๆที่ใช้งาน ก็คือ Solaris Container และต่อมาก็เป็นพวก Linux Container
ตัว Software Contrainer คืออะไร สมมุตินะครับ สมมุติ สมมุติว่าถ้าเราต้องมี PHP 2 version ในเครื่อง Server เราจะทำยังไงได้บ้างเพื่อไม่ให้มันตีกัน มันจึงเกิดเป็น Technology Container ขึ้นมา เพื่อจำลองสภาพแวดล้อมใน Server หรือ Computer ของเรา ให้สิ่งที่ Run อยู่ใน Container นั้นๆ ไม่ไปรบกวนการทำงานของ Container อื่นๆ หรือ Application อื่นๆที่อยู่ในเครื่องเรา และสามารถ Copy ไปทำงานต่อที่ไหนก็ได้ หรือแม้กระทั่งเอาขึ้น Production จาก Dev Environment โดยจะหมดปัญหาที่ว่า ก็ในเครื่องผม Run ได้นี่ครับ ทำไมบน Server มัน Run ไม่ได้
Docker ก็คือ เครื่องมือในการจัดการ Container ที่ได้รับความนิยมโคตรๆ ที่ทำงานบนหลักการ Build Ship Run
โดยการทำงานของ Docker จะคล้ายๆกับ Virtual Machine แต่ก็ไม่เหมือนกันสะทีเดียว
1.Intro to Docker
เริ่มแรกเลย เราต้องสร้าง docker host ขึ้นมาก่อน บน osx ของเราด้วยการใช้ docker-machine และ virtualbox หรือเราจะข้ามขั้นตอนนี้ไปเลยก็ได้ docker-machine create —driver virtualbox aofiee-project
หลังจากนั้นลองสั่ง เพื่อดู config ภายใน env
docker-machine env aofiee-project
export DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.101:2376"export DOCKER_CERT_PATH="/Users/skulltree/.docker/machine/machines/aofiee-project"export DOCKER_MACHINE_NAME="aofiee-project"# Run this command to configure your shell:# eval $(docker-machine env aofiee-project)eval $(docker-machine env aofiee-project)docker-machine lsNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORSaofiee-project * virtualbox Running tcp://192.168.99.101:2376 v19.03.5
สมมุติเราอยากใช้ mysql เราก็สั่งเลยว่า
docker pull mysql:8.0
หากเราไม่ใส่ tag มันจะเอา lastest มาให้ใช้นั่นเอง
หลังจาก docker pull มาแล้ว เราต้องสั่ง docker run เพื่อให้มันสร้าง container ขึ้นมา เพื่อให้เราใช้งาน
docker run --name mysql-dev -v data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=12345678 -e MYSQL_DATABASE=oneclickwp_db -p 3306:3306 -d mysql:8.0
docker exec -it mysql-dev bash
หลังจากที่เราสร้าง container ขึ้นมาแล้ว 1 ตัว ชื่อ mysql-dev เราสามารถเช็คการทำงานได้จากคำสั่ง
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6a39de0da880 mysql:8.0 "docker-entrypoint.s…" 10 seconds ago Up 10 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-dev
เพื่อแสดง container ที่ทำงานอยู่ หากต้องการให้แสดงทั้งหมดทั้งที่ทำงานอยู่หรือไม่ทำงาน ให้ใส่ option -a
docker ps -a
การสร้าง Image จะมี 2 แบบ คือ
Interactive
Dockerfile
Interactive คือการสร้าง Container Base OS ขึ้นมาสักตัว แล้ว pull application ที่เราต้องการใช้งานมาติดตั้ง แล้วค่อยทำการ commit ที่เราทำเสร็จแล้วขึ้น มาเป็น Image file อีกที ซึ่งขนาดไฟล์ที่ได้มันจะใหญ่โคตรๆ แล้วการกลับมา config ครั้งหน้า ถ้าไม่เหมือนเดิมไม่ว่าจะเป็น ในส่วนของ tag ก็อาจจะทำให้มีปัญหาได้ จึงไม่นิยมใช้งาน
Dockerfile คือ text file ที่มีการสร้างชุดคำสั่งต่างๆไว้ในไฟล์ เพื่อใช้ ในการสร้าง image ทำให้ขนาดไฟล์เล็กโคตรๆ stack ที่ถูก สร้างขึ้นมาก็จะเหมือนเดิมแน่นอน
มาลองสร้าง Dockerfile อันแรกกันดีกว่า
FROM ubuntu:18.04ENV screen_text "Hello From Docker"#RUN จะทำงา นตอนกำลัง build imageRUN echo ${screen_text}#CMD ทำงานเมื่อเป็น Container แล้วCMD ["echo","Hello From CMD Command"]
แล้วทำการบันทึกไฟล์ หลังจากนั้นสั่ง
docker build -t hello:lastest_tag ./Sending build context to Docker daemon 2.56kBStep 1/4 : FROM ubuntu:18.0418.04: Pulling from library/ubuntu23884877105a: Pull completebc38caa0f5b9: Pull complete2910811b6c42: Pull complete36505266dcc6: Pull completeDigest: sha256:3235326357dfb65f1781dbc4df3b834546d8bf914e82cce58e6e6b676e23ce8fStatus: Downloaded newer image for ubuntu:18.04---> c3c304cb4f22Step 2/4 : ENV screen_text "Hello From Docker"---> Running in 315d7f0426a3Removing intermediate container 315d7f0426a3---> 2c173fb6537cStep 3/4 : RUN echo ${screen_text}---> Running in 30f606dd8a7aHello From DockerRemoving intermediate container 30f606dd8a7a---> 191d1a05a3dbStep 4/4 : CMD ["echo","Hello From CMD Command"]---> Running in 62e7361136aaRemoving intermediate container 62e7361136aa---> 0af72ca96409Successfully built 0af72ca96409Successfully tagged hello:lastest_tag
เมื่อเราสั่ง ดู image ภายในเครื่องของเราว่ามีอะไรบ้าง ก็จะเจอ image ที่ Dockerfile เราได้ทำการสร้างขึ้นมา
docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEhello lastest_tag 0af72ca96409 22 seconds ago 64.2MBubuntu 18.04 c3c304cb4f22 3 weeks ago 64.2MB
เมื่อเราทดสอบ run docker image ของเราก็จะพบการทำงานในส่วนของ CMD command ที่เราเขียนไว้ข้างต้น
docker run --name hello-dev hello:lastest_tagHello From CMD Command
หรือเราจะสั่งให้มัน run แล้วลบ container นั้นทิ้งไปเลยหลังจาก run เสร็จก็ได้ เพราะเราก็ต้องมาลบมันอยู่ดี เกะกะ
docker run --rm hello:lastest_tagHello From CMD Command
ปรกติผมจะใช้ kali linux บน Virturalbox ซึ่งจะกินเนื้อที่ HD สัสๆเลยก็ว่าได้ ตอนนี้เลยมาลองทำ Dockerfile สร้าง image Kali ลง Tool ทดสอบสัก 2 - 3 ตัว บวกกับ Compile Python3 ลงไปด้วย เพราะขี้เกียจมา Compile ใหม่เวลาเผลอลบ Container และก็ Mount Volume ให้ Host directory ชี้ไปบน Container ที่ใช้ทำงาน เผื่อโยนไฟล์หากัน ก็กลายมาเป็น Dockerfile ตามนี้
FROM kalilinux/kali-rollingRUN echo "deb http://http.kali.org/kali kali-rolling main contrib non-free > /etc/apt/sources.list"RUN apt-get -y update \&& apt-get install -y wpscan joomscan apache-users git wget build-essential zlib1g-dev \&& wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz \&& tar -xvf Python-3.8.3.tgz \&& cd Python-3.8.3 \&& ./configure \&& make \&& make install \&& apt-get install -y python3-pip \&& rm -r /var/lib/apt/lists/*WORKDIR /localsharedVOLUME [ "/localshared" ]
แล้วก็ Save และ Run เพื่อสร้าง Image file
docker build -t kali-tool .docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEkali-tool latest 65dd21fecbd9 29 minutes ago 1.08GB
พอสั่ง docker image ls ดู เหยดเปียดดดด 1.08GB เลย
โดยไปสมัครสมาชิกที่ https://hub.docker.com/
แล้วเลือกที่ Repositories ทำการกรอกข้อมูลแล้ว บันทึกซะ
หลังจากนั้นให้เราเปิด terminal แล้วพิมพ์คำสั่ง
docker tag kali-tool aofiee/kali_with_python3
เพื่อทำให้ image เรามีชื่อเดียวกับบน repositories ที่เราสร้างไว้
หลังจากนั้นลองสั่ง docker image ls ดู จะสั่งเกตุว่า เราไม่ได้ copy image มานะครับ เพราะ Image ID ยังเหมือนเดิม
docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEaofiee/kali_with_python3 latest 65dd21fecbd9 About an hour ago 1.08GBkali-tool latest 65dd21fecbd9 About an hour ago 1.08GB
หลังจากนี้เราจะทำการ upload image file เราขึ้นไปที่ pubilc registry กันนะจ้ะ ด้วยการสั่ง
docker loginAuthenticating with existing credentials...Stored credentials invalid or expiredLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username (xxxxxx): xxxxxxPassword:Login Succeeded
เพื่อทำการ login เข้า docker hub ของเรา หลังจากนั้นเราสั่ง
docker push aofiee/kali_with_python3
เพื่อ upload image file ขึ้นสู่ repositories ของเรา นอนรอไปเลยละกัน 1.08GB … … . มาถึงตรงนี้เมื่อ upload เสร็จแล้ว เราจะเห็น Image เราขึ้นไปอยู่บน docker hub เรียบร้อยแล้ว ทีนี้คอมเราก็จะเหลือพื้นที่ไว้เก็บหนังได้แล้ว เพราะอะไรไม่ใช้ก้อลบไปเลยยย ไว้ค่อย pull ลงมา ฮาๆๆ
The push refers to repository [docker.io/aofiee/kali_with_python3]c66b194e153a: Pushedf5d5ec70d116: Pushed0689cd28eb57: Mounted from kalilinux/kali-rollinglatest: digest: sha256:e7e7477563439389a08cd249d7d10259f6dc7a4c5b82898d6069128c59cd200b size: 949
Quick Links
Legal Stuff