Thứ năm, 20/10/2016 | 00:00 GMT+7

Cách gỡ lỗi và khắc phục các sự cố thường gặp của Docker

Docker giúp bạn dễ dàng gói các ứng dụng và dịch vụ của bạn trong các containers để bạn có thể chạy chúng ở mọi nơi. Thật không may, các vấn đề có thể phát sinh khi xây dựng hình ảnh của bạn và tích hợp tất cả các lớp mà ứng dụng của bạn cần, đặc biệt nếu bạn mới sử dụng hình ảnh và containers Docker. Bạn có thể gặp lỗi chính tả, sự cố với thư viện và module thời gian chạy, xung đột đặt tên hoặc sự cố khi giao tiếp với các containers khác.

Trong hướng dẫn khắc phục sự cố này nhằm vào những người mới sử dụng Docker, bạn sẽ khắc phục sự cố khi xây dựng Docker image , giải quyết xung đột đặt tên khi chạy containers và khắc phục sự cố xảy ra khi giao tiếp giữa các containers .

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần

  • Docker được cài đặt trên server hoặc máy local của bạn.

Để cài đặt Docker trên server , bạn có thể làm theo hướng dẫn cách thực hiện cho CentOS 7 hoặc Ubuntu 16.04 .

Bạn có thể truy cập trang web Docker hoặc làm theo tài liệu cài đặt chính thức để cài đặt Docker trên máy local của bạn.

Bước 1 - Giải quyết vấn đề với Dockerfile

Nơi phổ biến nhất mà bạn có thể gặp sự cố là khi bạn đang xây dựng Docker image của bạn từ Dockerfile . Trước khi đi sâu vào, hãy làm rõ sự khác biệt giữa hình ảnh và containers .

  • Hình ảnh là tài nguyên chỉ đọc mà bạn tạo bằng file cấu hình có tên Dockerfile . Đó là những gì bạn gửi và chia sẻ thông qua Docker Hub hoặc cơ quan đăng ký riêng của bạn.
  • Vùng chứa , là một thể hiện đọc ghi mà bạn tạo ra từ hình ảnh bạn đã tạo.

Bạn có thể tìm hiểu thêm về các khái niệm này trong hướng dẫn Docker Explained: Sử dụng Dockerfiles để tự động hóa việc xây dựng hình ảnh .

Khi bạn nhìn vào Dockerfile , bạn có thể thấy rõ quy trình từng bước mà Docker sử dụng để xây dựng hình ảnh vì mỗi dòng trong Dockerfile tương ứng với một bước trong quy trình. Điều này thường nghĩa là nếu bạn đến một bước nhất định, thì tất cả các bước trước đó đã hoàn thành .

Hãy tạo một dự án nhỏ để khám phá một số vấn đề bạn có thể gặp phải với Dockerfile . Tạo một docker_image folder trong folder chính của bạn, và sử dụng nano hoặc soạn thảo yêu thích của bạn để tạo ra một Dockerfile trong folder đó

  • mkdir ~/docker_image
  • nano ~/docker_image/Dockerfile

Thêm nội dung sau vào file mới này:

~ / docker_image / Dockerfile
# base image FROM debian:latest  # install basic apps RUN aapt-get install -qy nano 

Có một lỗi đánh máy cố ý trong mã này. Bạn có thể phát hiện ra nó không? Cố gắng tạo một hình ảnh từ file này để xem cách Docker xử lý một lệnh xấu. Tạo hình ảnh bằng lệnh sau:

  • docker build -t my_image ~/docker_image

Bạn sẽ thấy thông báo này trong terminal của bạn , cho biết có lỗi:

Output
Step 2 : RUN aapt-get install -qy nano ---> Running in 085fa10ffcc2 /bin/sh: 1: aapt-get: not found The command '/bin/sh -c aapt-get install -qy nano' returned a non-zero code: 127

Thông báo lỗi ở cuối nghĩa là đã xảy ra sự cố với lệnh trong Bước 2. Trong trường hợp này, đó là lỗi đánh máy có chủ ý của ta : ta có aapt-get thay vì apt-get . Nhưng điều đó cũng nghĩa là bước trước đó đã thực thi chính xác.

Sửa đổi Dockerfile và thực hiện chỉnh sửa:

Dockerfile
 # install basic apps RUN apt-get install -qy nano 

