Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Docker 101 for developer

3,548 views

Published on

docker เบื้องต้นสำหรับนักพัฒนาแอพพลิเคชั่น

Published in: Technology
  • Dating for everyone is here: ♥♥♥ http://bit.ly/39pMlLF ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ♥♥♥ http://bit.ly/39pMlLF ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Docker 101 for developer

  1. 1. Docker เบื้องตนสําหรับนักพัฒนาแอ พพลิเคชั่น
  2. 2. ● นายอานนท กิจเลิศผล ● @snappytux (Twitter) ● ใชงาน docker ตั้งแตมกราคม 2017 ● IT manager - Twin synergy Co.,th ● Front-end developer ผมคือใคร ?
  3. 3. การพัฒนาแอพพลิเคชั่นในชวงแรก
  4. 4. ระบบที่ติดตั้งในเครื่อง Dev สวนใหญ AppServ หรือ XAMPP หรือ MAMP หรือ Node APP 1 PHP Mysql APP 2 PHP Mysql APP 3 Node Mysql ...
  5. 5. ระบบที่ติดตั้งในเครื่อง Dev สวนใหญ AppServ หรือ XAMPP หรือ MAMP APP 1 PHP 5.3.2 Mysql 5.0.2 APP 2 PHP 5.4 Mysql 5.0.15 APP 3 Node 8.5.0 MariaDB ... แตตามจริงก็คือจะมีหลายเวอรชั่นมากใน การใชงาน
  6. 6. เวลางานเสร็จแลวพรอมสง Apache 2.4.10 PHP 5.6.5 Mysql 5.6.23 Local Apache 2.4.12 PHP 5.5.21 Mysql 5.6.23 Staging server Apache 2.4.09 PHP 5.5.21 Mysql 5.6.3 Production server Ubuntu 14.10 Ubuntu 14.04 ทํางานได ทํางานได ทํางานไมได x
  7. 7. WTF!!!
  8. 8. เราจะแกไขปญหานี้ไดยังไง?
  9. 9. ทําใหระบบในทุก Environment เหมือนกันทุกประการ!!! Dev Ops
  10. 10. Docker ไงจะใครละ
  11. 11. Docker คืออะไร? Build, Ship and Run “ มันเปน Tool ตัวหนึ่งที่ทําใหเราสามารถหอ ระบบของเราแลวเอาไปรันที่ไหนก็ได ที่มี Docker ติดตั้งไว ”
  12. 12. Docker
  13. 13. Docker Docker container
  14. 14. Docker PHP 5.2 PHP 5.3 PHP 5.4 Docker container
  15. 15. Docker container
  16. 16. ความสัมพันธระหวาง Image และ Container Image (registry)
  17. 17. ความสัมพันธระหวาง Image และ Container Image (registry) Image (local) PULL
  18. 18. ความสัมพันธระหวาง Image และ Container Image (registry) Image (local) PULL Container RUN
  19. 19. ความสัมพันธระหวาง Image และ Container Image (registry) Image (local) PULL Container Container’ CHANGE RUN
  20. 20. ความสัมพันธระหวาง Image และ Container COMMIT Image (registry) Image (local) PULL Container Container’ RUN CHANGE
  21. 21. ความสัมพันธระหวาง Image และ Container Image (registry) Image (local) PULL Container Container’ RUN CHANGE PUSH COMMIT
  22. 22. ความสัมพันธระหวาง Image และ Container Image (registry) Image (local) PULL Container Container’ RUN CHANGE COMMIT PUSH
  23. 23. “ Image like a class Container is a instance of class “ Image และ Container ตางกันยังไง?
  24. 24. เราจะใชงาน Docker ไดยังไง?
  25. 25. Docker community edition ไปที่ https://www.docker.com/community-edition#/download เพื่อทําการดาวโหลดมาลงที่เครื่องไดเลย
  26. 26. Docker-machine ทํางานยังไง
  27. 27. Docker-machine Command
  28. 28. Version $ docker-machine version docker-machine version 0.14.0, build 89b8332
  29. 29. Create machine $ docker-machine create -d virtualbox dev Running pre-create checks... (dev) Default Boot2Docker ISO is out-of-date, downloading the latest release... (dev) Latest release for github.com/boot2docker/boot2docker is v18.03.0-ce (dev) Downloading /Users/snappytux/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v18.03.0-ce/boot2docker.iso.. . (dev) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100% Creating machine... … ... To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env dev
  30. 30. Create machine $ docker-machine create -d virtualbox dev Running pre-create checks... (dev) Default Boot2Docker ISO is out-of-date, downloading the latest release... (dev) Latest release for github.com/boot2docker/boot2docker is v18.03.0-ce (dev) Downloading /Users/snappytux/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v18.03.0-ce/boot2docker.iso.. . (dev) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100% Creating machine... … ... To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env dev Machine driver Machine name
  31. 31. List and start machine $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS champ - virtualbox Running tcp://192.168.99.100:2376 v18.03.0-ce dev - virtualbox Stopped Unknown $ docker-machine start dev Starting "dev"... (dev) Check network to re-create if needed... (dev) Waiting for an IP... Machine "dev" was started. Waiting for SSH to be available... Detecting the provisioner... Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command. Machine name Ip 192.168.99.100 สําหรับเขา machine
  32. 32. Connect to machine $ eval $(docker-machine env dev) docker-machine version 0.14.0, build 89b8332 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS champ - virtualbox Stopped Unknown dev * virtualbox Running tcp://192.168.99.100:2376 v1.13.1 มีดอกจันทรอยูในชอง Active นั้นแสดงวาเราใชงาน docker บน machine นี้ไดแลว
  33. 33. Stop machine $ docker-machine stop dev Stopping "dev"... Machine "dev" was stopped. $ docker-machine stop dev Stopping "dev"... Machine "dev" was stopped. Machine name
  34. 34. Docker basic Command
  35. 35. Version $ docker version Client: Version: 18.03.0-ce API version: 1.26 (downgraded from 1.37) Go version: go1.9.4 Git commit: 0520e24 Built: Wed Mar 21 23:06:22 2018 OS/Arch: darwin/amd64 Experimental: false Orchestrator: swarm Server: Engine: ...
  36. 36. Info $ docker info Containers: 7 Running: 0 Paused: 0 Stopped: 7 Images: 63 Server Version: 1.13.1 Storage Driver: aufs Root Dir: /mnt/sda1/var/lib/docker/aufs Backing Filesystem: extfs Dirs: 342 Dirperm1 Supported: true Logging Driver: json-file
  37. 37. Pull base image(s) $ docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 22dc81ace0ea: Pull complete 1a8b3c87dba3: Pull complete 91390a1c435a: Pull complete 07844b14977e: Pull complete b78396653dae: Pull complete Digest: sha256:e348fbbea0e0a0e73ab0370de151e7800684445c509d46195aef73e090a49bd6 Status: Downloaded newer image for ubuntu:latest
  38. 38. Pull base image(s) $ docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 22dc81ace0ea: Pull complete 1a8b3c87dba3: Pull complete 91390a1c435a: Pull complete 07844b14977e: Pull complete b78396653dae: Pull complete Digest: sha256:e348fbbea0e0a0e73ab0370de151e7800684445c509d46195aef73e090a49bd6 Status: Downloaded newer image for ubuntu:latest Image name
  39. 39. Pull base image(s) $ docker pull ubuntu:17.10 Using default tag: 17.10 latest: Pulling from library/ubuntu 22dc81ace0ea: Pull complete 1a8b3c87dba3: Pull complete 91390a1c435a: Pull complete 07844b14977e: Pull complete b78396653dae: Pull complete Digest: sha256:e348fbbea0e0a0e73ab0370de151e7800684445c509d46195aef73e090a49bd6 Status: Downloaded newer image for ubuntu:latest
  40. 40. Pull base image(s) $ docker pull ubuntu:17.10 Using default tag: 17.10 latest: Pulling from library/ubuntu 22dc81ace0ea: Pull complete 1a8b3c87dba3: Pull complete 91390a1c435a: Pull complete 07844b14977e: Pull complete b78396653dae: Pull complete Digest: sha256:e348fbbea0e0a0e73ab0370de151e7800684445c509d46195aef73e090a49bd6 Status: Downloaded newer image for ubuntu:latest Tag image
  41. 41. Docker Store
  42. 42. List images $ docker images
  43. 43. Run container $ docker run ubuntu /bin/echo “hello, world” “hello, world” $ docker run ubuntu /bin/echo “hello, world” “hello, world” Image name execute argument
  44. 44. List container $ docker ps $ docker ps -a ใส -a เพื่อดู container มีอยูทั้งหมด
  45. 45. Run container in deamon $ docker run -d ubuntu /bin/sh -c “while true; do echo hello world; sleep 1; done;” ac74639343196e056d3a2e27f8f63f1417529a6d8ea7176ee0e50075d34eea6a $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b8320010b488 ubuntu "/bin/sh -c 'while t…" 2 seconds ago Up 1 second epic_einstein เราใช id ของ container ในการเรียกใชงานได
  46. 46. Log container $ docker logs b8320010b488 hello world hello world ... Log จะถูกแสดงออกมา
  47. 47. Expose Port $ docker run -d -p 8090:80 nginx:alpine $ docker ps -a bc648a0e5ef9e7364e67f94f9993083c38b4be566f0f8312e812fd7325344f27 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc648a0e5ef9 nginx:alpine "nginx -g 'daemon of…" 42 seconds ago Up 41 seconds 443/tcp, 0.0.0.0:8090->80/tcp flamboyant_pike
  48. 48. Expose Port $ docker run -d -p 8090:80 nginx:alpine $ docker ps -a -p <host_port>:<guest_port> bc648a0e5ef9e7364e67f94f9993083c38b4be566f0f8312e812fd7325344f27 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc648a0e5ef9 nginx:alpine "nginx -g 'daemon of…" 42 seconds ago Up 41 seconds 443/tcp, 0.0.0.0:8090->80/tcp flamboyant_pike
  49. 49. วิธีเขาไปยัง container $ docker run -d --name my-nginx nginx $ docker ps ee3a421f38a9b12ffffc4666cbc23b0a0053b184f217d64f1cd736a8f485ba0d CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee3a421f38a9 nginx:alpine "nginx -g 'daemon of…" 50 seconds ago Up 49 seconds 80/tcp, 443/tcp my-nginx $ docker exec -it my-nginx bash root@729e05ec6bed:/#
  50. 50. วิธีเขาไปยัง container $ docker run -d --name my-nginx nginx $ docker ps ee3a421f38a9b12ffffc4666cbc23b0a0053b184f217d64f1cd736a8f485ba0d CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee3a421f38a9 nginx:alpine "nginx -g 'daemon of…" 50 seconds ago Up 49 seconds 80/tcp, 443/tcp my-nginx $ docker exec -it my-nginx bash root@729e05ec6bed:/# ชื่อ container
  51. 51. Volume HOST CONTAINER A Volume directory ….. /var/www/html ….. volume
  52. 52. แชร volume ระหวาง containers HOST CONTAINER A Volume directory ….. /var/www/html ….. volume CONTAINER B /var/www/html …..
  53. 53. แชร volume ใหกับ container $ docker run -d -v ./my-project/:/var/www/ --name wordpress my-wordpress -v <host_path>:<container_path> $ docker run -d -v ./my-project/:/var/www/ --name wordpress my-wordpress
  54. 54. Linking PHP+Nginx Container Port วิธีทําแบบนี้ไมปลอดภัย Port MySQL Container HOST
  55. 55. Linking วิธีการเชื่อมโยงแบบนี้จะปลอดภัย PHP+Nginx Container MySQL Container Port Port HOST
  56. 56. Linking วิธีการเชื่อมโยงแบบนี้จะปลอดภัย HOST PHP+Nginx Container MySQL Container Port Port PHPmyadmin Container Port Port
  57. 57. Link container $ docker network create my-net $ docker run -d --name nginx1 --net my-net nginx:alpine 90a679f09e80a0e4a4618ae95dac9d721c768d8f6760b31242e526bd62fb2554 263f4ec6131d933e879e06f5291f8c39b3d1a81abee094555b9e8b0e6e716164 $ docker run -d --name nginx2 --net my-net nginx:alpine a3d741fedd733855207ac81bc8792b0af6b3ddc8ec481d1a07d0a8d7f15ce039 สราง network สราง container ใหอยูใน network เรา
  58. 58. Link container $ docker network create my-net $ docker run -d --name nginx1 --net my-net nginx:alpine 90a679f09e80a0e4a4618ae95dac9d721c768d8f6760b31242e526bd62fb2554 263f4ec6131d933e879e06f5291f8c39b3d1a81abee094555b9e8b0e6e716164 $ docker run -d --name nginx2 --net my-net nginx:alpine a3d741fedd733855207ac81bc8792b0af6b3ddc8ec481d1a07d0a8d7f15ce039 Network name --net <network_name> สราง network สราง container ใหอยูใน network เรา
  59. 59. Link container $ docker network inspect my-net ... "Containers": { "263f4ec6131d933e879e06f5291f8c39b3d1a81abee094555b9e8b0e6e716164": { "Name": "nginx1", "EndpointID": "9e990663ad0b354cd4a50cab4ccaf0d30a84c529d9ef1923d857f1825e55ad04", "MacAddress": "02:42:c0:a8:40:02", "IPv4Address": "192.168.64.2/20", "IPv6Address": "" }, "a3d741fedd733855207ac81bc8792b0af6b3ddc8ec481d1a07d0a8d7f15ce039": { "Name": "nginx2", "EndpointID": "171bb27f7be6d5203246d192d1039cd60f61d5ec8faa02b9d5da481910208a17", "MacAddress": "02:42:c0:a8:40:03", "IPv4Address": "192.168.64.3/20", "IPv6Address": "" } }, ... ตรวจสอบ network วามี container ตัว ไหนอยูบาง
  60. 60. Link container $ docker exec -it nginx1 ping nginx2 $ docker exec -it nginx2 ping nginx1 PING nginx2 (192.168.64.3): 56 data bytes 64 bytes from 192.168.64.3: seq=0 ttl=64 time=0.250 ms 64 bytes from 192.168.64.3: seq=1 ttl=64 time=0.138 ms ^C PING nginx1 (192.168.64.2): 56 data bytes 64 bytes from 192.168.64.2: seq=0 ttl=64 time=0.082 ms 64 bytes from 192.168.64.2: seq=1 ttl=64 time=0.127 ms ^C ลองทดสอบการ ping ไปมาของแตละ container ได
  61. 61. Docker-compose
  62. 62. Docker-compose คืออะไร? “ Docker Compose คือการนําคําสั่งตางๆ ของ Docker มารวมเปนไฟล yaml เปนไฟลเดียว และสามารถจัดการไดหลาย container โดยใช คําสั่งเดียว “
  63. 63. มาลองสราง Wordpress กันดีกวา
  64. 64. สราง wordpress โดย docker ปกติ $ docker pull mysql:5.7 $ docker pull wordpress:latest 5.7: Pulling from library/mysql 2a72cbf407d6: Pull complete 38680a9b47a8: Pull complete 4c732aa0eb1b: Pull complete ... latest: Pulling from library/wordpress 2a72cbf407d6: Already exists 273cd543cb15: Pull complete ec5ac8875de7: Pull complete ... Pull mysql image ลง เครื่อง Pull wordpress image ลง เครื่อง
  65. 65. สราง wordpress โดย docker ปกติ $ docker network create wp-net $ docker volume create wp_db-data d4de3f0e2a2d3a47ba89b720ddf3cb276e799c6c06fa64ccbda4b997a4babdfc wp_db-data สราง volume ชื่อ wp_db-data สราง network ชื่อ wp-net
  66. 66. สราง wordpress โดย docker ปกติ $ docker run -d -v wp_db-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=passroot -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress --name wpdb --net wp-net mysql:5.7 5ed3a8c12c0cee025cc4c1dede687f398af9ce51b3f7382d7b2bce9c98534437 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5ed3a8c12c0c mysql:5.7 "docker-entrypoint.s…" 2 seconds ago Up 1 second 3306/tcp wpdb ตรวจสอบวามี ขึ้นมาจริง สราง db container
  67. 67. สราง wordpress โดย docker ปกติ $ docker run -d -v wp_db-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=passroot -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress --name wpdb --net wp-net mysql:5.7 5ed3a8c12c0cee025cc4c1dede687f398af9ce51b3f7382d7b2bce9c98534437 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5ed3a8c12c0c mysql:5.7 "docker-entrypoint.s…" 2 seconds ago Up 1 second 3306/tcp wpdb ตรวจสอบวามี ขึ้นมาจริง สราง db container Volume name Network name
  68. 68. สราง wordpress โดย docker ปกติ $ docker run -d -p 80:80 -e WORDPRESS_DB_HOST=wpdb:3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress --name wp --net wp-net wordpress:latest 58eb35979e67334482d835bbc71f8a55f52d4f58cd244663635b4a66806fbb37 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58eb35979e67 wordpress:latest "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp wp 30403b6f4f39 mysql:5.7 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 3306/tcp wpdb ตรวจสอบวามี ขึ้นมาจริง สราง wordpress container
  69. 69. สราง wordpress โดย docker ปกติ $ docker run -d -p 80:80 -e WORDPRESS_DB_HOST=wpdb:3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress --name wp --net wp-net wordpress:latest 58eb35979e67334482d835bbc71f8a55f52d4f58cd244663635b4a66806fbb37 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58eb35979e67 wordpress:latest "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp wp 30403b6f4f39 mysql:5.7 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 3306/tcp wpdb ตรวจสอบวามี ขึ้นมาจริง สราง wordpress container Container name
  70. 70. สราง wordpress โดย docker ปกติ
  71. 71. พิมพคําสั่งจนมืองิก กวาจะได
  72. 72. สราง wordpress โดย docker-compose $ vi docker-compose.yml Thank: https://docs.docker.com/compose/wordpress / สรางไฟล docker-comp ose.yml
  73. 73. สราง wordpress โดย docker-compose $ vi docker-compose.yml Version - ประกาศวาจะใช version ไหน Services - เริ่มตนใชงาน service โดยจะมีสองตัวก็ คือ db และ wordpress image: เลือก image ที่จะใขงาน volumes: กําหนด volumes ที่ไวจัดเก็บไฟลฐาน ขอมูล restart: กําหนด always คือเมื่อมีการ restart server เกิดขึ้นให start container นี้ขึ้นมาดวย environment: กําหนดคา env ตางๆ ports: กําหนด port เพิ่มเติม: https://docs.docker.com/compose/compose-fi le/ สรางไฟล docker-comp ose.yml
  74. 74. สราง wordpress โดย docker-compose $ docker-compose up -d Creating network "sites_default" with the default driver Creating volume "sites_wp_db-data" with default driver Creating sites_wordpress_1 ... done Creating sites_db_1 ... done $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------- sites_db_1 docker-entrypoint.sh mysqld Up 3306/tcp sites_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:80->80/tcp Run ไฟล ตรวจสอบวา service ทํา งานไหม
  75. 75. สราง wordpress โดย docker-compose $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b4b0e5174c70 mysql:5.7 "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 3306/tcp sites_db_1 edc04c0c6a16 wordpress:latest "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 0.0.0.0:80->80/tcp sites_wordpress_1
  76. 76. Docker-compose command
  77. 77. Docker-compose command $ docker-compose up -d *** สราง และเริ่ม services ทั้งหมด $ docker-compose start *** เริ่ม services ทั้งหมด $ docker-compose stop *** หยุด services ทั้งหมด เพิ่มเติม: https://docs.docker.com/compose/reference/overview/
  78. 78. Docker-compose command $ docker-compose up -d nginx *** สราง และเริ่มเฉพาะ nginx $ docker-compose start nginx *** เริ่มเฉพาะ nginx $ docker-compose stop nginx *** หยุดเฉพาะ nginx เพิ่มเติม: https://docs.docker.com/compose/reference/overview/ Service name
  79. 79. Docker-compose command $ docker-compose restart nginx *** restart เฉพาะ nginx เพิ่มเติม: https://docs.docker.com/compose/reference/overview/ $ docker-compose restart *** restart services ทั้งหมด Service name
  80. 80. Docker-compose command $ docker-compose down *** ทําลาย services ทั้งหมด (โดยจะไมทําลาย volume ) เพิ่มเติม: https://docs.docker.com/compose/reference/overview/ $ docker-compose down -v *** ทําลาย services ทั้งหมด และลบ volume ดวย
  81. 81. Docker-compose command $ docker-compose logs *** ดู log เพิ่มเติม: https://docs.docker.com/compose/reference/overview/ $ docker-compose exec nginx bash *** เขาไปที่ service นั้นๆ
  82. 82. Docker-compose command $ docker-compose logs *** ดู log เพิ่มเติม: https://docs.docker.com/compose/reference/overview/ $ docker-compose exec nginx bash *** เขาไปที่ service นั้นๆ Service name
  83. 83. Docker-compose command เพิ่มเติม: https://docs.docker.com/compose/reference/overview/ $ docker-compose config *** ไวตรวจสอบไฟล docker-compose วาเขียนถูกตองไหม $ docker-compose ps *** ดูการทํางานของ services
  84. 84. Happy Coding (ò_óˇ)

×