Kết nối các Container

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.

You May Also Like

About the Author: Nguyen Dinh Thuc

Leave a Reply

Your email address will not be published.