Bây giờ hãy chạy lại lệnh docker build :

  • docker build -t my_image ~/docker_image

Và bây giờ bạn sẽ thấy kết quả sau:

Output
Sending build context to Docker daemon 2.048 kB Step 1 : FROM debian:latest ---> ddf73f48a05d Step 2 : RUN apt-get install -qy nano ---> Running in 9679323b942f Reading package lists... Building dependency tree... E: Unable to locate package nano The command '/bin/sh -c apt-get install -qy nano' returned a non-zero code: 100

Với lỗi chính tả được sửa, quá trình diễn ra nhanh hơn một chút, vì Docker đã lưu vào bộ nhớ cache ở bước đầu tiên thay vì reload hình ảnh cơ sở. Nhưng như bạn thấy từ kết quả , ta có một lỗi mới.

Bản phân phối Debian mà ta đã sử dụng làm nền tảng cho hình ảnh của ta không thể tìm thấy nano editor , mặc dù ta biết rằng nó có sẵn trên các repository Debian. Hình ảnh cơ sở đi kèm với metadata được lưu trong bộ nhớ cache, chẳng hạn như repository và danh sách các gói có sẵn. Đôi khi, bạn có thể gặp một số vấn đề về bộ nhớ cache khi các repository trực tiếp mà bạn đang lấy dữ liệu đã thay đổi.

Để khắc phục điều này, hãy sửa đổi Dockerfile để thực hiện dọn dẹp và cập nhật các nguồn trước khi bạn cài đặt bất kỳ gói mới nào. Mở lại file cấu hình:

  • nano ~/docker_image/Dockerfile

Thêm dòng được đánh dấu sau vào file , phía trên lệnh cài đặt nano :

~ / docker_image / Dockerfile
# base image FROM debian:latest  # clean and update sources RUN apt-get clean && apt-get update  # install basic apps RUN apt-get install -qy nano 

Lưu file và chạy lại lệnh docker build :

  • docker build -t my_image ~/docker_image

Lần này quá trình hoàn tất thành công.

Output
Sending build context to Docker daemon 2.048 kB Step 1 : FROM debian:latest ---> a24c3183e910 Step 2 : RUN apt-get install -qy nano ---> Running in 2237d254f172 Reading package lists... Building dependency tree... Reading state information... Suggested packages: spell The following NEW packages will be installed: nano ... ---> 64ff1d3d71d6 Removing intermediate container 2237d254f172 Successfully built 64ff1d3d71d6

Hãy xem điều gì sẽ xảy ra khi ta thêm Python 3 và trình điều khiển PostgreSQL vào hình ảnh của ta . Mở lại Dockerfile .

  • nano ~/docker_image/Dockerfile

Và thêm hai bước mới để cài đặt Python 3 và trình điều khiển Python PostgreSQL:

~ / docker_image / Dockerfile
# base image FROM debian:latest  # clean and update sources RUN apt-get clean && apt-get update  # install basic apps RUN apt-get install -qy nano  # install Python and modules RUN apt-get install -qy python3 RUN apt-get install -qy python3-psycopg2 

Lưu file , thoát khỏi editor và tạo lại hình ảnh:

  • docker build -t my_image ~/docker_image

Như bạn thấy từ kết quả , các gói cài đặt chính xác. Quá trình này cũng hoàn thành nhanh hơn nhiều vì các bước trước đó đã được lưu vào bộ nhớ đệm.

Output
Sending build context to Docker daemon 2.048 kB Step 1 : FROM debian:latest ---> ddf73f48a05d Step 2 : RUN apt-get clean && apt-get update ---> Using cache ---> 2c5013476fbf Step 3 : RUN apt-get install -qy nano ---> Using cache ---> 4b77ac535cca Step 4 : RUN apt-get install -qy python3 ---> Running in 93f2d795fefc Reading package lists... Building dependency tree... Reading state information... The following extra packages will be installed: krb5-locales libgmp10 libgnutls-deb0-28 libgssapi-krb5-2 libhogweed2 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap-2.4-2 libnettle4 libp11-kit0 libpq5 libsasl2-2 libsasl2-modules libsasl2-modules-db libtasn1-6 Suggested packages: gnutls-bin krb5-doc krb5-user libsasl2-modules-otp libsasl2-modules-ldap libsasl2-modules-sql libsasl2-modules-gssapi-mit libsasl2-modules-gssapi-heimdal python-psycopg2-doc The following NEW packages will be installed: krb5-locales libgmp10 libgnutls-deb0-28 libgssapi-krb5-2 libhogweed2 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap-2.4-2 libnettle4 libp11-kit0 libpq5 libsasl2-2 libsasl2-modules libsasl2-modules-db libtasn1-6 python3-psycopg2 0 upgraded, 18 newly installed, 0 to remove and 0 not upgraded. Need to get 5416 kB of archives. After this operation, 10.4 MB of additional disk space will be used. ... Processing triggers for libc-bin (2.19-18+deb8u6) ... ---> 978e0fa7afa7 Removing intermediate container d7d4376c9f0d Successfully built 978e0fa7afa7

