HomeArtTechHackBlockchain

Docker 101 มาหัดใช้ Docker แบบไวๆกันเถอะ

By Khomkrid Lerdprasert
Published in Technology
August 05, 2020
1 min read
Docker 101 มาหัดใช้ Docker แบบไวๆกันเถอะ

Docker 101 มาหัดใช้ Docker แบบไวๆกันเถอะ

ก่อนที่เราจะไปทำความรู้จักกับ 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 ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
aofiee-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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a39de0da880 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
  1. การสร้าง Docker Image

การสร้าง Image จะมี 2 แบบ คือ

Interactive

Dockerfile

Interactive คือการสร้าง Container Base OS ขึ้นมาสักตัว แล้ว pull application ที่เราต้องการใช้งานมาติดตั้ง แล้วค่อยทำการ commit ที่เราทำเสร็จแล้วขึ้น มาเป็น Image file อีกที ซึ่งขนาดไฟล์ที่ได้มันจะใหญ่โคตรๆ แล้วการกลับมา config ครั้งหน้า ถ้าไม่เหมือนเดิมไม่ว่าจะเป็น ในส่วนของ tag ก็อาจจะทำให้มีปัญหาได้ จึงไม่นิยมใช้งาน

Dockerfile คือ text file ที่มีการสร้างชุดคำสั่งต่างๆไว้ในไฟล์ เพื่อใช้ ในการสร้าง image ทำให้ขนาดไฟล์เล็กโคตรๆ stack ที่ถูก สร้างขึ้นมาก็จะเหมือนเดิมแน่นอน

มาลองสร้าง Dockerfile อันแรกกันดีกว่า

FROM ubuntu:18.04
ENV screen_text "Hello From Docker"
#RUN จะทำงานตอนกำลัง build image
RUN echo ${screen_text}
#CMD ทำงานเมื่อเป็น Container แล้ว
CMD ["echo","Hello From CMD Command"]

แล้วทำการบันทึกไฟล์ หลังจากนั้นสั่ง

docker build -t hello:lastest_tag ./
Sending build context to Docker daemon 2.56kB
Step 1/4 : FROM ubuntu:18.04
18.04: Pulling from library/ubuntu
23884877105a: Pull complete
bc38caa0f5b9: Pull complete
2910811b6c42: Pull complete
36505266dcc6: Pull complete
Digest: sha256:3235326357dfb65f1781dbc4df3b834546d8bf914e82cce58e6e6b676e23ce8f
Status: Downloaded newer image for ubuntu:18.04
---> c3c304cb4f22
Step 2/4 : ENV screen_text "Hello From Docker"
---> Running in 315d7f0426a3
Removing intermediate container 315d7f0426a3
---> 2c173fb6537c
Step 3/4 : RUN echo ${screen_text}
---> Running in 30f606dd8a7a
Hello From Docker
Removing intermediate container 30f606dd8a7a
---> 191d1a05a3db
Step 4/4 : CMD ["echo","Hello From CMD Command"]
---> Running in 62e7361136aa
Removing intermediate container 62e7361136aa
---> 0af72ca96409
Successfully built 0af72ca96409
Successfully tagged hello:lastest_tag

เมื่อเราสั่ง ดู image ภายในเครื่องของเราว่ามีอะไรบ้าง ก็จะเจอ image ที่ Dockerfile เราได้ทำการสร้างขึ้นมา

docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello lastest_tag 0af72ca96409 22 seconds ago 64.2MB
ubuntu 18.04 c3c304cb4f22 3 weeks ago 64.2MB

เมื่อเราทดสอบ run docker image ของเราก็จะพบการทำงานในส่วนของ CMD command ที่เราเขียนไว้ข้างต้น

docker run --name hello-dev hello:lastest_tag
Hello From CMD Command

หรือเราจะสั่งให้มัน run แล้วลบ container นั้นทิ้งไปเลยหลังจาก run เสร็จก็ได้ เพราะเราก็ต้องมาลบมันอยู่ดี เกะกะ

docker run --rm hello:lastest_tag
Hello From CMD Command

ทำเซียนเหมือนเรียนมา งั้นมาลองทำ Dockerfile อันที่ 2 ดีฝ่า

ปรกติผมจะใช้ kali linux บน Virturalbox ซึ่งจะกินเนื้อที่ HD สัสๆเลยก็ว่าได้ ตอนนี้เลยมาลองทำ Dockerfile สร้าง image Kali ลง Tool ทดสอบสัก 2 - 3 ตัว บวกกับ Compile Python3 ลงไปด้วย เพราะขี้เกียจมา Compile ใหม่เวลาเผลอลบ Container และก็ Mount Volume ให้ Host directory ชี้ไปบน Container ที่ใช้ทำงาน เผื่อโยนไฟล์หากัน ก็กลายมาเป็น Dockerfile ตามนี้

FROM kalilinux/kali-rolling
RUN 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 /localshared
VOLUME [ "/localshared" ]

แล้วก็ Save และ Run เพื่อสร้าง Image file

docker build -t kali-tool .
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
kali-tool latest 65dd21fecbd9 29 minutes ago 1.08GB

พอสั่ง docker image ls ดู เหยดเปียดดดด 1.08GB เลย

ทีนี้เราจะลองเอา Docker Image ของเราขึ้นไปอยู่บน Docker Hub กันดูครับ

โดยไปสมัครสมาชิกที่ 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 ls
REPOSITORY TAG IMAGE ID CREATED SIZE
aofiee/kali_with_python3 latest 65dd21fecbd9 About an hour ago 1.08GB
kali-tool latest 65dd21fecbd9 About an hour ago 1.08GB

หลังจากนี้เราจะทำการ upload image file เราขึ้นไปที่ pubilc registry กันนะจ้ะ ด้วยการสั่ง

docker login
Authenticating with existing credentials...
Stored credentials invalid or expired
Login 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): xxxxxx
Password:
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: Pushed
f5d5ec70d116: Pushed
0689cd28eb57: Mounted from kalilinux/kali-rolling
latest: digest: sha256:e7e7477563439389a08cd249d7d10259f6dc7a4c5b82898d6069128c59cd200b size: 949

Tags

#docker#devops

Share

Previous Article
Set up iPad Pro M1 for Web Development
Khomkrid Lerdprasert

Khomkrid Lerdprasert

Full Stack Life

Related Posts

Docker compose ทำ mongodb มาเชื่อมต่อ กับ golang
March 05, 2022
1 min
© 2024, All Rights Reserved.
Powered By

Quick Links

Author

Social Media