Docker - Liên kết Container

Giới thiệu về Liên kết Container

Xin chào các bạn yêu thích Docker! Hôm nay, chúng ta sẽ cùng lặn sâu vào thế giới thú vị của liên kết container. Là người thầy máy tính gần gũi của bạn, tôi sẽ hướng dẫn bạn trong hành trình này, ngay cả khi bạn chưa từng viết một dòng mã trước đây. Hãy thắt dây an toàn và cùng chúng tôi ra khơi trên biển container!

Docker - Container Linking

Liên kết container giống như giới thiệu hai người bạn tại một buổi tiệc. Nó cho phép các container giao tiếp với nhau, chia sẻ thông tin và tài nguyên. Hãy tưởng tượng bạn đang tham gia một bữa tiệc potluck (đó là máy chủ Docker của chúng ta), và mỗi món ăn (container) cần biết những món ăn khác có sẵn. Đó chính là điều chúng ta đang làm với liên kết container!

Tại sao Liên kết Container Quan trọng

Bạn có thể tự hỏi, "Tại sao tôi lại quan tâm đến liên kết container?" Hãy để tôi kể cho bạn một câu chuyện ngắn. Ngày xửa ngày xưa, trong một trung tâm dữ liệu xa xôi, các ứng dụng sống trong sự cô lập. Chúng không thể giao tiếp với nhau, chia sẻ dữ liệu hoặc làm việc cùng nhau. Đó là một cuộc sống cô đơn. Nhưng sau đó, liên kết container xuất hiện và thay đổi mọi thứ!

Liên kết container cho phép chúng ta:

  1. Tạo ra các ứng dụng đa container phức tạp
  2. Chia sẻ dữ liệu giữa các container
  3. Cải thiện an ninh bằng cách cách ly các dịch vụ
  4. Đơn giản hóa việc mở rộng ứng dụng

Liên kết Container Cơ bản

Hãy bắt đầu với một ví dụ đơn giản. Chúng ta sẽ tạo hai container: một máy chủ web và một cơ sở dữ liệu, và liên kết chúng với nhau.

Bước 1: Tạo Container Cơ sở Dữ liệu

Trước tiên, chúng ta sẽ tạo container cơ sở dữ liệu. Chúng ta sẽ sử dụng MySQL cho ví dụ này.

docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=secret mysql:latest

Giải thích:

  • -d: Chạy container ở chế độ tách biệt (trong nền)
  • --name mydb: Đặt tên cho container
  • -e MYSQL_ROOT_PASSWORD=secret: Đặt một biến môi trường cho mật khẩu root
  • mysql:latest: Sử dụng hình ảnh MySQL mới nhất

Bước 2: Tạo Container Máy chủ Web

Bây giờ, hãy tạo container máy chủ web và liên kết nó với cơ sở dữ liệu.

docker run -d --name myweb --link mydb:db -p 80:80 nginx:latest

Đây là những gì đang xảy ra:

  • --link mydb:db: Đây là phép thuật! Chúng ta đang liên kết container mydb và gọi nó là db bên trong container web
  • -p 80:80: Map port 80 trên máy chủ vào port 80 trong container

Hiểu về Liên kết

Khi chúng ta sử dụng tùy chọn --link, Docker thực hiện một số điều cho chúng ta:

  1. Thêm một mục vào file /etc/hosts của container web
  2. Đặt các biến môi trường trong container web
  3. Cho phép container web kết nối với container cơ sở dữ liệu

Hãy nhìn vào bên trong container web để xem đang xảy ra gì:

docker exec -it myweb bash

Một khi vào bên trong, chúng ta có thể kiểm tra file /etc/hosts:

cat /etc/hosts

Bạn nên thấy một mục cho container db với địa chỉ IP của nó.

Biến Môi trường

Docker cũng thiết lập các biến môi trường cho chúng ta. Hãy liệt kê chúng:

env | grep DB_

Bạn sẽ thấy các biến như DB_PORT, DB_NAME, v.v. Những biến này giúp ứng dụng của chúng ta dễ dàng kết nối với cơ sở dữ liệu.

Liên kết Cũ và Mạng Định Nghĩa Bởi Người Dùng

Bây giờ, tôi có một sự thật phải thừa nhận. Tùy chọn --link mà chúng ta vừa sử dụng thực sự được coi là cũ trong Docker. Nó giống như sử dụng điện thoại nắp trượt trong thời đại của smartphone - nó hoạt động, nhưng có những tùy chọn tốt hơn sẵn có.

Phương pháp hiện đại để liên kết container là sử dụng mạng định nghĩa bởi người dùng. Hãy xem cách nó hoạt động:

Bước 1: Tạo Mạng

docker network create mynetwork

Bước 2: Chạy Container Trên Mạng

docker run -d --name mydb --network mynetwork -e MYSQL_ROOT_PASSWORD=secret mysql:latest
docker run -d --name myweb --network mynetwork -p 80:80 nginx:latest

Bây giờ, các container của chúng ta có thể giao tiếp bằng cách sử dụng tên của chúng như tên máy chủ, mà không cần liên kết rõ ràng!

Lợi ích của Mạng Định Nghĩa Bởi Người Dùng

Mạng định nghĩa bởi người dùng mang lại nhiều lợi ích:

  1. Tốt hơn về cách ly
  2. Tự động phân giải DNS
  3. Khả năng kết nối/disconnect container từ mạng một cách linh hoạt

Ví dụ Thực tế: WordPress và MySQL

Hãy áp dụng kiến thức của chúng ta vào một ví dụ thực tế: thiết lập WordPress với MySQL.

Bước 1: Tạo Mạng

docker network create wordpress-network

Bước 2: Chạy Container MySQL

docker run -d --name wordpress-db --network wordpress-network -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpresspassword mysql:5.7

Bước 3: Chạy Container WordPress

docker run -d --name wordpress-site --network wordpress-network -e WORDPRESS_DB_HOST=wordpress-db -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpresspassword -e WORDPRESS_DB_NAME=wordpress -p 8080:80 wordpress:latest

Bây giờ, nếu bạn truy cập http://localhost:8080 trong trình duyệt của bạn, bạn nên thấy trang thiết lập WordPress!

Kết luận

Chúc mừng! Bạn đã chính thức bước vào thế giới của liên kết container. Chúng ta đã bao quát rất nhiều nội dung, từ liên kết cơ bản đến mạng định nghĩa bởi người dùng, và thậm chí thiết lập một trang web WordPress sử dụng container.

Nhớ rằng, liên kết container là về việc cho phép các ứng dụng của chúng ta làm việc cùng nhau một cách hài hòa. Nó giống như chỉ huy một dàn nhạc - mỗi container là một nhạc cụ, và khi được liên kết đúng cách, chúng tạo ra âm nhạc tuyệt đẹp.

Khi bạn tiếp tục hành trình Docker của mình, hãy tiếp tục thử nghiệm với các container và các tùy chọn mạng khác nhau. Càng thực hành nhiều, bạn sẽ càng thoải mái hơn với các khái niệm này.

Chúc bạn thành công trong việc container hóa, và hy vọng rằng hình ảnh Docker của bạn luôn xây dựng thành công!

Credits: Image by storyset