Lưu ý : Docker lưu trữ quá trình xây dựng vào bộ nhớ cache, vì vậy bạn có thể gặp phải tình huống khi bạn chạy bản cập nhật trong bản dựng, Docker lưu trữ bản cập nhật này và một thời gian sau, bản phân phối cơ sở của bạn cập nhật lại các nguồn của nó, khiến bạn có các nguồn lỗi thời, mặc dù thực hiện dọn dẹp và cập nhật trong Dockerfile của bạn. Nếu bạn gặp sự cố khi cài đặt hoặc cập nhật các gói bên trong containers , hãy chạy apt-get clean && apt-get update bên trong containers .

Hãy chú ý đến kết quả Docker để xác định vị trí lỗi chính tả và chạy các bản cập nhật tại thời điểm xây dựng và bên trong containers đảm bảo bạn không bị danh sách gói được lưu trong bộ nhớ cache cản trở.

Lỗi cú pháp và sự cố bộ nhớ đệm là những vấn đề phổ biến nhất mà bạn có thể gặp phải khi xây dựng hình ảnh trong Docker. Bây giờ ta hãy xem xét các vấn đề có thể phát sinh khi chạy các containers từ những hình ảnh đó.

Bước 2 - Giải quyết vấn đề đặt tên containers

Khi bạn chạy nhiều containers hơn, cuối cùng bạn sẽ gặp phải các va chạm tên. Xung đột đặt tên là nơi bạn cố gắng tạo một containers có cùng tên với một containers đã tồn tại trên hệ thống. Hãy cùng khám phá cách xử lý đúng cách với việc đặt tên, đổi tên và xóa containers để tránh va chạm.

Hãy chạy một containers từ hình ảnh mà ta đã xây dựng trên phần trước. Ta sẽ chạy một trình thông dịch bash tương tác bên trong containers này để kiểm tra mọi thứ. Thực hiện lệnh sau:

  • docker run -ti my_image bash

Khi containers bắt đầu, bạn sẽ thấy dấu nhắc root đang chờ hướng dẫn:

Đến đây bạn có một containers đang chạy, hãy xem bạn có thể gặp phải những loại sự cố nào.

Khi bạn chạy một containers theo cách bạn vừa làm, mà không đặt tên rõ ràng, Docker sẽ chỉ định một tên ngẫu nhiên cho containers . Bạn có thể xem tất cả các containers đang chạy và tên tương ứng của chúng bằng cách chạy lệnh docker ps trên server Docker, bên ngoài containers đang chạy.

Mở một terminal mới trên server Docker và chạy lệnh sau:

  • docker ps

Lệnh này xuất ra danh sách các containers đang chạy với tên của chúng như trong ví dụ sau:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80a0ca58d6ec my_image "bash" 22 seconds ago Up 28 seconds loving_brahmagupta

Tên loving_brahmagupta trong kết quả trước là tên mà Docker tự động gán cho containers trong ví dụ trước; của bạn sẽ có một tên khác. Để Docker chỉ định tên cho containers của bạn là tốt trong những trường hợp rất đơn giản, nhưng có thể gây ra các vấn đề nghiêm trọng; khi ta triển khai, ta cần đặt tên các containers một cách nhất quán để ta có thể tham chiếu chúng và tự động hóa chúng một cách dễ dàng.

Để chỉ định tên cho containers , ta có thể sử dụng đối số --name khi chạy containers hoặc ta có thể đổi tên containers đang chạy thành một thứ gì đó mô tả hơn.

Chạy lệnh sau từ terminal của server Docker:

  • docker rename your_container_name python_box

