Hiểu thêm về docker trên MacOS X và thử Docker Container

Trong bài Làm quen với Docker, mình có lướt qua việc cài docker toolbox trên MacOS X.
Hôm nay muốn ngồi tìm hiểu thêm về nó.

Key concepts

Trong trường hợp cài docker trên Linux, máy tính của bạn cũng chính là localhost và docker host luôn nên docker client và docker daemon và các containers sẽ chạy trực tiếp trên máy tính của bạn. Tức là, bạn có thể chỉnh định địa chỉ của docker container sử dụng luôn địa chỉ localhost:8000 hoặc 0.0.0.0:8376.

Trên OS X thì khác, docker daemon sẽ chạy trong một máy ảo Linux có tên là default.
Địa chỉ của Docker host là địa chỉ của máy ảo Linux, khi bạn khởi động máy ảo với docker-machine máy ảo sẽ được assign ip. Và khi bạn tạo 1 container, port của container sẽ được map với port của máy ảo.

Trên MAC OS X sau khi cài docker toolbox, mở Docker QuickStart Terminal từ Launchpad, ứng dụng sẽ mở một terminal widow mới và tạo máy ảo default trong trường hợp máy ảo đó chưa tồn tại và khởi động nó, sau đó trỏ môi trường của terminal vào máy ảo này.
và tất nhiên là bạn có thể dùng lệnh docker từ lúc này.

Bạn có thể tạo máy ảo mới bằng lệnh

$ docker-machine create

tuy nhiên mình nghĩ chỉ cần 1 máy ảo là đủ. Để kiểm tra xem đã có máy ảo trong máy bạn hay chưa, thử câu lệnh

$ docker-machine ls

sẽ liệt kê toàn bộ các máy ảo ảo trên máy bạn.
Bạn cũng có thể kiểu tra các eviroment command trong máy ảo docker bằng lệnh

$ docker-machine env {VMNAME}

với {VMNAME} là tên máy ảo của bạn. Thông thường là default

Access container ports

Thử chạy 1 NGINX container

docker run -d -P --name web nginx  

Ở đây docker run khởi tạo một container, chạy nó và sau đó thì exit.

  • Option -d : giữ container tiếp tục chạy ở chế độ background sau khi câu lệnh docker run kết thúc.
  • Option -P: publish các port từ container forward nó sang random port bên localhost
  • Option --name: đặt tên cho container.

Bạn có thể kiểu tra lại container của bạn đang được chạy bằng lệnh docker ps, và sẽ thấy rằng nginx đang được chạy.

Thử truy cập xem nginx đã nhận request từ bên ngoài chưa ?
Đầu tiên ta phải xem xem các port của container đang được forward sang localhost như thế nào bằng lệnh:

$ docker port web
443/tcp -> 0.0.0.0:32768  
80/tcp -> 0.0.0.0:32769  

Ồ, trên máy mình cổng 80 của container đang được forward sang cổng 32769. (máy của bạn có thể khác).

Mở trình duyệt và browser tới địa chỉ http://localhost:32769 xem đã có thể browser được web hay chưa.

Oops ! Bạn có thể sẽ nhận được thông báo:

This webpage is not available

Tại sao vậy ?

Lý do như trong phần Key concepts ở trên, vì địa chỉ của docker host không phải là địa chỉ localhost, vì trên MAC OS X bạn đang phải chạy thông máy ảo linux.

Bạn sẽ phải xem địa chỉ máy ỏ của mình là gì qua lệnh

$ docker-machine ip default 
192.168.99.100  

với default là tên máy ảo đang chạy docker của bạn.

Thử dùng trình duyệt và truy cập tới địa chỉ ip ở trên, của mình trong trường hợp này là http://192.168.99.100:32769

bạn sẽ thấy trang chủ default của nginx hiện ra.

Container của bạn đang chạy ở chế độ background, nên để stop container, bạn dùng lệnh

$ docker stop web

Dùng thử lệnh docker ps để kiểm tra các container đang chạy, bạn sẽ thấy container web không còn trong danh sách.

Tuy nhiên nếu dùng lệnh docker ps -a, để xem tất cả danh sách các container, bạn sẽ thấy vẫn còn web container.

Để remove container:

$ docker rm web

Thử lại với lệnh docker ps -a, bạn sẽ thấy container web không còn

Mount Volume vào một Container

Khi bạn bắt đầu một container, docker sẽ tự động share folder user home với máy ảo. Bạn có thể dùng share point này để mount các thư mục vào container.

Chúng ta sẽ thử mount 1 folder chứa site và sau đó mount vào thay thể folder html mặc định của nginx

Bước 1: Tạo folder site chứa website của bạn

Về folder $HOME của bạn và tạo 1 folder site mới

# di chuyển về home 
$ cd $HOME
# tạo 1 folder mới trong thư mục Home của bạn 
$ mkdir site
# di chuyển tới folder vừa tạo 
$ cd site 

Thử tạo 1 file index.html trong folder site:

$ echo "my new site"  > index.html

Bước 2: Chạy nginx container

$ docker run -d -P -v $HOME/site:/usr/share/nginx/html \--name mysite nginx

Option -v cho phép bạn mount volume vào container.
Confirm lại port bằng lệnh docker port mysite

$ docker port mysite 
443/tcp -> 0.0.0.0:32776  
80/tcp -> 0.0.0.0:32777  

truy cập site của bạn qua browser http://192.168.99.100:32777/
Bạn sẽ thấy nội dung file index bạn đã tạo ở trên hiển thị trên trang chủ của ngnix.

Hãy thử add 1 file khác trong folder site của bạn. Ví dụ hello.html

$ echo "Hello Docker!" > hello.html

và thử trên trình duyệt http://192.168.99.100:32783/hello.html
bạn sẽ thấy file hello.html được thay đổi tức thời trên docker container.

còn tiếp