Docker Engine Command

                ส่วนนี้ก็มาว่ากันถึงวิธีใช้งานกันนะครับ ซึ่งถ้าใครไม่ได้แอด user เข้ากลุ่ม docker แบบข้อ 10 หน้านี้ก็อย่าลืมใช้ sudo นำหน้าด้วยนะครับ ไม่งั้นมันจะบอกว่า "เราไม่มีสิทธิ์~"

  1. docker images เช็คว่ามี image อะไรบ้าง เราจะพบ image ของที่เราต้องใช้
  2. docker run IMAGE_REPOSITORY สั่งให้รัน image ชื่อตามคอลัมภ์ IMAGE_REPOSITORY ซี่งมันจะสร้าง container ใหม่อัตโนมัติทุกครั้ง กรณีอยากให้ container ลบตัวเองทิ้งหลังทำงานเสร็จ ให้ใช้คำสั่ง docker run --rm IMAGE_REPOSITORY แทนจะได้ไม่ต้องตามลบ แต่ไฟล์ image จะยังอยู่นะครับ (กรณีที่ยังไม่มี image มันจะทำการดาวน์โหลดเองอัตโนมัติ) สามารถใส่ออฟชั่น --name NAME_CONTAINER ได้กรณีที่ต้องการตั้งชื่อเลย
  3. docker image rm IMAGE_ID โดย IMAGE_ID เป็น ID ของ image ที่เราจะลบ หรือ docker rmi  IMAGE_REPOSITORY:TAG
  4. โดยคำสั่งนี้สามารถใช้สำหรับลบหลายๆ image ที่ชื่อเหมือนกันได้นะครับ (เพราะ ID ไม่เหมือนกันอยู่ละ) ส่วน TAG ก็เวอร์ชั่นของ image แต่ถ้าใช้สร้าง container อยู่ ต้องหยุด และลบ container ก่อนนะครับ (กรณีที่ลบไม่ออกให้ใช้ docker system prune นะครับ)
  5. docker ps หรือ docker container ls เอาไว้ดูว่ามี container อะไรทำงานอยู่บ้าง (ในส่วนของคอลัมภ์ CONTAINER_ID เราจะเอาเลขนี้ไว้ใช้สั่งให้มันหยุดทำงานด้วยนะครับ) ถ้าต้องการดู container ทั้งหมดให้เติม -a ไว้ข้างหลังนะครับ
  6. 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 ) เพื่อลบเฉพาะกลุ่มที่มีชื่อตามที่เราต้องการได้นะครับ)
  7. docker container stop CONTAINER_ID ใช้สั่งหยุดทำงานตัวที่เราต้องการ หรือใช้ docker stop CONTAINER_ID แทน (จะใช้ชื่อ แทน ID ก็ได้นะครับ)
  8. docker container start CONTAINER_ID อันนี้ใช้สั่งให้มันกลับมาทำงานนะครับ เพราะถ้าใช้คำสั่ง run มันจะสร้างอันใหม่แทน 
  9. docker attach CONTAINER_ID อันนี้ใช้กลับเข้าไปทำงานข้างใน container นะครับ หรือ docker exec -it CONTAINER_NAME bash
  10. docker container rename ORIGINAL_NAME NEW_NAME อันนี้เอาไว้ใช้เปลี่ยนชื่อนะครับ เผื่อเราสร้างมาหลายๆ อัน จาก image อันเดียวกันเพื่อใช้ในงานต่างๆ กัน มันจะสับสน เพราะเหมือนว่าชื่อที่มันตั้งมาน่าจะสุ่มเอา (ชื่อเดิมดูได้จากคำสั่ง docker ps -a นะครับ ในคอลัมภ์สุดท้าย) โดย ORIGINAL_NAME คือชื่อเดิมนะครับ ส่วน NEW_NAME คือชื่อใหม่ที่เราต้องการจะตั้ง
  11. ทีนี้ไปที่ https://hub.docker.com/_/ubuntu นะครับ (กรณีต้องการหา image ตัวอื่นจะมีช่อง  search อยู่ข้างบนหน้าเว็บ หรือใช้คำสั่ง docker search  IMAGE_REPOSITORY ใน terminal ก็ได้ครับ) เราจะเอาตัว image ของ ubuntu มาลง จะเห็นคำสั่ง docker pull ubuntu ด้านข้างนะครับ ก็อปมาใส่ terminal ได้เลยครับ พอโหลดเสร็จเราก็จะมี image ของมันในเครื่องเราแล้ว
  12. 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 นะครับ
  13. อันนี้สำหรับกรณีที่เราต้องการเลือกเวอร์ชั่นนะครับ เช่น ต้องการใช้ 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 มักจะถูกหลายๆ โปรแกรมจองใช้งาน ซึ่งมันห้ามใช้ชนกันนะครับ
  14. docker logs CONTAINER_ID อันนี้ใช้เข้าไปดูว่าเราใช้คำสั่งอะไรไปบ้างนะครับ มันจะขึ้นทุกอย่างเหมือนตอนที่ใช้งานเลยครับ
  15. docker run -name CONTAINER_NAME --link CONTAINER_NAME :ActualcontainerName อันนี้เอาไว้ใช้ทำ link ระหว่าง container นะครับ สมมุติว่าเราจะสร้าง link ของ mysql+wordpress

    1. ขั้นแรกลงโหลดทั้ง 2 images ด้วยคำสั่ง docker pull mysql และ docker pull wordpress ก่อนนะครับ 
    2. ไปที่ หน้านี้ ของ 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 ที่เราลงมันต้องการอะไรมั้งนะครับ ดังนั้นมันจะแตกต่างกันไป) 
    3. หรือใช้จากข้อ 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 นะครับ
    4. ไปที่ หน้านี้ ของ 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 นะครับ)
    5. docker ps จะเห็นว่าทั้งสองตัวที่เราลงไปมันทำงานเรียบร้อยแล้วนะครับ
    6. ไปที่ web browser ตรง url ใส่ http://localhost:8083 แล้ว Enter นะครับ เราก็จะเข้าสู่ wordpress ได้แล้วจ้าา..
    7. ซึ่งอันนี้ยังไม่ทำงานเองตอนเปิดเครื่องนะครับ คำสั่งใน หน้านี้ทำให้มีการเปิด docker deamon ตอนเริ่มทำงานแล้วก็จริง แต่ไม่ได้รวมไปถึงตัว container ที่เราต้องการใช้งานนะครับ ซึ่งอันนี้ยังต้องหากันต่อไป ไม่งั้นอาจจะต้องเขียน bash script ให้เริ่มทำงานเอาเอง เพราะเราจะปล่อยให้เซิฟเวอร์ตายไม่ได้นะครับ

  16. docker commit  CONTAINER_ID IMAGE_REPOSITORY:TAG อันนี้ใช้เมื่อเราต้องการเปลี่ยน container เป็น image เพื่อเอาไว้ใช้งานบนเครื่องอื่นนะครับ โดย  CONTAINER_ID อันนี้คือตัว container ที่เราปรับแต่งมาแล้ว ส่วน IMAGE_REPOSITORY ให้เราตั้งชื่อใหม่ให้มัน และ TAG เองก็เช่นกันเอาไว้บอกเวอร์ชั่นนะครับ 
  17. docker tag OLD_ IMAGE_REPOSITORY :OLD_TAG NEW_ IMAGE_REPOSITORY :NEW_TAG อันนี้เหมือนเอาไว้ copy + rename นะครับ
  18. การอัพโหลด image เราขึ้นบนเว็บนะครับ ก่อนอื่นเข้าไปสมัครที่ เว็บนี้ แล้วก็ใช้คำสั่ง login ใน terminal ด้วย docker login --username= MY_USER นะครับ โดย MY_USER คือชื่อ user ของเรานั้นละครับ แล้วมันจะขึ้นให้เราใส่รหัส หลังจากนั้นใช้คำสั่ง docker push IMAGE_REPOSITORY:TAG ของที่เราจะอัพขึ้นไปนะครับ   
  19. docker container inspect CONTAINER_NAME อันนี้ไว้ดูการตั้งค่า config ต่างๆ ใน container ของเรานะครับ
  20. docker image prune -a เนื่องจากการลบ image มันยังไม่ได้ลบออกจาก hdd ของเราจริงๆ ทำให้ถ้าเราไม่ใช้คำสั่งนี้ เราจะสร้าง image ที่ชื่อเหมือนกันกับที่เราเคยลบไปแล้วไม่ได้นะครับ
  21. การทำ Dockerfile ทดลองสร้าง web server apache นะครับ
    1. ก่อนอื่นให้เราสร้าง folder ที่จะใช้เก็บ Dockerfile ก่อนนะครับ แล้วสร้างไฟล์ชื่อ Dockerfile ไม่ต้องมีนามสกุลไว้ข้างใน 
    2. ใส่คำสั่งตามนี้

      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 นะครับ
    3. เปิด terminal จากใน folder หรือใช้ cd เข้าไปเองก็ได้ครับ แล้วใช้คำสั่ง docker build -t IMAGE_NAME:TAG . อย่าลืม " . " หลังสุดนะครับ ชื่อของ image กับ tag แล้วแต่จะตั้งเลยครับ
    4. เริ่มรันด้วยคำสั่ง docker container run -d -- name CONTAINER_apache2 -p 8084:80 IMAGE_NAME:TAG สามารถทดลองเข้าผ่าน web browser ได้ด้วย url http://localhost:8084 เหมือนตอนทำ wordpress เลยครับ

  22. การทำ Dockerfile ทดลองสร้าง web server php นะครับ
    1. เหมือนเดิมให้เราสร้าง folder ที่จะใช้เก็บ Dockerfile ก่อนนะครับ แล้วสร้างไฟล์ชื่อ Dockerfile ไม่ต้องมีนามสกุลไว้ข้างใน 
    2. ใส่คำสั่งตามนี้

      From php:7.0-apache
      RUN apt update && apt upgrade -y
      COPY . /var/www/html

      EXPOSE 80

      บรรทัดที่สาม COPY มันจะก็อปทุกอย่างใน folder ไปไว้ใน container ที่เราจะสร้างตาม path ที่เราใส่ไว้นะครับ
    3. สร้างไฟล์ index.php แล้วใส่คำสั่งตามนี้

      <?php
          echo "I love you.";
          echo "by valenteer";

          echo 11 + 22;
      ?>


      บรรทัดที่สาม COPY มันจะก็อปทุกอย่างใน folder ไปไว้ใน container ที่เราสร้างตาม path ที่เราใส่ไว้นะครับ
    4. เปิด terminal จากใน folder หรือใช้ cd เข้าไปเองก็ได้ครับ แล้วใช้คำสั่ง docker build -t IMAGE_NAME:TAG . อย่าลืมเปลี่ยนชื่อกับ tag นะครับ
    5. รันด้วยคำสั่ง docker container run -d -- name CONTAINER_php7 -p 8085:80 IMAGE_NAME:TAG สามารถทดลองเข้าผ่าน web browser ได้ด้วย url http://localhost:8085 เหมือนเดิมครับ

  23. 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 นะครับ
  24. 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 อันนี้แล้วแต่จะตั้งให้จำได้กันเลยครับ
  25. docker load -i ~/ PATH/ NEW_NAME.tar.gz เมื่อเรา save เป็นไฟล์แยกไว้ได้ตามข้อข้างบนแล้วนะครับ เราก็ต้องมีคำสั่งในการเอาเข้ามาใช้งานในเครื่องอื่นอีกที ก็อันนี้แหละ
  26. docker update --restart=unless-stopped  CONTAINER_NAME อันนี้เอาไว้อัพเดต container ที่รันอยู่ให้เริ่ม autorun หลังเซิฟเวอร์มีการรีสตาร์ทเครื่องนะครับ หรือจะใช้ตั้งแต่ตอนเริ่มรันเลยก็ได้ครับ
  27. 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 ของเรานะครับ
  28. sudo apt install docker-compose -y อันนี้เอาไว้เผื่อ build จากไฟล์ *.yml นะครับ โดยคำสั่งที่ใช้ build คือ docker-compose -f FILE_NAME.yml up ส่วนตัวอย่างการ build สามารถหาดูได้ตาม docker hub นะครับ

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

โปรโมชั่นเน็ต TOT

โน๊ตบุ๊ค acer switch sa5-271 แบตบวม T^T

Blog นี้สร้างเพื่อ?