Khi làm việc với container, có các câu lệnh chính như sau :
Có một số cách để khởi chạy một container. Bạn có thể nhận thấy rằng các lệnh create, start và run có vẻ rất giống nhau. Lệnh create được sử dụng để khởi tạo một container từ một image nhưng không khởi chạy nó. Hãy coi nó giống như việc tải trước một container mà bạn có thể chạy sau này. Lệnh start khởi động container đã được tải và cho phép nó thực thi. Lệnh run, hay nói cách khác là tạo và khởi chạy container dưới dạng một lệnh duy nhất. Ví dụ 13-3 cung cấp một ví dụ nhanh về cách khởi chạy một container bằng câu lệnh run.
Trong Vi dụ 13-3, Docker tìm kiếm container image hello-world và không thể tìm thấy nó trong kho image ở local. Vì nó chưa bao giờ được tải xuống trước đây, nó trỏ mặc định đến Docker Hub registry, thực hiện tra cứu, tìm image và sau đó tải xuống (hoặc kéo về, trong Docker speak) image mới nhất. Sau đó, nó khởi động container và in ra console một thông báo rằng cài đặt Docker đang hoạt động như mong đợi. Vì bây giờ bạn có một container đã được thực thi, bạn có thể sử dụng lệnh con ls để xem những gì đang chạy:
Rất tiếc, bạn không thấy bất kỳ container nào hoạt động. Đó là bởi vì cái được khởi chạy đã chạy, in thông báo và sau đó kết thúc. Để xem các container đã được chạy nhưng hiện đã bị dừng, bạn phải thêm flag -a sau ls
Bây giờ bạn có thể thấy container ID, tên image, lệnh đã được phát hành và trạng thái hiện tại của nó, trong trường hợp này là exited(đã thoát). Bạn cũng thấy bất kỳ cổng hoặc tên nào đã được gán cho container.
Khởi chạy container và tương tác với nó yêu cầu thêm một vài lệnh khác. Ví dụ 13-4 chạy một container image Ubuntu (ubuntu) ở chế độ tương tác và kết nối thiết bị đầu cuối cục bộ với thiết bị đầu cuối container và khởi chạy bash shell (bash). (Các tùy chọn -i và - t có thể được trình bày riêng biệt hoặc cùng nhau, dưới dạng -it.)
Example 13-4 Lệnh docker run output
Vì container này chưa được tải trước đó, Docker kéo image từ Docker Hub, từng layer một. Nó thực thi Dockerfile được lưu trên kho lưu trữ và kéo phiên bản mới nhất của container Ubuntu cơ sở. Khi nó được kéo về, container sẽ được khởi động và bash shell được thực thi. Hiện tại, terminal cho thấy rằng bạn được kết nối với container dưới dạng root(trong namespace của container). Nếu bạn thực hiện lệnh bash ps, bạn có thể thấy rằng chỉ có hai thứ: bash shell và lệnh ps mà bạn vừa chạy. Điều này làm nổi bật sự cô lập của container khỏi hệ điều hành máy chủ:
Để ngắt kết nối khỏi container, bạn có thể nhập exit, nhưng điều đó sẽ dừng chạy container. Nếu bạn muốn để nó chạy, bạn có thể giữ Ctrl và nhấn P + Q. Thao tác đó đưa bạn trở lại hệ điều hành chủ và để container tiếp tục chạy. Từ hệ điều hành máy chủ, bạn có thể nhập docker container ls để xem container của bạn đang hoạt động:
Nếu bạn muốn kết nỗi lại với container, bạn có thể sử dụng container ID hoặc tên được chỉ định để attach vào container và tương tác lại với nó:
Lệnh inspect và logs là hai lệnh rất hữu ích để khắc phục sự cố một container. Inspect phát ra rất nhiều thông tin — hầu hết mọi thứ liên quan đến việc tạo container, chẳng hạn như mạng và môi trường thời gian chạy, ánh xạ, v.v. (như được hiển thị trong Ví dụ 13-5). Hãy cẩn thận: Đọc output giống như đọc DNA của container
Ví dụ 13-5 lệnh docker container inspect
Lệnh logs nêu chi tiết mọi thứ mà container được ghi lại dưới dạng output(đầu ra) và cực kỳ hữu ích để bắt các thông báo lỗi:
Bây giờ bạn đã biết những điều cơ bản về khởi chạy container, bước tiếp theo là làm cho nó có thể truy cập được với phần còn lại của thế giới. Để thực hiện việc này, bạn có thể bắt đầu bằng cách kéo một container nginx web server và gán cho nó các cổng để sử dụng với flag -p. Tham số này yêu cầu bạn ánh xạ cổng container đến một cổng miễn phí trên máy chủ Docker. Nếu bạn không chỉ định một cổng cho máy chủ cục bộ của mình, Docker sẽ chọn một cổng ngẫu nhiên trên 32700. Ngoài ra, bạn muốn đặt container nginx của mình luôn chạy ngầm thay vì chỉ thoát sau khi bạn khởi chạy nó. Bằng cách sử dụng tham số -d, bạn có thể tách container và để nó chạy ngầm. Điều cuối cùng bạn có thể thử là đặt tên cho container bằng flag –name. Bằng cách này, bạn có thể đề cập đến nó bằng tên thay vì bằng cách sử dụng một tên docker chỉ định ngẫu nhiên hoặc ID container:
Sau khi container được khởi chạy, bạn có thể thấy container đang hoạt động bằng cách sử dụng lệnh ls, nhận thông tin về cổng mà nó đang sử dụng (cổng 80) và xem container được ánh xạ tới địa chỉ IP của máy chủ cục bộ (được tham chiếu bởi 0.0.0.0):
Bạn cũng có thể sử dụng docker container port test-nginx để liệt kê ánh xạ cổng
Nếu bạn mở trình duyệt web và trỏ nó đến http://0.0.0.0, máy chủ nginx của bạn sẽ hiển thị cho bạn một trang HTML mặc định (xem Hình 13-26).
Hình 13-26 nginx bên trong một Container
Máy chủ web có nội dung mặc định không hữu ích lắm. Các container có ý nghĩa là read-only, nhưng có một số cách để thêm nội dung của riêng bạn. Có lệnh cp, cho phép bạn sao chép các file từ local host của mình vào container khi nó được thiết lập và chạy; tuy nhiên để lưu những thay đổi đó, bạn sẽ phải lưu trữ một layer khác trên container của mình và sau đó đẩy container mới đó vào kho lưu trữ của bạn. Điều này sẽ được hiện mỗi khi thay đổi được thực hiện. Một cách tốt hơn là gắn nội dung trực tiếp vào container khi nó khởi động để nó có thể chia sẻ nội dung. Bằng cách này, nếu bạn cần cập nhật bất kỳ thứ gì, bạn chỉ cần thay đổi các file trong một thư mục và những thay đổi sẽ tự động được chia sẻ với bất kỳ container nào sử dụng chúng. Một ví dụ nhanh về điều này bằng cách sử dụng máy chủ nginx sẽ làm cho quá trình này rõ ràng hơn.
Chúng ta có thể bắt đầu với một số file HTML mà nginx có thể hiển thị. Tôi có một file HTML đơn giản trong một thư mục được gọi là html trong Documents trên máy tính xách tay của tôi đang chạy Docker; trong macOS, đường dẫn là ~/Documents/html. Có một thư mục mặc định nơi nginx tìm kiếm các file HTML để hiển thị cho người dùng kết nối với dịch vụ: / usr / share / nginx / html. Bạn phải cung cấp ánh xạ này với flag -v hoặc –volume khi bạn khởi chạy container của mình bằng cách sử dụng ví dụ trước. Nó sẽ trông như thế này:
Sau khi đã nhập xong chuỗi lệnh đó, khi bạn kết nối với http://0.0.0.0, bạn sẽ thấy nội dung HTML của riêng mình. Tham số -v ánh xạ thư mục cục bộ của bạn tới thư mục được chia sẻ trên container, và từ góc nhìn của container, các file đó nằm trong / usr / share / nginx / html. Hình 13-27 cho thấy kết quả của việc ánh xạ container này tới hệ thống file của máy chủ container.
Hình 13-27 Nội dung tùy chỉnh được chia sẻ từ Local Host
Để dừng chạy một container, bạn sử dụng lệnh stop hoặc kill. Sự khác biệt giữa hai là khá rõ ràng. Stop cố gắng cho phép container có thời gian hoàn thành bất kỳ công việc cuối cùng nào một cách nhã nhặn. Mặt khác, sử dụng kill cũng giống như rút phích cắm. Đối với hầu hết các tình huống, bạn sẽ muốn sử dụng stop:
Stop và kill cả hai tạm dừng container nhưng không xóa container khỏi bộ nhớ. Nếu bạn nhập docker container ls -a, bạn vẫn vẫn thấy nó được liệt kê. Khi bạn muốn xóa container khỏi bộ nhớ, bạn có thẻ sử dụng lệnh rm. Bạn cũng có thể sử dụng rất tiện dụng lệnh prune để xóa tất cả các container bị tạm dừng khỏi bộ nhớ. Điều này hữu ích trên máy tính xách tay khi bạn đang thử nghiệm các container và muôn giải phóng bộ nhớ mà không cần phải xóa từng container. Chỉ cần cẩn thận để không loại bỏ bất kỳ container nào mà bạn thự sự muốn bắt đầu sao lưu vì prune sẽ loại bỏ container không hoạt động. Đây là một ví dụ của prune trong hoạt động:
- create : Tạo container từ một image.
- start : Khởi động một container hiện có.
- run : Tạo một container mới và khởi chạy nó.
- ls : Liệt kê các container đang chạy.
- inspect : Thông tin chi tiết về container.
- logs : Hiển thị nhật ký thực thi của container.
- stop : Dừng chạy container một cách tinh tế.
- kill : Dừng quá trình chính trong container một cách đột ngột.
- rm : Xóa một container đã dừng.
Có một số cách để khởi chạy một container. Bạn có thể nhận thấy rằng các lệnh create, start và run có vẻ rất giống nhau. Lệnh create được sử dụng để khởi tạo một container từ một image nhưng không khởi chạy nó. Hãy coi nó giống như việc tải trước một container mà bạn có thể chạy sau này. Lệnh start khởi động container đã được tải và cho phép nó thực thi. Lệnh run, hay nói cách khác là tạo và khởi chạy container dưới dạng một lệnh duy nhất. Ví dụ 13-3 cung cấp một ví dụ nhanh về cách khởi chạy một container bằng câu lệnh run.
Trong Vi dụ 13-3, Docker tìm kiếm container image hello-world và không thể tìm thấy nó trong kho image ở local. Vì nó chưa bao giờ được tải xuống trước đây, nó trỏ mặc định đến Docker Hub registry, thực hiện tra cứu, tìm image và sau đó tải xuống (hoặc kéo về, trong Docker speak) image mới nhất. Sau đó, nó khởi động container và in ra console một thông báo rằng cài đặt Docker đang hoạt động như mong đợi. Vì bây giờ bạn có một container đã được thực thi, bạn có thể sử dụng lệnh con ls để xem những gì đang chạy:
Rất tiếc, bạn không thấy bất kỳ container nào hoạt động. Đó là bởi vì cái được khởi chạy đã chạy, in thông báo và sau đó kết thúc. Để xem các container đã được chạy nhưng hiện đã bị dừng, bạn phải thêm flag -a sau ls
Bây giờ bạn có thể thấy container ID, tên image, lệnh đã được phát hành và trạng thái hiện tại của nó, trong trường hợp này là exited(đã thoát). Bạn cũng thấy bất kỳ cổng hoặc tên nào đã được gán cho container.
Khởi chạy container và tương tác với nó yêu cầu thêm một vài lệnh khác. Ví dụ 13-4 chạy một container image Ubuntu (ubuntu) ở chế độ tương tác và kết nối thiết bị đầu cuối cục bộ với thiết bị đầu cuối container và khởi chạy bash shell (bash). (Các tùy chọn -i và - t có thể được trình bày riêng biệt hoặc cùng nhau, dưới dạng -it.)
Example 13-4 Lệnh docker run output
Vì container này chưa được tải trước đó, Docker kéo image từ Docker Hub, từng layer một. Nó thực thi Dockerfile được lưu trên kho lưu trữ và kéo phiên bản mới nhất của container Ubuntu cơ sở. Khi nó được kéo về, container sẽ được khởi động và bash shell được thực thi. Hiện tại, terminal cho thấy rằng bạn được kết nối với container dưới dạng root(trong namespace của container). Nếu bạn thực hiện lệnh bash ps, bạn có thể thấy rằng chỉ có hai thứ: bash shell và lệnh ps mà bạn vừa chạy. Điều này làm nổi bật sự cô lập của container khỏi hệ điều hành máy chủ:
Để ngắt kết nối khỏi container, bạn có thể nhập exit, nhưng điều đó sẽ dừng chạy container. Nếu bạn muốn để nó chạy, bạn có thể giữ Ctrl và nhấn P + Q. Thao tác đó đưa bạn trở lại hệ điều hành chủ và để container tiếp tục chạy. Từ hệ điều hành máy chủ, bạn có thể nhập docker container ls để xem container của bạn đang hoạt động:
Nếu bạn muốn kết nỗi lại với container, bạn có thể sử dụng container ID hoặc tên được chỉ định để attach vào container và tương tác lại với nó:
Lệnh inspect và logs là hai lệnh rất hữu ích để khắc phục sự cố một container. Inspect phát ra rất nhiều thông tin — hầu hết mọi thứ liên quan đến việc tạo container, chẳng hạn như mạng và môi trường thời gian chạy, ánh xạ, v.v. (như được hiển thị trong Ví dụ 13-5). Hãy cẩn thận: Đọc output giống như đọc DNA của container
Ví dụ 13-5 lệnh docker container inspect
Lệnh logs nêu chi tiết mọi thứ mà container được ghi lại dưới dạng output(đầu ra) và cực kỳ hữu ích để bắt các thông báo lỗi:
Bây giờ bạn đã biết những điều cơ bản về khởi chạy container, bước tiếp theo là làm cho nó có thể truy cập được với phần còn lại của thế giới. Để thực hiện việc này, bạn có thể bắt đầu bằng cách kéo một container nginx web server và gán cho nó các cổng để sử dụng với flag -p. Tham số này yêu cầu bạn ánh xạ cổng container đến một cổng miễn phí trên máy chủ Docker. Nếu bạn không chỉ định một cổng cho máy chủ cục bộ của mình, Docker sẽ chọn một cổng ngẫu nhiên trên 32700. Ngoài ra, bạn muốn đặt container nginx của mình luôn chạy ngầm thay vì chỉ thoát sau khi bạn khởi chạy nó. Bằng cách sử dụng tham số -d, bạn có thể tách container và để nó chạy ngầm. Điều cuối cùng bạn có thể thử là đặt tên cho container bằng flag –name. Bằng cách này, bạn có thể đề cập đến nó bằng tên thay vì bằng cách sử dụng một tên docker chỉ định ngẫu nhiên hoặc ID container:
Sau khi container được khởi chạy, bạn có thể thấy container đang hoạt động bằng cách sử dụng lệnh ls, nhận thông tin về cổng mà nó đang sử dụng (cổng 80) và xem container được ánh xạ tới địa chỉ IP của máy chủ cục bộ (được tham chiếu bởi 0.0.0.0):
Bạn cũng có thể sử dụng docker container port test-nginx để liệt kê ánh xạ cổng
Nếu bạn mở trình duyệt web và trỏ nó đến http://0.0.0.0, máy chủ nginx của bạn sẽ hiển thị cho bạn một trang HTML mặc định (xem Hình 13-26).
Hình 13-26 nginx bên trong một Container
Máy chủ web có nội dung mặc định không hữu ích lắm. Các container có ý nghĩa là read-only, nhưng có một số cách để thêm nội dung của riêng bạn. Có lệnh cp, cho phép bạn sao chép các file từ local host của mình vào container khi nó được thiết lập và chạy; tuy nhiên để lưu những thay đổi đó, bạn sẽ phải lưu trữ một layer khác trên container của mình và sau đó đẩy container mới đó vào kho lưu trữ của bạn. Điều này sẽ được hiện mỗi khi thay đổi được thực hiện. Một cách tốt hơn là gắn nội dung trực tiếp vào container khi nó khởi động để nó có thể chia sẻ nội dung. Bằng cách này, nếu bạn cần cập nhật bất kỳ thứ gì, bạn chỉ cần thay đổi các file trong một thư mục và những thay đổi sẽ tự động được chia sẻ với bất kỳ container nào sử dụng chúng. Một ví dụ nhanh về điều này bằng cách sử dụng máy chủ nginx sẽ làm cho quá trình này rõ ràng hơn.
Chúng ta có thể bắt đầu với một số file HTML mà nginx có thể hiển thị. Tôi có một file HTML đơn giản trong một thư mục được gọi là html trong Documents trên máy tính xách tay của tôi đang chạy Docker; trong macOS, đường dẫn là ~/Documents/html. Có một thư mục mặc định nơi nginx tìm kiếm các file HTML để hiển thị cho người dùng kết nối với dịch vụ: / usr / share / nginx / html. Bạn phải cung cấp ánh xạ này với flag -v hoặc –volume khi bạn khởi chạy container của mình bằng cách sử dụng ví dụ trước. Nó sẽ trông như thế này:
Sau khi đã nhập xong chuỗi lệnh đó, khi bạn kết nối với http://0.0.0.0, bạn sẽ thấy nội dung HTML của riêng mình. Tham số -v ánh xạ thư mục cục bộ của bạn tới thư mục được chia sẻ trên container, và từ góc nhìn của container, các file đó nằm trong / usr / share / nginx / html. Hình 13-27 cho thấy kết quả của việc ánh xạ container này tới hệ thống file của máy chủ container.
Hình 13-27 Nội dung tùy chỉnh được chia sẻ từ Local Host
Để dừng chạy một container, bạn sử dụng lệnh stop hoặc kill. Sự khác biệt giữa hai là khá rõ ràng. Stop cố gắng cho phép container có thời gian hoàn thành bất kỳ công việc cuối cùng nào một cách nhã nhặn. Mặt khác, sử dụng kill cũng giống như rút phích cắm. Đối với hầu hết các tình huống, bạn sẽ muốn sử dụng stop:
Stop và kill cả hai tạm dừng container nhưng không xóa container khỏi bộ nhớ. Nếu bạn nhập docker container ls -a, bạn vẫn vẫn thấy nó được liệt kê. Khi bạn muốn xóa container khỏi bộ nhớ, bạn có thẻ sử dụng lệnh rm. Bạn cũng có thể sử dụng rất tiện dụng lệnh prune để xóa tất cả các container bị tạm dừng khỏi bộ nhớ. Điều này hữu ích trên máy tính xách tay khi bạn đang thử nghiệm các container và muôn giải phóng bộ nhớ mà không cần phải xóa từng container. Chỉ cần cẩn thận để không loại bỏ bất kỳ container nào mà bạn thự sự muốn bắt đầu sao lưu vì prune sẽ loại bỏ container không hoạt động. Đây là một ví dụ của prune trong hoạt động: