Trong bài viết này chúng ta sẽ cũng nhau tìm hiểu làm thế nào để kết nối các container. Bằng cách kết nối các container, bạn đã cung cấp một kênh bảo mật thông qua cách các container có thể giao tiếp qua lại với nhau.
Giả sử chúng ta có một ứng dụng web, bạn có thể có một web server hoặc database server. Khi chúng ta muốn kết nối các container, đây là những gì mà chúng ta sẽ hình dung như sau:
- Chúng ta sẽ tạo một Docker container chạy database server
- Chúng ta sẽ tạo một Docker container thứ 2 cho web server với một link flag đến container 1 ở trên. Bằng cách này, nó sẽ có thể kết nối với database server thông qua tên của đường dẫn.
Đây là cách tương đối phổ biến và linh động để kết nối các container lại với nhau thay vì phải thông qua port mạng. Tôi khuyên bạn nên sử dụng Docker compose nhưng trong bài viết này sẽ sử dụng link flag.
Để bắt đầu, chúng ta sẽ sử dụng Server với cấu trúc dữ liệu NoSQL Redis. Giống như các phần mềm khác, Redis cũng có Docker Image chính thức có sẵn trong Docker Hub.
Trước tiên hãy sử dụng Redis image thông qua câu lệnh như sau:
docker pull redis
Tiếp theo, chúng ta sẽ khởi chạy một Redis container (tên là redis1) trong một chế độ riêng như sau:
$ docker run -d --name redis1 redis 37f174130f758083d243541e8adab7e2d8be2012e555cbdbd5fc67ca9d26526d
Chúng ta có thể kiểm tra container redis1 đã được chạy thông qua câu lệnh sau:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37f174130f75 redis "/entrypoint.sh redi 30 seconds ago Up 29 seconds 6379/tcp redis1
Để ý rằng nó đã được chạy trên Port 6379
Tiếp theo chúng ta sẽ chạy một container khác, busybox container như sau:
$ docker run -it --link redis1:redis --name redisclient1 busybox
Để ý rằng link flag. Giá trị được thiết lập cho link flag là sourcecontainername:containeraliasname. Chúng ta đã thiết lập redis1 là sourcecontainername vì nó là tên chúng ta trao cho container đầu tiên được khởi chạy trước đấy. containeraliasname được thiết lập là redis và bạn có thể thay thế bằng bất cứ tên gì mà bạn muốn.
Container được khởi chạy ở trên(redisclient1) sẽ dẫn bạn đến shell prompt trong container
Bây giờ, tất cả những gì chúng ta muốn khởi chạy đã được hoàn thành. Hãy quan sát rằng bản ghi đã được thêm vào file /etc/hosts của container redisclient1
/ # cat /etc/hosts 172.17.0.21/ # cat /etc/hosts 172.17.0.23 26c37c8982e9 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.21 redis 37f174130f75 redis1 / # redis 37f174130f75 redis1 / #
Chúng ta sẽ thêm đoạn trên vào cuối file, nơi container redis1 đã được liên kết với tên redis như ở trên.
Nào bây giờ bạn có thể thử ping bằng tên máy chủ redis – nó sẽ hoạt động:
/ # ping redis PING redis (172.17.0.21): 56 data bytes 64 bytes from 172.17.0.21: seq=0 ttl=64 time=0.218 ms 64 bytes from 172.17.0.21: seq=1 ttl=64 time=0.135 ms 64 bytes from 172.17.0.21: seq=2 ttl=64 time=0.140 ms 64 bytes from 172.17.0.21: seq=3 ttl=64 time=0.080 ms
Nếu bạn in ra biến môi trường, bạn sẽ nhìn thấy kết quả như sau:
/ # set .... REDIS_ENV_REDIS_DOWNLOAD_SHA1='0e2d7707327986ae652df717059354b358b83358' REDIS_ENV_REDIS_DOWNLOAD_URL='http://download.redis.io/releases/redis-3.0.3.tar.gz' REDIS_ENV_REDIS_VERSION='3.0.3' REDIS_NAME='/redisclient1/redis' REDIS_PORT='tcp://172.17.0.21:6379' REDIS_PORT_6379_TCP='tcp://172.17.0.21:6379' REDIS_PORT_6379_TCP_ADDR='172.17.0.21' REDIS_PORT_6379_TCP_PORT='6379' REDIS_PORT_6379_TCP_PROTO='tcp' ....
Bạn có thể thấy rằng thay đổi biến môi trường được tạo tự động để hỗ trợ kết nối đến redis1 server từ redisclient1.
Nào hãy thoát ra khỏi container và quay trở lại với terminal
Chúng ta hãy khởi chạy một container dựa trên redis image nhưng lúc này thay vì dùng câu lệnh mặc định để khởi chạy redis server, chúng ta chỉ đơn giản là đi vào trong shell nơi tất cả công cụ redis client đã sẵn sàng cho chúng ta. Để ý rằng server redis1 mà chúng ta khởi chaỵ vẫn đang chạy.
$ docker run -it --link redis1:redis --name client1 redis sh
Sau câu lệnh này nó sẽ dẫn chúng ta đến một prompt. Thử ping redis và nó nên hoạt động tốt
# ping redis PING redis (172.17.0.21): 48 data bytes 56 bytes from 172.17.0.21: icmp_seq=0 ttl=64 time=0.269 ms 56 bytes from 172.17.0.21: icmp_seq=1 ttl=64 time=0.248 ms 56 bytes from 172.17.0.21: icmp_seq=2 ttl=64 time=0.205 ms
Tiếp theo hãy khởi chạy redis client (redis-cli) và kết nối đến redis server (đang chạy trên container khác mà chúng ta đang kết nối đến) như sau:
# redis-cli -h redis redis:6379>
Bạn có thể thấy rằng chúng ta đã có thể kết nối thành công đến redis server thông qua tên alias mà chúng ta đã chỉ định trong link flag khi khởi chạy container. Tất nhiên nếu bạn đang chạy redis server trên port khác (không phải port tiêu chuẩn 6379) chúng ta có thể cung cấp thêm tham số -p cho câu lệnh redis-cli và sử dụng giá trị của biến môi trường ở đây (REDIS_PORT_6379_TCP_PORT).
Nào hãy thử chạy một cài câu lệnh cơ bản của redis:
redis:6379> PING PONG redis:6379> set myvar DOCKER OK redis:6379> get myvar "DOCKER" redis:6379>
Tất cả đều hoạt động tốt. Nào hãy thoát ra khỏi container và khởi chạy client khác (client2) mà chúng ta mong muốn cùng kết nối đến redis server đang được chạy trên container đầu tiên mà chúng ta đã khởi chạy và chúng ta đã thêm cặp giá trị key / value:
$ docker run -it --link redis1:redis --name client2 redis sh
Và một lần nữa, chúng ta sẽ chạy một vài câu lệnh để kiểm tra điều này.
# redis-cli -h redis redis:6379> get myvar "DOCKER" redis:6379>
Bạn đã kết nối thành công được tất cả các container với nhau.