Như trong bài viết trước tôi có giới thiệu qua về Docker. Nếu bạn chưa biết khái niệm về Docker thì hãy đọc qua bài viết đó trước. Trong phần này chúng ta sẽ cùng tìm hiểu về cách cài đặt và sử dụng Docker thông qua ví dụ đơn giản.
Bạn có thể xem hướng dẫn chi tiết về cách cài đặt Docker tại đây.
Nếu bạn đang chạy Docker trên Linux, bạn cần chạy toàn bộ câu lệnh với quyền root hoặc thêm user của bạn vào docker group và đăng nhập lại
sudo usermod -aG docker $(whoami)`
Thuật ngữ
- Container – Một instance đang chạy, đóng gói các phần mềm được yêu cầu. Container luôn được tạo từ một Image. Các Container có thể tìm thấy các Port và Volume để có thể tương tác với Container khác và / hoặc với thế giới bên ngoài. Container có thể dễ dàng bị tắt hoặc xoá đi và được tạo lại trong khoảng thời gian rất ngắn. Container không nắm giữ state.
- Image – thành phần cơ bản cho tất cả Container. Khi bạn tạo một Image, tất cả các bước sẽ được cache lại và có thể được sử dụng lại. Tuỳ thuộc vào Image, nó có thể mất thời gian để build. Mặt khác, Container có thể được start từ Image ngay lập tức.
- Port – Nguồn gốc của nó là một UDP/TCP port. Hiểu một cách đơn giản, chúng ta có thể hình dùng rằng Port được dùng để kết nối với bên ngoài (có thể truy cập từ hệ điều hành máy chủ) hoặc kết nối với các Container khác – ví dụ như là nó chỉ có thể được truy cập từ các Container khác và ẩn với bên ngoài.
- Volume – Có thể hiểu nó như một thư mục được chia sẻ. Volume được thiết lập khi một Container được tạo. Volume được tạo để lưu trữ dữ liệu, độc lập với vòng đời của Container. Registry – Server mà lưu trữ các Image của Docker. Nó có thể được so sánh với Github – Bạn có thể lấy một Image từ Registry để triển khai dưới local hoặc đẩy một Image đã được build vào Registry
- Docker Hub – Registry với giao diện Web được cung cấp bởi Docker Inc. Nó chứa nhiều Docker Image với phần mềm khác nhau. Docker Hub là nguồn Docker Image chính thức được tạo bởi Team Docker hoặc hợp tác với các nhà sản xuất phần mềm chính thống. Những thông tin này luôn có sẵn với các user đăng nhập. Có cả 2 dạng account miễn phí và trả tiền. Bạn có thể có một private Image trên một account và không giới hạn public Image cho account miến phí. Ở đây cũng có một Docker Store – một dịch vụ rất giống với Docker Hub. Nó là một Markerplace với các rating, review…
Hello world
Nào hãy cùng chạy Container đầu tiên của bạn
docker run ubuntu /bin/echo 'Hello world'
Kết quả
Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 6b98dfc16071: Pull complete 4001a1209541: Pull complete 6319fc68c576: Pull complete b24603670dc3: Pull complete 97f170c87c6f: Pull complete Digest:sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d Status: Downloaded newer image for ubuntu:latest Hello world
- docker run là câu lện để chạy một Container
- ubuntu là Image mà bạn muốn chạy. Ví dụ Image hệ điều hành Ubuntu. Khi bạn chỉ định một Image, Docker đầu tiên sẽ tìm kiếm Image trên Host Docker của bạn, nếu Image không tồn tại ở local, thì Image sẽ được kéo về từ một public Image Registry – Docker Hub.
/bin/echo ‘Hello world’
là câu lệnh được chạy trong một Container mới. Container này đơn giản là in ra dòng chữHello world
, và sau đấy dừng thực thi.
Nào hãy tạo một tương tác với shell bên trong một Docker Container:
docker run -i -t --rm ubuntu /bin/bash
- -t gán một pseudo-tty hoặc terminal bên trong Container mới
- -i cho phép bạn tạo một kết nối tương tác bằng cách lấy chuẩn đầu vào (STDIN) của Container.
- –rm tự động xoá Container khi thoát tiến trình. Mặc định các Container sẽ không bị xoá. Container này sẽ tồn tại cho tới khi chúng ta giữ Session của Shell và chấm dứt khi chúng ta thoát khỏi Session (Giống như SSH session với Remote Server).
Nếu bạn muốn Container tiếp tục chạy sau khi kết thúc Session, bạn cần Daemon nó:
docker run --name daemon -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
- –name daemon gán tên daemon vào một Container mới. Nếu bạn không chỉ rõ tên, Docker sẽ tạo ra và gán nó một cách tự động
- -d chạy Container trong background
Nào hãy cùng xem chúng ta có những Container nào ở thời điểm này:
docker ps -a
Kết quả
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fc8cee64ec2 ubuntu "/bin/sh -c 'while..." 32 seconds ago Up 30 seconds daemon c006f1a02edf ubuntu "/bin/echo 'Hello ..." About a minute ago Exited (0) About a minute ago gifted_nobel
- docker ps là câu lệnh hiển thị danh sách các Container đang có
- -a hiển thị tất cả các Container ( nếu không có -a thì nó sẽ chỉ hiển thị các Container đang chạy)
ps hiển thị cho chúng ta 2 Container:
gifted_nobel tên của Container được sinh ra tự động. Nó là Container đầu tiên chúng ta tạo ra và in ra dòng chữ Hello world
. daemon là Container thứ 3 chúng ta tạo và được chạy như daemon.
Chú ý rằng không có Container thứ 2 ở đây bởi vì chúng ta thiết lập lựa chọn –rm. Như kết quả mong muốn, Container này sẽ được xoá tự động hoàn toàn sau khi thực thi xong.
Chúng ta hãy cùng kiểm tra log và xem daemon Container đang hoạt động ra sao:
docker logs -f daemon
Kết quả
... hello world hello world hello world
- Log Docker lấy về các log của Container
- -f để theo dõi log đưa ra (hoạt động chắc chắn giống như tail -f)
Tiếp theo chúng ta sẽ stop daemon Container:
docker stop daemon
Để chắc chắn rằng Container đã được Stop chúng ta có thể kiểm tra:
docker ps -a
Kết quả
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fc8cee64ec2 ubuntu "/bin/sh -c 'while..." 5 minutes ago Exited (137) 5 seconds ago daemon c006f1a02edf ubuntu "/bin/echo 'Hello ..." 6 minutes ago Exited (0) 6 minutes ago gifted_nobel
Container đã được Stop, nếu bạn muốn Start lại thì dùng câu lệnh như sau:
docker start daemon
Chúng ta cần đảm bảo nó đang chạy:
docker ps -a
Kết quả
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fc8cee64ec2 ubuntu "/bin/sh -c 'while..." 5 minutes ago Up 3 seconds daemon c006f1a02edf ubuntu "/bin/echo 'Hello ..." 6 minutes ago Exited (0) 7 minutes ago gifted_nobel
Nào giờ thì Stop và xoá tất cả các Container bằng cách thủ công
docker stop daemon docker rm tên_container_đầu_tiên docker rm daemon
Để xoá tất cả Container cùng một lúc chúng ta có thể sử dụng câu lệnh sau:
docker rm -f $(docker ps -aq)
- docker rm là câu lệnh dùng để xoá Container
- -f (cho rm) stop Container nếu nó đang chạy
- -q (cho ps) là chỉ in ra các ID của Container