Cơ bản về Docker Network
TheoBizfly Cloud chia sẻ gần đây có bắt đầu tập tành đốc cờ, cá nhân thì tôi cũng có nắm qua qua về docker network hoạt động thế nào, thế nhưng khi phải giải thích cho người khác thì vẫn thấy khá lúng túng nên tạm tổng hợp lại đây. Cụ thể thì mọi người có thể tìm hiểu thêm tại Advanced Networking tại địa chỉ: https://docs.docker.com/v1.5/articles/networking/
Cấu trúc của Virtual Bridge
Network của docker được quản lý thông qua một virtual bridge gọi là docker0
. Bạn nào chưa hiểu thế nào là virtual bridge
thì mình có tìm thấy một bài viết khá dễ hiểu ở đây. Mục đích của việc này là để tạo ra một network độc lập, tách biệt với môi trường khác.
Khi chúng ta khởi động docker deamon (thông qua sudo service docker start
chẳng hạn) thì những step dưới đây sẽ diễn ra:
Assign khoảng ip đó cho docker0
Sau đó khi chúng ta khởi động một container bất kì, thì container đó sẽ được assign những thứ dưới đây:
Một IP bất kì trong range mà docker0
vừa thu được ở trên
Hãy bắt tay vào thử nghiệm nào, đầu tiên khi chưa có container nào khởi động
• Virtual bridge docker0 sẽ được tạo ra
• Docker tự dộng tìm ra một khoảng ip range còn trống từ trong route của máy host
• Chọn ra random một khoảng ip bất kì
• Assign khoảng ip đó cho docker0
Sau đó khi chúng ta khởi động một container bất kì, thì container đó sẽ được assign những thứ dưới đây:
• veth (Virtual Eithernet) interface gắn với docker0
• Một ip bất kì trong range mà docker0 vừa thu được ở trên
Hãy bắt tay vào thử nghiệm nào, đầu tiên khi chưa có container nào khởi động.
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.000000000000 no
(Lưu ý là brctl command sử dụng sau khi bạn cài gói bridge-utils, có thể thông qua yum hoặc apt-get)
Đầu tiên chúng ta thử khởi động 2 container bất kì.
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
b9ffb0800ca5
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
4c0d9b786e8f
Sau đó kiểm tra lại bridge xem sao.
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.7ab1e2001566 no veth29c1, veth9eb7
Từ kết quả trên chúng ta thấy mỗi container được cung cấp một interface tương ứng, là veth29c1 và veth9eb7.
Sau đó xem thử IP xem sao:
$ ifconfig docker0
docker0 Link encap:Ethernet HWaddr 7a:b1:e2:00:15:66
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' b9ffb0800ca5
172.17.0.2
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 4c0d9b786e8f
172.17.0.3
Từ kết quả trên chúng ta thấy docker0 được assign cho khoảng IP 172.17.42.1/16, và từ trong đó trích ra 172.17.0.2 và 172.17.0.3 để chia cho 2 container.
Networking giữa các container với nhau
Để kiểm soát việc các container có nói chuyện được với nhau hay không, chúng ta thông qua parameter -icc của docker daemon.
• Khi -icc = true thì container có thể nói chuyện được với nhau.
• Khi -icc = false thì các container sẽ bị tách biệt với nhau
Ngoài ra để public một port nào đó ra ngoài chúng ta cũng phải chỉ định EXPOSE
Cụ thể hơn, để các container nói chuyện được với nhau, docker0 sử dụng một tính năng gọi là --link. Khi khởi động một container nào đó chúng ta phải chỉ định --link containerName:containerAlias , nhờ đó mà service trong container đó sẽ tìm thấy service muốn kết nối đến thông qua biến môi trường.
Kết nối từ network ở ngoài vào container
Để kết nối từ network ở ngoài vào container thì chúng ta phải mapping port của máy host với port mà container expose thông qua docker0.
Ví dụ chúng ta muốn map port 8080 của máy host vào port 80 của docker , sử dụng apache container:
$ ID=$(docker run -d -p 8080:80 tcnksm/apache)
caad0cfc2a0
Chúng ta có thể kiểm tra mapping như sau
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
caad0cfc2a03 tcnksm/apache:latest /usr/sbin/apache2 -D About a minute ago Up About a minute 0.0.0.0:8080->80/tcp elegant_thompson
$ docker port $ID 80
0.0.0.0:8080
Sau đó thử curl từ máy host:
$ curl http://localhost:8080
Hello, docker
$ ID=$(docker run -d -p 80 tcnksm/apache)
$ docker port $ID 80
0.0.0.0:49156
$ curl `docker port $ID 80`
Hello, docker
>> Tham khảo thêm: Windows Container, Docker trên Windows Server
Theo Bizfly Cloud chia sẻ