Docker Engine Command
ส่วนนี้ก็มาว่ากันถึงวิธีใช้งานกันนะครับ ซึ่งถ้าใครไม่ได้แอด user เข้ากลุ่ม docker แบบข้อ 10 หน้านี้ก็อย่าลืมใช้ sudo นำหน้าด้วยนะครับ ไม่งั้นมันจะบอกว่า "เราไม่มีสิทธิ์~"
- docker images เช็คว่ามี image อะไรบ้าง เราจะพบ image ของที่เราต้องใช้
-
docker run
IMAGE_REPOSITORY สั่งให้รัน image ชื่อตามคอลัมภ์
IMAGE_REPOSITORY
ซี่งมันจะสร้าง container ใหม่อัตโนมัติทุกครั้ง กรณีอยากให้ container ลบตัวเองทิ้งหลังทำงานเสร็จ ให้ใช้คำสั่ง docker run --rm
IMAGE_REPOSITORY แทนจะได้ไม่ต้องตามลบ แต่ไฟล์ image จะยังอยู่นะครับ (กรณีที่ยังไม่มี image มันจะทำการดาวน์โหลดเองอัตโนมัติ) สามารถใส่ออฟชั่น --name NAME_CONTAINER ได้กรณีที่ต้องการตั้งชื่อเลย
- docker image rm IMAGE_ID โดย IMAGE_ID เป็น ID ของ image ที่เราจะลบ หรือ docker rmi IMAGE_REPOSITORY:TAG โดยคำสั่งนี้สามารถใช้สำหรับลบหลายๆ image ที่ชื่อเหมือนกันได้นะครับ (เพราะ ID ไม่เหมือนกันอยู่ละ) ส่วน TAG ก็เวอร์ชั่นของ image แต่ถ้าใช้สร้าง container อยู่ ต้องหยุด และลบ container ก่อนนะครับ (กรณีที่ลบไม่ออกให้ใช้ docker system prune นะครับ)
-
docker ps หรือ docker container ls เอาไว้ดูว่ามี container อะไรทำงานอยู่บ้าง (ในส่วนของคอลัมภ์ CONTAINER_ID เราจะเอาเลขนี้ไว้ใช้สั่งให้มันหยุดทำงานด้วยนะครับ) ถ้าต้องการดู container ทั้งหมดให้เติม -a ไว้ข้างหลังนะครับ
- docker container rm CONTAINER_ID หรือ docker rm CONTAINER_ID กรณีที่ต้องการลบ container เพราะไม่ได้ใช้ออฟชั่นคำสั่ง --rm ตอนสั่งให้ image เริ่มทำงานนะครับ (กรณีที่มีเยอะใช้ docker container rm $( docker ps -aq ) เพื่อลบ container ทั้งหมดหรือ docker container rm $(docker container ls -q --filter name= SOME_PATH_OF_NAME ) เพื่อลบเฉพาะกลุ่มที่มีชื่อตามที่เราต้องการได้นะครับ)
- docker container stop CONTAINER_ID ใช้สั่งหยุดทำงานตัวที่เราต้องการ หรือใช้ docker stop CONTAINER_ID แทน (จะใช้ชื่อ แทน ID ก็ได้นะครับ)
- docker container start CONTAINER_ID อันนี้ใช้สั่งให้มันกลับมาทำงานนะครับ เพราะถ้าใช้คำสั่ง run มันจะสร้างอันใหม่แทน
- docker attach CONTAINER_ID อันนี้ใช้กลับเข้าไปทำงานข้างใน container นะครับ หรือ docker exec -it CONTAINER_NAME bash
- docker container rename ORIGINAL_NAME NEW_NAME อันนี้เอาไว้ใช้เปลี่ยนชื่อนะครับ เผื่อเราสร้างมาหลายๆ อัน จาก image อันเดียวกันเพื่อใช้ในงานต่างๆ กัน มันจะสับสน เพราะเหมือนว่าชื่อที่มันตั้งมาน่าจะสุ่มเอา (ชื่อเดิมดูได้จากคำสั่ง docker ps -a นะครับ ในคอลัมภ์สุดท้าย) โดย ORIGINAL_NAME คือชื่อเดิมนะครับ ส่วน NEW_NAME คือชื่อใหม่ที่เราต้องการจะตั้ง
- ทีนี้ไปที่ https://hub.docker.com/_/ubuntu นะครับ (กรณีต้องการหา image ตัวอื่นจะมีช่อง search อยู่ข้างบนหน้าเว็บ หรือใช้คำสั่ง docker search IMAGE_REPOSITORY ใน terminal ก็ได้ครับ) เราจะเอาตัว image ของ ubuntu มาลง จะเห็นคำสั่ง docker pull ubuntu ด้านข้างนะครับ ก็อปมาใส่ terminal ได้เลยครับ พอโหลดเสร็จเราก็จะมี image ของมันในเครื่องเราแล้ว
-
docker run -it ubuntu bash คำสั่งนี้จะทำการสร้าง container จาก image ของ ubuntu ขึ้นมาแล้วเข้าไปใน terminal ของ
container
ubuntu ที่สร้างขึ้นมานะครับ ออกได้ด้วย
กดปุ่ม Ctrl+p+q โดยที่ container ไม่หยุดการทำงาน
นะครับ ถ้าใช้คำสั่ง exit มันจะหยุดการทำงานของ container ไปด้วย (เหมือนใช้คำสั่ง stop) ดังนั้นถ้าจะกลับเข้าไปใช้งานอีก ให้ใช้คำสั่ง start แล้ว attach ในข้อ 7. -> 8. นะครับ (
หรือ เปิดหน้าต่าง terminal อีกอันแล้วใช้คำสั่ง
sudo pkill -9 -f 'docker.*attach' นะครับ แต่อันหลังใช้ได้แค่ตอนมีเราใช้คนเดียวนะครับ) -it เป็นการสั่งทำงานแบบ interactive นะครับ
- อันนี้สำหรับกรณีที่เราต้องการเลือกเวอร์ชั่นนะครับ เช่น ต้องการใช้ server nginx เราสามารถเลือกลงได้ด้วยคำสั่ง docker pull nginx: stable
หรือ docker pull nginx: 1.10
แล้วใช้คำสั่ง docker run --name CONTAINER_NGINX -d -p 8081:80 -v ~/docker/nginx:/home/docker nginx:stable ลองเข้า
ไปที่ web browser ตรง url ใส่
http://localhost:8081
แล้ว Enter นะครับ
8081
:80
อันนี้มีคนเรียกว่า port mapping เอาเป็นว่าปกติ nginx มันจะใช้งานที่ port 80 นะครับ แต่เราผูก port 8081 ของเครื่องเราให้ส่งมาที่ port 80 ของ
nginx
ใน container แทน ดังนั้นเราจะสามารถเรียกมันจาก port 8081 ได้ ซึ่งจะดีกว่าเพราะว่า port 80 มักจะถูกหลายๆ โปรแกรมจองใช้งาน ซึ่งมันห้ามใช้ชนกันนะครับ
- docker logs CONTAINER_ID อันนี้ใช้เข้าไปดูว่าเราใช้คำสั่งอะไรไปบ้างนะครับ มันจะขึ้นทุกอย่างเหมือนตอนที่ใช้งานเลยครับ
-
docker run -name
CONTAINER_NAME
--link
CONTAINER_NAME
:ActualcontainerName อันนี้เอาไว้ใช้ทำ link ระหว่าง container นะครับ สมมุติว่าเราจะสร้าง link ของ mysql+wordpress
- ขั้นแรกลงโหลดทั้ง 2 images ด้วยคำสั่ง docker pull mysql และ docker pull wordpress ก่อนนะครับ
- ไปที่ หน้านี้ ของ mysql จะเห็นว่าเค้าให้ใช้คำสั่ง docker run --name CONTAINER _mysql -e MYSQL_ROOT_PASSWORD= root_password -d mysql:latest ซึ่ง CONTAINER _mysql คือชื่อของ mysql ที่เราจะสร้างมาใช้งานนะครับ (ดูได้จากคอลัมภ์สุดท้ายที่ชื่อ NAMES ตอนใช้คำสั่ง docker ps นะครับ) root_password อันนี้คือ password สำหรับเข้าใช้งานฐานข้อมูลของเรา ส่วน mysql:latest อันนี้คือ IMAGE_REPOSITORY :TAG ถ้าเราไม่มี มันจะสั่งให้โหลดตัวอัพเดตล่าสุดมาใช้นะครับ (คำสั่งในส่วนนี้จะขึ้นอยู่กับว่าตัว image ที่เราลงมันต้องการอะไรมั้งนะครับ ดังนั้นมันจะแตกต่างกันไป)
-
หรือใช้จากข้อ 2. เปลี่ยนมาใช้คำสั่ง
docker run --name
CONTAINER
_mysql -e MYSQL_ROOT_PASSWORD=
root_password
-d -p
8082
:3306 -v
d:/Docker/mysql
:/var/lib/mysql mysql:latest
แทนในกรณีที่จะ link มาที่ external path นะครับ (เก็บข้อมูล db ไว้นอก container เวลามันถูกลบ ข้อมูล db จะได้ยังอยู่นะครับ) ซึ่ง
d:/Docker/mysql
คือ path ที่เราจะเก็บไว้ในเครื่องเราส่วนหลังจาก " : " คือ path ของ container นะครับ
-v คือบอกการใช้ออฟชั่น external path นะครับ จากตัวอย่างจะเป็น path ของ window นะครับ
-
ไปที่ หน้านี้ ของ wordpress
จะเห็นว่าเค้าให้ใช้คำสั่ง
docker run --name
CONTAINER_wordpress
--link
CONTAINER
_mysql:mysql -p
8083:
80 -d wordpress ซึ่ง
CONTAINER_wordpress
คือชื่อของ
wordpress ที่เราสร้างมาใช้นะครับ ส่วน
CONTAINER
_mysql:mysql
ส่วนหน้าคือชื่อของ mysql ที่เราสร้างไว้แล้ว และจะเอามาใช้เป็น db (
:mysql
) ให้ wordpress นะครับ
(
-e
เป็นการกำหนดค่าให้กับ container นะครับ ซึ่งค่าก็จะติดไปกับมันด้วย ไม่ว่าจะย้ายไปไหนก็ตาม
-p
คือออฟชั่นของคำสั่งนะครับ ให้รู้ว่าหลังจากนี้จะกำหนดค่า port ส่วน
-d
คือบอกให้ทำงานเป็น back ground นะครับ)
- docker ps จะเห็นว่าทั้งสองตัวที่เราลงไปมันทำงานเรียบร้อยแล้วนะครับ
- ไปที่ web browser ตรง url ใส่ http://localhost:8083 แล้ว Enter นะครับ เราก็จะเข้าสู่ wordpress ได้แล้วจ้าา..
-
ซึ่งอันนี้ยังไม่ทำงานเองตอนเปิดเครื่องนะครับ คำสั่งใน หน้านี้ทำให้มีการเปิด docker deamon ตอนเริ่มทำงานแล้วก็จริง แต่ไม่ได้รวมไปถึงตัว container ที่เราต้องการใช้งานนะครับ ซึ่งอันนี้ยังต้องหากันต่อไป ไม่งั้นอาจจะต้องเขียน bash script ให้เริ่มทำงานเอาเอง เพราะเราจะปล่อยให้เซิฟเวอร์ตายไม่ได้นะครับ
- docker commit CONTAINER_ID IMAGE_REPOSITORY:TAG อันนี้ใช้เมื่อเราต้องการเปลี่ยน container เป็น image เพื่อเอาไว้ใช้งานบนเครื่องอื่นนะครับ โดย CONTAINER_ID อันนี้คือตัว container ที่เราปรับแต่งมาแล้ว ส่วน IMAGE_REPOSITORY ให้เราตั้งชื่อใหม่ให้มัน และ TAG เองก็เช่นกันเอาไว้บอกเวอร์ชั่นนะครับ
- docker tag OLD_ IMAGE_REPOSITORY :OLD_TAG NEW_ IMAGE_REPOSITORY :NEW_TAG อันนี้เหมือนเอาไว้ copy + rename นะครับ
- การอัพโหลด image เราขึ้นบนเว็บนะครับ ก่อนอื่นเข้าไปสมัครที่ เว็บนี้ แล้วก็ใช้คำสั่ง login ใน terminal ด้วย docker login --username= MY_USER นะครับ โดย MY_USER คือชื่อ user ของเรานั้นละครับ แล้วมันจะขึ้นให้เราใส่รหัส หลังจากนั้นใช้คำสั่ง docker push IMAGE_REPOSITORY:TAG ของที่เราจะอัพขึ้นไปนะครับ
- docker container inspect CONTAINER_NAME อันนี้ไว้ดูการตั้งค่า config ต่างๆ ใน container ของเรานะครับ
-
docker image prune -a เนื่องจากการลบ image มันยังไม่ได้ลบออกจาก hdd ของเราจริงๆ ทำให้ถ้าเราไม่ใช้คำสั่งนี้ เราจะสร้าง image ที่ชื่อเหมือนกันกับที่เราเคยลบไปแล้วไม่ได้นะครับ
- การทำ Dockerfile ทดลองสร้าง web server apache นะครับ
- ก่อนอื่นให้เราสร้าง folder ที่จะใช้เก็บ Dockerfile ก่อนนะครับ แล้วสร้างไฟล์ชื่อ Dockerfile ไม่ต้องมีนามสกุลไว้ข้างใน
- ใส่คำสั่งตามนี้
From ubuntu:18.04
RUN apt update && apt upgrade -y && apt install -yq apache2
EXPOSE 80
CMD apachectl -D FOREGROUND
บรรทัดแรกคือสั่งให้ใช้ image เริ่มต้นเป็น ubuntu เวอร์ชั่นนี้นะครับ บรรทัดที่สอง คำสั่งที่ต้องการให้ทำตอนสร้าง image บรรทัดที่สาม port ที่ต้องการให้มี บรรทัดที่สี่ คำสั่งที่ต้องการให้ทำหลังเริ่มทำงาน container นะครับ
- เปิด terminal จากใน folder หรือใช้ cd เข้าไปเองก็ได้ครับ แล้วใช้คำสั่ง docker build -t IMAGE_NAME:TAG . อย่าลืม " . " หลังสุดนะครับ ชื่อของ image กับ tag แล้วแต่จะตั้งเลยครับ
- เริ่มรันด้วยคำสั่ง docker container run -d -- name CONTAINER_apache2 -p 8084:80
IMAGE_NAME:TAG
สามารถทดลองเข้าผ่าน web browser ได้ด้วย url http://localhost:8084 เหมือนตอนทำ wordpress เลยครับ
- การทำ Dockerfile ทดลองสร้าง web server php นะครับ
- เหมือนเดิมให้เราสร้าง folder ที่จะใช้เก็บ Dockerfile ก่อนนะครับ แล้วสร้างไฟล์ชื่อ Dockerfile ไม่ต้องมีนามสกุลไว้ข้างใน
- ใส่คำสั่งตามนี้
From php:7.0-apache
RUN apt update && apt upgrade -y
COPY . /var/www/html
EXPOSE 80
บรรทัดที่สาม COPY มันจะก็อปทุกอย่างใน folder ไปไว้ใน container ที่เราจะสร้างตาม path ที่เราใส่ไว้นะครับ - สร้างไฟล์ index.php แล้วใส่คำสั่งตามนี้
<?php
echo "I love you.";
echo "by valenteer";
echo 11 + 22;
?>
บรรทัดที่สาม COPY มันจะก็อปทุกอย่างใน folder ไปไว้ใน container ที่เราสร้างตาม path ที่เราใส่ไว้นะครับ - เปิด terminal จากใน folder หรือใช้ cd เข้าไปเองก็ได้ครับ แล้วใช้คำสั่ง docker build -t IMAGE_NAME:TAG . อย่าลืมเปลี่ยนชื่อกับ tag นะครับ
- รันด้วยคำสั่ง docker container run -d -- name CONTAINER_php7 -p 8085:80
IMAGE_NAME:TAG
สามารถทดลองเข้าผ่าน web browser ได้ด้วย url http://localhost:8085 เหมือนเดิมครับ
- docker cp HOST_PATH CONTAINER:CONTAINER_PATH อันนี้ไว้ copy ไฟล์ไปยัง container นะครับ ถ้าจะ copy ไฟล์จาก container มาที่เครื่อง HOST (เครื่องเรา) ก็จะใช้คำสั่งกลับกันเป็น docker cp CONTAINER:CONTAINER_PATH HOST_PATH โดย HOST_PATH ก็เป็นที่อยู่ในเครื่องเรานะครับ เช่น ~/Desktop ส่วน CONTAINER อันนี้เราจะใช้ชื่อ หรือ ID ของ container ก็ได้นะครับ CONTAINER_PATH ก็ path โฟลเดอร์ของใน container นะครับ
- docker save IMAGE_REPOSITORY | gzip > ~/ PATH/ NEW_NAME.tar.gz อันนี้เอาไว้ย้าย image ไฟล์แบบไม่ต้องผ่านเว็บของ docker hub นะครับ (copy -> paste) โดย IMAGE_REPOSITORY คือชื่อของ image ที่เราต้องการ copy นะครับ PATH อันนี้ก็ path ที่จะ save เป็นไฟล์ใหม่นะครับ (แบบง่ายๆ ก็ ~/Desktop/ ) NEW_NAME อันนี้แล้วแต่จะตั้งให้จำได้กันเลยครับ
- docker load -i ~/ PATH/ NEW_NAME.tar.gz เมื่อเรา save เป็นไฟล์แยกไว้ได้ตามข้อข้างบนแล้วนะครับ เราก็ต้องมีคำสั่งในการเอาเข้ามาใช้งานในเครื่องอื่นอีกที ก็อันนี้แหละ
- docker update --restart=unless-stopped CONTAINER_NAME อันนี้เอาไว้อัพเดต container ที่รันอยู่ให้เริ่ม autorun หลังเซิฟเวอร์มีการรีสตาร์ทเครื่องนะครับ หรือจะใช้ตั้งแต่ตอนเริ่มรันเลยก็ได้ครับ
- docker run --name SET_CONTAINER_NAME --rm -v $(pwd)/ HOST_FOLDER :/ CONTAINER_FOLDER -itd IMAGE_NAME bash อันนี้รวมๆ คำสั่งมานะครับ -d สั่งให้รันแบ็คกราวน์ คือไม่ปิดตัวเองแม้ไม่มีงาน -v เอาไว้ mount ระหว่างโฟลเดอร์ของเรากับของ container ให้ใช้ไฟล์ร่วมกันได้เพื่อความสะดวก --rm ลบ container ตัวเองเมื่อหยุดทำงานสำหรับงานชั่วคราวที่เราไม่ได้ต้องการเอาไว้ใช้ต่อนะครับ -it เอาไว้เข้าใช้งานแบบ bash และ -name เอาไว้ตั้งชื่อ container นะครับ $(pwd) บอกให้ใช้พาธของที่ home ของเรานะครับ
- sudo apt install docker-compose -y อันนี้เอาไว้เผื่อ build จากไฟล์ *.yml นะครับ โดยคำสั่งที่ใช้ build คือ docker-compose -f FILE_NAME.yml up ส่วนตัวอย่างการ build สามารถหาดูได้ตาม docker hub นะครับ
ความคิดเห็น
แสดงความคิดเห็น