Bắt đầu sử dụng docker qua 4 ví dụ “Hello world!”

Tiếp cận dễ dàng với docker qua 4 ví dụ sau đây.

Nguồn: Developermeme

Phần 1. “Hello World!” từ một Image Python

Giả sử bạn không cài đặt Python trong máy của mình – hoặc ít nhất không phải là phiên bản mới nhất – và bạn cần python để in “Hello World!” trong terminal của bạn. Bạn phải làm gì? Bạn sử dụng docker!

Đi trước và chạy lệnh sau:

docker run --rm -it python:3 python

Đừng lo lắng, tôi sẽ giải thích lệnh đó trong một giây, nhưng ngay bây giờ có lẽ bạn đang thấy một cái gì đó như thế này:

Có thể mất vài phút để lệnh này chạy lần đầu tiên

Điều đó có nghĩa là chúng ta hiện đang ở trong một container docker được tạo từ Image docker python 3 , chạy lệnh python. Để kết thúc ví dụ, gõ print("Hello, World!")và xem như phép màu xảy ra.

Một câu “Hello World!”. Wow!

Được rồi, bạn đã làm điều đó, nhưng trước khi bạn bắt đầu vỗ tay, hãy lùi lại một bước và hiểu cách nó hoạt động.

Breaking it down

Hãy bắt đầu từ đầu. Lệnh docker run là công cụ tiêu chuẩn Docker để giúp bạn bắt đầu và chạy container của bạn.

Cờ --rm ở đó để nói với Docker Daemon để làm sạch Container và loại bỏ các hệ thống tập tin sau khi thoát khỏi container. Điều này giúp bạn tiết kiệm dung lượng ổ đĩa sau khi chạy các Container có thời gian sử dụng ngắn như thế này, chúng ta chỉ bắt đầu in “Hello World!”.

Cờ -t (or --tty) nói Docker để phân bổ một phiên terminal ảo trong container. Điều này thường được sử dụng với -i (or --interactive)tùy chọn, giúp STDIN mở ngay cả khi chạy ở chế độ tách rời (sẽ nói thêm về điều đó sau).

Lưu ý: Đừng lo lắng quá nhiều về các định nghĩa này ngay bây giờ. Chỉ cần biết rằng bạn sẽ sử dụng -it bất cứ lúc nào bạn muốn gõ một số lệnh trên Container của bạn.

Cuối cùng, python:3là base Image chúng ta sử dụng cho container này. Ngay bây giờ, Image này đi kèm với phiên bản python 3.7.3 được cài đặt, trong số những thứ khác. Bây giờ, bạn có thể tự hỏi Image này đến từ đâu, và những gì bên trong nó. Bạn có thể tìm thấy câu trả lời cho cả hai câu hỏi này ngay tại đây , cùng với tất cả các Image python khác mà chúng ta có thể đã sử dụng cho ví dụ này.

Cuối cùng nhưng không kém phần quan trọng, pythonlà lệnh chúng ta đã bảo Docker thực thi bên trong python:3 Image của chúng ta , nó đã khởi động một lớp python shell và cho phép print("Hello, World!") lệnh của chúng ta hoạt động.

Một điều nữa

Để thoát python và chấm dứt container của chúng ta, bạn có thể sử dụng CTRL / CMD + D hoặc exit(). Đi trước và làm điều đó ngay bây giờ. Sau đó, hãy thử thực hiện docker run lại lệnh của chúng ta và bạn sẽ thấy một cái gì đó hơi khác một chút, và nhanh hơn rất nhiều.

Nhanh hơn nhiều. Ồ

Đó là bởi vì chúng ta đã tải xuống python:3 Image, vì vậy bây giờ container của chúng ta bắt đầu nhanh hơn rất nhiều.

Phần 2. Tự động “Hello World!” từ một Image Python

Còn gì tuyệt hơn viết “Hello World!” trong terminal của bạn một lần? Bạn đã nhận nó, viết nó hai lần!

Vì chúng ta không thể chờ đợi để xem “Hello World!” được in trong terminal của chúng ta một lần nữa và chúng ta không muốn trải qua thời gian chờ đợi của việc mở python và gõ printlại, hãy tiếp tục và tự động hóa quá trình đó một chút. Bắt đầu bằng cách tạo một tệp hello.py bất cứ nơi nào bạn muốn.

# hello.py
print("Hello, World!")

Tiếp theo, hãy tiếp tục và chạy lệnh sau từ cùng một thư mục.

docker run --rm -it -v $(pwd):/src python:3 python /src/hello.py

Đây là kết quả mà chúng ta đang tìm kiếm:

Tuyệt quá! YAHW (Còn một câu “Hello World!”)

Lưu ý: Tôi đã sử dụng ls trước lệnh để cho bạn thấy rằng tôi đang ở trong cùng thư mục mà tôi đã tạo tệp hello.py.

Như chúng ta đã làm trước đó, chúng ta hãy lùi lại một bước và hiểu cách thức hoạt động.

Breaking it down

Chúng tôi đang chạy khá nhiều lệnh tương tự mà chúng ta đã chạy trong phần cuối cùng, ngoài hai điều.

Các tùy chọn -v $(pwd):/src Docker Daemon để khởi động một Bind mount container của chúng ta Bind mount là cách tốt nhất để duy trì dữ liệu trong Docker. Trong ví dụ này, chúng ta đang nói với Docker rằng chúng ta muốn thư mục hiện tại – được lấy từ $(pwd)– được thêm vào Container của chúng ta trong thư mục /src.

Lưu ý: Bạn có thể sử dụng bất kỳ tên hoặc thư mục nào khác mà bạn muốn, không chỉ

/src

Nếu bạn muốn kiểm tra xem /src/hello.py thực sự tồn tại bên trong container của chúng ta, bạn có thể thay đổi kết thúc lệnh của chúng ta từ python hello.pysang bash. Điều này sẽ mở ra một shell tương tác bên trong container của chúng ta và bạn có thể sử dụng nó như bạn mong đợi.

Điều đó có điên không?

Lưu ý: Chúng tôi chỉ có thể sử dụng bashở đây vì nó được cài đặt sẵn trong Image  python:3. Một số Image đơn giản đến mức chúng thậm chí không có bash. Điều đó không có nghĩa là bạn không thể sử dụng nó, nhưng bạn sẽ phải tự cài đặt nó nếu bạn muốn.

Phần cuối cùng của lệnh của chúng ta là python /src/hello.py. Bằng cách chạy nó, chúng ta đang bảo container của chúng ta nhìn vào bên trong /srcthư mục của nó và thực thi file hello.py bằng cách sử dụng python.

Có thể bạn đã có thể thấy những điều kỳ diệu bạn có thể làm với sức mạnh này, nhưng dù sao tôi cũng sẽ làm nổi bật nó cho bạn. Sử dụng những gì chúng ta vừa học, chúng ta có thể chạy bất kỳ code nào từ bất kỳ ngôn ngữ nào trong bất kỳ máy tính nào mà không phải cài đặt bất kỳ phụ thuộc nào vào máy chủ – ngoại trừ Docker, tất nhiên. Đó là rất nhiều văn bản in đậm cho một câu, vì vậy hãy chắc chắn rằng bạn đã đọc hai lần!

Phần 3. Dễ nhất “Hello World!” có thể từ một Image Python bằng Dockerfile

Bạn có mệt mỏi khi nói xin chào với hành tinh xinh đẹp của chúng ta chưa? Đó là một sự xấu hổ, vì chúng ta sẽ làm điều đó một lần nữa!

Lệnh cuối cùng chúng ta học được là một chút dài dòng và tôi có thể thấy mình đã mệt mỏi khi gõ tất cả các code đó mỗi khi tôi muốn nói “Hello World!” Bây giờ hãy tự động hóa mọi thứ một chút nữa. Tạo một tệp có tên Dockerfilevà thêm nội dung sau vào đó:

FROM python:3
WORKDIR /src/app
COPY . .
CMD [ "python", "./hello.py" ]

Bây giờ hãy chạy lệnh này trong cùng thư mục bạn đã tạo Dockerfile:

docker build -t hello .

Tất cả những gì còn lại phải làm bây giờ là phát điên khi sử dụng code này:

docker run hello
Lưu ý rằng bạn thậm chí không cần phải ở trong cùng một thư mục nữa

Bạn đã biết nó như thế nào. Chúng ta hãy dành một chút thời gian để hiểu cách thức hoạt động của Dockerfile.

