Docker cơ bản (P1) – image và container – Viblo
Mời bạn đến với trang web của chúng tôi, nơi chúng tôi cung cấp những thông tin về Docker image là gì Hãy cùng chúng tôi khám phá bài viết này
Xin chào mọi người, ngày hôm nay mình xin phép quay lại với một bài viết về môi trường growth khi phát triển ứng dụng. Và mình xin chia sẻ một chút kiến thức về Docker – một công cụ tuyệt vời cho việc phát triển hay scale (mở rộng) ứng dụng. Với chút kiến thức ít ỏi của mình hy vọng giúp được phần nào để các bạn hiểu đôi chút cơ bản và bắt đầu sử dụng Docker. Chúng ta cùng vào bài viết nhé!
Với việc phát triển ứng dụng thông thường, chúng ta thường chạy trực tiếp trên máy thật (host) để construct ứng dụng. Và một ứng dụng chúng ta không chỉ có một service mà cần nhiều service hay bundle gồm các ngôn ngữ khác nhau để có thể xây dựng hoàn chỉnh. Với từng service, bundle đó chúng ta phải cài đặt tỉ mỉ đảm bảo ghi rõ từng model của bundle hay ngôn ngữ sử dụng để có thể tương thích và hoạt động êm xuôi được.
Mỗi khi bàn giao cho khách hàng hay cho các developer khác để bảo trì ứng dụng, họ sẽ phải cài lại từng bundle đó, nhưng không thể tránh được trường hợp cài sai model hay confict, và phải mất quá nhiều thời gian cho việc set-up môi trường. Docker ra đời đã giải quyết được bài toán đó, công cụ này mang lại cho chúng ta sự tiện lợi khi tất cả những thứ cần thiết của ứng dụng được đóng gói (photographs) và containerization (theo cách triển khai container của docker) để việc keep, construct ứng dụng trở nên nhanh chóng hơn bao giờ hết.
Kiến trúc của docker:
Docker hoạt động trên kiến trúc client-server.
- Với Consumer là nơi mà người dùng tương tác để gửi requests tới Docker Daemon (DOCKER_HOST) thông qua CLI (Command line interface) để thực hiện các thao tác như construct, pull, run photographs.
- Server : Docker daemon lắng nghe các request từ shopper và tiến hành các thao tác đó, quản lý các photographs, containers, networks và volumes. Docker daemon.
- Trong hình chúng ta có thêm Registry: đây là nơi lưu trữ các photographs khi đã construct và hiện tại có một nơi lưu trữ public cho mọi người đấy là docker hub.
- Đầu tiên để sử dụng, chúng ta cần cài đặt docker. Ở trang chủ cũng đã hướng dẫn cài đặt nên mình không nêu chi tiết từng bước, mọi người vào hyperlink này xem nhé : https://docs.docker.com/engine/set up/ubuntu/
3.1. Photos
- Photos là một file read-only, không thể thay đổi được, nó chứa các thư viện, công cụ, dịch vụ hay packages, những cấu hình để chạy và cần thiết để tạo nên ứng dụng. Chúng ta cũng không thể begin hoặc run photographs giống như container và có thể tạo được picture cho chính mình hoặc lấy photographs đã public trên registry để về và customise thành một picture gồm những công cụ cần thiết cho riêng mình.
Để tạo ra một picture, chúng ta cần tạo một Docker File. Docker dựa vào file này để sử dụng và construct ra photographs. Docker file bao gồm tất cả các instruction (hướng dẫn) để docker construct ra một picture. Bây giờ chúng ta sẽ demo tạo một picture chứa ubuntu nhé.
FROM ubuntu:18.04 LABEL maintainer=”[email protected]” RUN apt-get replace && apt-get -y set up apache2 EXPOSE 80
Ở trên mình có một file Dockerfile đơn giản để construct một picture gồm ubuntu và cài đặt apache2 vào . Trong file này chúng ta nhìn thấy các Instruction:
- FROM: đây là nơi khai báo ra picture base, mình lấy phiên bản ubuntu:18.04 để sử dụng.
- LABEL: nơi đưa ra các metadata hay thông tin của picture, có thể là model, maintainer …
- RUN: Ở đây sẽ thực thi command ở prime layer của photographs. tức là một khi chúng ta tạo ra một photographs mới thì lúc này chúc ta đang ở layer mới. Tóm lại nó sẽ thực thi command khi construct photographs.
- EXPOSE : thông thường apache2 chạy trên cồng 80. Vì vậy chúng ta sẽ sử dụng cổng 80 trên ubuntu có thể chạy đc apache2. Và khi muốn sử dụng chúng ta cần gắn thêm thẻ -p và gán cổng cho chúng khi tạo container từ picture này
Ngoài ra trong Dockerfile chúng ta còn có
- CMD: CMD được dùng để thực thi câu lệnh khi chúng ta sử dụng photographs hay begin container.
CMD [“executable”,”param1″,”param2″] CMD [“param1″,”param2”] (sử dụng cho việc truyền tham số cho ENTRYPOINT) CMD command param1 param2
- ENTRYPOINT: ENTRYPOINT thường dùng để thực thi nhiều câu lệnh trong quá trình begin container. Thường trong ENTRYPOINT sẽ chọn file shell script để lấy ra những câu lệnh được thực thi.
- WORKDIR: sử dụng để định nghĩa thư mục đang làm việc cho container. bất kỳ câu lệnh trong khi thực hiện RUN, CMD, … đều sẽ được thực thi ngay trong thư mục này.
- Ngoài ra chúng ta còn có các instruction khác như ADD, COPY, … Mình có dẫn hyperlink trang chủ chi tiết hơn tại đây : https://docs.docker.com/engine/reference/builder/
Sau khi cấu hình xong file Dockerfile này, chúng ta chạy lệnh dưới để construct picture nhé :
$ docker construct -t docker-apache2 .
- Với -t để gắn tag cho picture.
Sending construct context to Docker daemon 2.56kB Step 1/4 : FROM ubuntu:18.04 18.04: Pulling from library/ubuntu 92dc2a97ff99: Pull full be13a9d27eb8: Pull full c8299583700a: Pull full Digest: sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26 Standing: Downloaded newer picture for ubuntu:18.04 -> 329ed837d508 Step 2/4 : LABEL maintainer=”[email protected]” -> Working in 64bef33f08eb Eradicating intermediate container 64bef33f08eb -> 93afda6024d0 Step 3/4 : RUN apt-get replace && apt-get -y set up apache2 … Eradicating intermediate container 000eeb497905 -> 2efcc7312083 Step 4/4 : EXPOSE 80 -> Working in 9798427c060c Eradicating intermediate container 9798427c060c -> 9289f9d24416 Efficiently constructed 9289f9d24416 Efficiently tagged docker-apache2:newest
Kiểm tra lại xem picture đã sử dụng được chưa : Listing các picture:
$ docker photographs -a
hoặc
$ docker picture ls REPOSITORY TAG IMAGE ID CREATED SIZE docker-apache2 newest 9289f9d24416 Three hours in the past 195MB <none> <none> 2efcc7312083 Three hours in the past 195MB
Xóa một picture:
$ docker rmi <id_image | name_image> $ docker picture rm <id_image | name_image>
Vậy chúng ta đã construct thành công một picture. Vậy cái picture này làm gì thì chúng ta sẽ tiếp tục với phần container nhé.
3.2. Container
Để sử dụng được tiện ích của Docker thì phần quan trọng nhất không thể thiếu cùng với Photos đấy chính là Container. Chúng ta đã có picture đóng gói lại công cụ cần thiết. vậy để sử dụng photographs chúng ta cần chạy container sử dụng picture đó lên.
$ docker run -it -name “apachelinux” -p 8080:80 docker-apache2
Với “apachelinux” là tên của container chúng ta đặt tùy chọn.
- -p thể hiện port để chúng ta config submit ở máy thật và gán cho container. Container mình sử dụng picture docker-apache2 vừa tạo ở trên với port 80. Mình ánh xạ cổng 8080 bên ngoài máy thật (host) để với cổng 80 trên docker.
- -it : để chạy container và dùng với terminal.
Sau đấy chúng ta sẽ vào được container dùng picture ubuntu và thử chạy service apache2 begin và nhận kết quả nhé :
Lưu ý: đang trong terminal nếu gõ exit thì container sẽ cease. vì vậy nếu muốn thoát terminal mà container vẫn chạy mọi người nhấn Ctrl+p, Ctrl + q nhé.
Để xem các container đang chạy chúng ta sử dụng :
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES def3ba1d8a87 docker-apache2 “/bin/bash” 12 minutes in the past Up 12 minutes 0.0.0.0:8080->80/tcp apachelinux
Xem tất cả các container đang chạy và đã cease
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES def3ba1d8a87 docker-apache2 “/bin/bash” 12 minutes in the past Up 12 minutes 0.0.0.0:8080->80/tcp apachelinux 20c8aa9108b1 ubuntu-nginx “/construct/begin.sh /bi…” 9 days in the past Exited (0) 9 days in the past intelligent_wozniak
Container đang chạy, thực thi câu lệnh và chạy vào container đó ta sử dụng:
$ docker exec <param> <id_container | name_container> command
Vd: mở terminal khi có container đã begin:
$ docker exec -it <id_container | name_container> bin/bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8712a127bc73 docker_demo_my-php “docker-php-entrypoi…” 16 hours in the past Up 51 minutes 9000/tcp php-product 46a08731dfce mysql:newest “docker-entrypoint.s…” 16 hours in the past Up 51 minutes 3306/tcp, 33060/tcp mysql-product 51b866b7026b httpd:newest “httpd-foreground” 16 hours in the past Up 51 minutes 0.0.0.0:9998->80/tcp, 0.0.0.0:4433->443/tcp c-httpd01 $ docker exec -it c-httpd01 bash [email protected]:/usr/native/apache2#
Xóa một container:
$ docker rm <id_container | name_container>
Xóa một picture:
$ docker picture rm <id_image | name_image>
||
$ docker rmi <id_image | name_image>
Với tag -f : bạn có thể xóa container hoặc picture ngay cả khi container hoặc picture có container đang operating.
Với bài viết này, mình đã giới thiệu một số kiến thức cơ bản và quan trọng trong docker cũng như một số câu lệnh thường sử dụng với docker. Hello vọng với kiến thức này mọi người có thể tiếp tục phát triển ability của mình với docker để dễ dàng làm việc với những dự án lớn cần sử dụng tới nó. Hẹn gặp lại trong các bài viết tời của mình tiếp tục về chủ đề docker. Thanks for studying !!