Sau đó liệt kê các containers của bạn:

  • docker ps

Bạn sẽ thấy containers python_box trong kết quả , xác nhận bạn đã đổi tên thành công containers :

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80a0ca58d6ec my_image "bash" 24 minutes ago Up 24 minutes python_box

Để đóng containers , hãy nhập exit tại dấu nhắc trong terminal chứa containers đang chạy:

  • exit

Nếu đó không phải là một tùy chọn, bạn có thể hủy containers từ một terminal khác trên server Docker bằng lệnh sau:

  • docker kill python_box

Khi bạn giết containers theo cách này, Docker trả về tên của containers vừa bị dừng :

Output
python_box

Để đảm bảo python_box không còn tồn tại nữa, hãy liệt kê lại tất cả các containers đang chạy:

  • docker ps

Như mong đợi, containers không còn được liệt kê:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Đến đây bạn có thể nghĩ rằng bạn có thể chạy một containers khác có tên python_box , nhưng hãy xem điều gì sẽ xảy ra khi ta thử.

Ta sẽ sử dụng đối số --name lần này để đặt tên của containers :

  • docker run --name python_box -ti my_image bash
Output
docker: Error response from daemon: Conflict. The name "/python_box" is already in use by container 80a0ca58d6ecc80b305463aff2a68c4cbe36f7bda15e680651830fc5f9dda772. You have to remove (or rename) that container to be able to reuse that name.. See 'docker run --help'.

Khi bạn xây dựng một hình ảnh và sử dụng lại tên của hình ảnh hiện có, hình ảnh hiện có sẽ bị overrides , như bạn đã thấy. Vùng chứa phức tạp hơn một chút vì bạn không thể overrides containers đã tồn tại.

Docker nói rằng python_box đã tồn tại ngay cả khi ta vừa giết nó và nó thậm chí không được liệt kê với docker ps . Nó không chạy, nhưng nó vẫn có sẵn trong trường hợp bạn muốn khởi động lại. Ta đã ngăn chặn nó, nhưng ta không xóa nó. Lệnh docker ps chỉ hiển thị các containers đang chạy , không hiển thị tất cả các vùng chứa.

Để liệt kê tất cả các containers Docker, đang chạy và nếu không, hãy chuyển cờ -a (bí danh cho --all ) vào docker ps :

  • docker ps -a

Bây giờ python_box chứa python_box của ta xuất hiện trong kết quả :

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80a0ca58d6ec my_image "bash" 12 minutes ago Exited (137) 6 minutes ago python_box

Vùng chứa tồn tại với trạng thái Exited (137) , đó là lý do tại sao ta gặp phải vấn đề đặt tên khi cố gắng tạo một containers mới có cùng tên.

Khi bạn muốn loại bỏ hoàn toàn một containers , bạn sử dụng lệnh docker rm . Thực hiện lệnh này trong terminal của bạn:

  • docker rm python_box

, Docker xuất ra tên của containers vừa bị xóa:

Output
python_box

Cảnh báo : Lệnh này sẽ không thành công và xuất ra thông báo lỗi nếu containers vẫn đang chạy, vì vậy hãy đảm bảo bạn dừng hoặc tắt nó trước.

Hãy tạo một containers mới có tên python_box ngay bây giờ mà ta đã xóa containers trước đó:

  • docker run --name python_box -ti my_image bash

Quá trình hoàn tất và ta được giới thiệu với một root shell:

Bây giờ ta hãy giết và loại bỏ containers để tránh các sự cố trong tương lai. Từ một phiên Terminal khác trên server Docker, hãy hủy containers và xóa nó bằng lệnh sau:

  • docker kill python_box && docker rm python_box

Ta đã xâu chuỗi hai lệnh với nhau, vì vậy kết quả hiển thị tên containers hai lần. Đầu ra đầu tiên xác minh ta đã hủy containers và kết quả kia xác nhận ta đã xóa nó.

Output
python_box python_box

Hãy ghi nhớ docker ps -a khi gặp sự cố với tên và đảm bảo các containers của bạn được dừng và xóa trước khi bạn cố gắng tạo lại chúng với cùng tên.

Đặt tên containers giúp bạn quản lý cơ sở hạ tầng của bạn dễ dàng hơn. Tên cũng giúp dễ dàng giao tiếp giữa các containers , như bạn sẽ thấy ở phần tiếp theo.

Bước 3 - Giải quyết các vấn đề giao tiếp containers

Docker giúp bạn dễ dàng khởi tạo một số containers để bạn có thể chạy các dịch vụ khác nhau hoặc thậm chí là dư thừa trong mỗi containers . Nếu một dịch vụ bị lỗi hoặc bị xâm phạm, bạn chỉ có thể thay thế nó bằng một dịch vụ mới trong khi vẫn giữ nguyên phần còn lại của cơ sở hạ tầng. Nhưng bạn có thể gặp sự cố khi làm cho các containers đó giao tiếp với nhau.

Hãy tạo hai containers giao tiếp để ta có thể khám phá các vấn đề giao tiếp tiềm ẩn. Ta sẽ tạo một containers chạy Python bằng cách sử dụng hình ảnh hiện có của ta và một containers khác chạy một version của PostgreSQL. Ta sẽ sử dụng hình ảnh PostgreSQL chính thức có sẵn từ Docker Hub cho containers đó.

Trước tiên, hãy tạo containers PostgreSQL. Ta sẽ đặt tên cho containers này bằng cách sử dụng cờ --name để ta có thể dễ dàng xác định nó khi liên kết nó với các containers khác. Ta sẽ gọi nó là postgres_box .

Trước đây, khi ta phóng một container, nó chạy ở phía trước, chiếm lấy nhà ga của ta . Ta muốn khởi động containers database PostgreSQL ở chế độ nền, điều này ta có thể thực hiện với cờ --detach .

Cuối cùng, thay vì chạy bash , ta sẽ chạy lệnh postgres lệnh này sẽ khởi động server database PostgreSQL bên trong containers .

Thực thi lệnh sau để chạy containers :

  • docker run --name postgres_box --detach postgres

Docker sẽ download hình ảnh từ Docker Hub và tạo containers . Sau đó, nó sẽ trả về ID đầy đủ của containers đang chạy trong nền:

Output
Unable to find image 'postgres:latest' locally latest: Pulling from library/postgres 6a5a5368e0c2: Already exists 193f770cec44: Pull complete ... 484ac0d6f901: Pull complete Digest: sha256:924650288891ce2e603c4bbe8491e7fa28d43a3fc792e302222a938ff4e6a349 Status: Downloaded newer image for postgres:latest f6609b9e96cc874be0852e400381db76a19ebfa4bd94fe326477b70b8f0aff65

Liệt kê các containers đảm bảo rằng containers mới này đang chạy:

  • docker ps

Đầu ra xác nhận containers postgres_box đang chạy ở chế độ nền, để lộ cổng 5432 , cổng database PostgreSQL:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7a230b56cd64 postgres_box "/docker-entrypoint.s" Less than a second ago Up 2 seconds 5432/tcp postgres

Bây giờ hãy chạy containers Python. Để các chương trình đang chạy bên trong containers Python có thể “nhìn thấy” các dịch vụ trong containers postgres_box , ta cần liên kết containers Python của bạn với containers postgres_box theo cách thủ công bằng cách sử dụng đối số --link . Để tạo liên kết, ta chỉ định tên của containers , sau đó là tên của liên kết. Ta sẽ sử dụng tên liên kết để tham chiếu đến containers postgres_box từ bên trong containers Python.

Chạy lệnh sau để khởi động containers Python:

  • docker run --name python_box --link postgres_box:postgres -ti my_image bash

Bây giờ hãy thử kết nối với PostgreSQL từ bên trong containers python_box .

Trước đây ta đã cài đặt nano bên trong containers python_box vì vậy hãy sử dụng nó để tạo một tập lệnh Python đơn giản để kiểm tra kết nối với PostgreSQL. Trong terminal cho containers python_box , hãy thực hiện lệnh này:

  • nano pg_test.py

Sau đó, thêm tập lệnh Python sau vào file :

pg_test.py
"""Test PostgreSQL connection.""" import psycopg2  conn = psycopg2.connect(user='postgres') print(conn) 

Lưu file và thoát khỏi editor . Hãy xem điều gì sẽ xảy ra khi ta cố gắng kết nối với database từ tập lệnh của bạn . Thực thi tập lệnh trong containers của bạn:

  • python3 pg_test.py

Kết quả kết quả ta thấy cho biết có sự cố khi kết nối với database :

Output
Traceback (most recent call last): File "pg_test.py", line 5, in <module> conn = psycopg2.connect(database="test", user="postgres", password="secret") File "/usr/lib/python3/dist-packages/psycopg2/__init__.py", line 164, in connect conn = _connect(dsn, connection_factory=connection_factory, async=async) psycopg2.OperationalError: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Ta đã đảm bảo containers postgres_box đang chạy và ta đã liên kết nó với containers python_box , vậy thì điều gì đã xảy ra? Chà, ta chưa bao giờ chỉ định server database khi ta cố gắng kết nối, vì vậy Python cố gắng kết nối với database đang chạy local và điều đó sẽ không hoạt động vì dịch vụ không chạy local , nó đang chạy trong một containers khác giống như thể nó trên một máy tính khác.

Bạn có thể truy cập containers được liên kết bằng tên bạn đã cài đặt khi tạo liên kết. Trong trường hợp của ta , ta sử dụng postgres để tham chiếu đến containers postgres_box đang chạy server database của ta . Bạn có thể xác minh điều này bằng cách xem file /etc/hosts trong containers python_box :

  • cat /etc/hosts

Bạn sẽ thấy tất cả các server có sẵn với tên và địa chỉ IP của chúng. Server postgres của ta có thể nhìn thấy rõ ràng.

Output
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 postgres f6609b9e96cc postgres_box 172.17.0.3 3053f74c8c13

Vì vậy, hãy sửa đổi tập lệnh Python của ta và thêm tên server . Mở tập tin.

  • nano pg_test.py

Sau đó chỉ định server lưu trữ trong chuỗi kết nối:

/pg_test.py
"""Test PostgreSQL connection.""" import psycopg2  conn = psycopg2.connect(host='postgres', user='postgres') print(conn) 

Lưu file và sau đó chạy lại tập lệnh.

  • python3 pg_test.py

Lần này tập lệnh hoàn thành mà không có bất kỳ lỗi nào:

Output
<connection object at 0x7f64caec69d8; dsn: 'user=postgres host=7a230b56cd64', closed: 0>

Hãy ghi nhớ tên containers khi bạn đang cố gắng kết nối với các dịch vụ trong các containers khác và chỉnh sửa thông tin đăng nhập ứng dụng của bạn để tham chiếu tên được liên kết của các containers đó.

Kết luận

Ta vừa đề cập đến những vấn đề phổ biến nhất mà bạn có thể gặp phải khi làm việc với containers Docker, từ việc xây dựng hình ảnh đến triển khai mạng containers .

Docker có cờ --debug chủ yếu dành cho các nhà phát triển Docker. Tuy nhiên, nếu muốn biết thêm về Docker internals, hãy thử chạy các lệnh Docker trong chế độ gỡ lỗi để có kết quả chi tiết hơn:

  • docker -D [command] [arguments]

Trong khi các containers trong phần mềm đã tồn tại một thời gian, bản thân Docker chỉ tồn tại trong ba năm và có thể khá phức tạp. Hãy dành thời gian của bạn để làm quen với các thuật ngữ và hệ sinh thái , và bạn sẽ thấy một số khái niệm ban đầu hơi xa lạ sẽ sớm có ý nghĩa như thế nào.


Tags:

Các tin liên quan

Cách cài đặt Prometheus bằng Docker trên CentOS 7
2016-01-15
Cách cài đặt Prometheus bằng Docker trên Ubuntu 14.04
2016-01-12
Cách cài đặt Wordpress và PhpMyAdmin với Docker Compose trên Ubuntu 14.04
2015-11-19
Cách cài đặt và sử dụng Docker Compose trên Ubuntu 14.04
2015-11-19
Cách dọn dẹp môi trường Docker của bạn bằng CloudSlang trên CoreOS Cluster
2015-06-10
Cách quản lý triển khai nhiều node của bạn với Máy Rancher và Docker trên Ubuntu 14.04
2015-04-27
Cách tập trung log Docker của bạn với Fluentd và ElasticSearch trên Ubuntu 14.04
2015-03-30
Hệ sinh thái Docker: Giới thiệu về các thành phần chung
2015-02-01
Hệ sinh thái Docker: Tổng quan về Containerization
2015-02-01
Hệ sinh thái Docker: Lập lịch và Điều phối
2015-02-01