Breaking it down

Bắt đầu với Dockerfile của chúng ta, dòng đầu tiên FROM python:3 là bảo Docker bắt đầu mọi thứ với Image cơ bản mà chúng ta đã quen thuộc python:3.

Dòng thứ hai WORKDIR /src/app, đặt thư mục làm việc bên trong container của chúng ta. Đây là một số chỉ dẫn mà chúng ta sẽ thực hiện sau này, như CMDhoặc COPY. Bạn có thể xem phần còn lại của các hướng dẫn được hỗ trợ cho WORKDIR ngay tại đây .

Dòng thứ ba, COPY . . về cơ bản là bảo Docker sao chép mọi thứ từ thư mục hiện tại của chúng ta (đầu tiên .) và dán nó vào /src/app (thứ hai .). Vị trí dán được đặt trong thư mục WORKDIR ngay phía trên nó.

Lưu ý: Chúng ta có thể đạt được kết quả tương tự bằng cách xóa WORKDIR thay thế COPY . . bằng COPY . /src/app. Trong trường hợp đó, chúng ta cũng sẽ cần thay đổi CMD ["python", "/src/app/hello.py"].

Cuối cùng, dòng cuối cùng CMD ["python", "./hello.py"]đang cung cấp lệnh mặc định cho container của chúng ta. Về cơ bản, nó nói rằng mỗi khi chúng ta run một cấu hình từ cấu hình này, nó sẽ chạy python ./hello.py. Hãy nhớ rằng chúng ta đang chạy ngầm /src/app/hello.py thay vì chỉ hello.py, vì đó là những gì chúng ta đã chỉ ra WORKDIR.

Lưu ý: Các CMDlệnh có thể được ghi đè khi chạy. Ví dụ, nếu bạn muốn chạy bash thay thế, bạn sẽ làm docker run hello bash sau khi built container.

Khi Dockerfile của chúng ta hoàn thành, chúng ta tiếp tục và bắt đầu buildquá trình của chúng ta . Các lệnh docker build -t hello .đọc tất cả các cấu hình chúng ta thêm vào Dockerfile của chúng ta và tạo ra một Image Docker từ nó. Điều đó đúng, giống như Image python:3 chúng ta đã sử dụng cho toàn bộ bài viết này. Dâu .cuối cùng nói với Docker mà chúng ta muốn chạy một Dockerfile tại vị trí hiện tại của chúng ta, và các tùy chọn -t hello cho Image này tên hello, vì vậy chúng ta có thể dễ dàng tham khảo nó khi chạy.

Sau tất cả những điều đó, tất cả những gì chúng ta cần làm là chạy docker runhướng dẫn thông thường , nhưng lần này với hellotên Image ở cuối dòng. Điều đó sẽ bắt đầu một Container từ Image mà chúng ta đã xây dựng gần đây và cuối cùng in ra chữ “Hello World!” trong terminal của chúng ta.

Mở rộng Base Image của chúng ta

Chúng ta phải làm gì nếu chúng ta cần một số requirements để chạy code không được cài đặt sẵn với Base Image của chúng ta? Để giải quyết vấn đề đó, docker có RUN hướng dẫn .

Theo ví dụ python của chúng ta, nếu chúng ta cần numpy thư viện để chạy code của chúng ta, chúng ta có thể thêm RUN ngay sau lệnh FROM của chúng ta .

FROM python:3
# NEW LINERUN pip3 install numpy
WORKDIR /src/app
COPY . .
CMD [ "python", "./hello.py" ]

Lệnh RUNvề cơ bản đưa ra một lệnh được thực thi bởi container terminal. Bằng cách đó, vì Base Image của chúng ta đã được cài đặt pip3, chúng ta có thể sử dụng pip3 install numpy.

Lưu ý: Đối với một ứng dụng python thực, có lẽ bạn sẽ thêm tất cả các requirements bạn cần vào một file requirements.txt, sao chép nó vào container và sau đó cập nhật  RUN như sau:

RUN pip3 install -r requirements.txt.

Phần 4. “Hello World!” từ một Image Nginx sử dụng một container tách rời

Hãy tiếp tục và sử dụng sức mạnh docker mới pull của chúng ta để tạo ra một container tồn tại lâu đơn giản, thay vì những cái chỉ tồn tại ngắn mà chúng ta đã sử dụng cho đến nay.

Tạo một tập tin index.html trong một thư mục mới với nội dung sau đây.

# index.html
<h1>Hello, World!</h1>

Bây giờ, hãy tạo một Dockerfile mới trong cùng một thư mục.

# Dockerfile
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY . .

Xây dựng Image và đặt tên cho nó simple_nginx, giống như chúng ta đã làm trước đây.

docker build -t simple_nginx .

Cuối cùng, hãy chạy Image mới được tạo của chúng ta bằng lệnh sau:

docker run --rm -d -p 8080:80 simple_nginx

Bạn có thể nghĩ rằng không có gì xảy ra vì bạn đã quay trở lại terminal của mình, nhưng hãy xem xét kỹ hơn với lệnh docker ps.

Tôi đã phải cắt ra, nhưng bạn sẽ thấy một vài cột khác ở đó

Các lệnh docker ps show tất cả các container đang chạy trong máy tính của bạn. Như bạn có thể thấy trong hình trên, tôi có một container có tên simple_nginx đang chạy trong máy của tôi ngay bây giờ. Hãy mở một trình duyệt web và xem nếu nginx nó đang chạy bằng cách truy cập localhost:8080.

Nó đây rồi

Mọi thứ dường như đang hoạt động như mong đợi và chúng ta đang có một trang tĩnh thông qua hoạt nginx động bên trong container của chúng ta. Hãy dành một chút thời gian để hiểu làm thế nào chúng ta hoàn thành điều đó.

Breaking it down

Tôi sẽ bỏ qua phần giải thích Dockerfile vì chúng ta đã học các lệnh đó trong phần trước. Điều “mới” duy nhất trong cấu hình đó là nginx:alpine Image, bạn có thể đọc thêm về nó ở đây .

Ngoài những gì mới, cấu hình này hoạt động vì nginx sử dụng thư mục  usr/share/nginx/html để tìm kiếm file index.html và bắt đầu hiển thị tệp, vì vậy chúng ta đặt tên tệp của chúng ta index.htmlvà định cấu hình WORKDIRlà usr/share/nginx/html, thiết lập này sẽ hoạt động ngay lập tức.

Các lệnh build hoàn toàn giống với những gì chúng ta được sử dụng trong phần cuối cùng là tốt, chúng ta chỉ sử dụng cấu hình Dockerfile để xây dựng một Image với một tên nào đó.

Bây giờ cho phần thú vị, docker run --rm -d -p 8080:80 simple_nginx. Ở đây chúng ta có hai lá cờ mới. Cái đầu tiên là -d cờ tách rời ( ), có nghĩa là chúng ta muốn chạy container này trong nền và đó là lý do tại sao chúng ta quay lại terminal của mình ngay sau khi sử dụng lệnh docker run, mặc dù container của chúng ta vẫn đang chạy.

Cờ mới thứ hai là -p 8080:80. Như bạn có thể đoán, đây là port và về cơ bản, ánh xạ cổng 8080 từ máy local của chúng ta đến cổng 80 bên trong container của chúng ta. Bạn có thể đã sử dụng bất kỳ cổng nào khác thay thế 8080, nhưng bạn không thể thay đổi cổng 80 mà không cần thêm cài đặt bổ sung cho nginx Image, vì đó 80 là cổng tiêu chuẩn mà nginxImage expose ra.

Lưu ý: Nếu bạn muốn dừng một Container chạy ngầm như Container này, bạn có thể sử dụng lệnh docker ps để lấy  tên hoặc id của container (không phải Image), sau đó sử dụng docker stop với tên hoặc id của container mong muốn ở cuối dòng.

Phần 5. Kết thúc

Đó là nó! Nếu bạn vẫn đang đọc bài này, bạn có tất cả những điều cơ bản để bắt đầu sử dụng Docker ngay hôm nay trong các dự án cá nhân hoặc công việc hàng ngày của bạn.

Hãy cho tôi biết những gì bạn nghĩ về bài viết này trong các bình luận, và tôi sẽ đảm bảo viết một bài viết tiếp theo về các chủ đề nâng cao hơn như docker-composeở đâu đó trong tương lai gần.

Nếu có thắc mắc gì xin cứ hỏi tôi.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments