Thứ ba, 06/08/2013 | 00:00 GMT+7

Bắt đầu với LXC trên VPS Ubuntu 13.04


Giới thiệu

LXC, hay Linux Containers, là một hệ thống được xây dựng dựa trên một số tính năng có trong nhân Linux hiện đại, cho phép tạo và quản lý nhiều hệ thống Linux ảo hóa trên một hệ thống server mẹ. Tuy nhiên, không giống như một số giải pháp ảo hóa, không có giả lập phần cứng nào được sử dụng và containers chia sẻ kernel với server , điều này làm cho LXC cực kỳ nhẹ và dễ bắt đầu. Ngoài ra, do chỉ phụ thuộc vào các tính năng kernel chính, LXC được dùng trong các hình ảnh KVM trên DigitalOcean.

Một số lợi ích chính của LXC bao gồm:

Bảo mật - Bằng cách chạy các dịch vụ chính trong các containers riêng biệt, bạn có thể đảm bảo một lỗ hổng bảo mật trong một lỗi sẽ được cách ly tốt hơn khỏi ảnh hưởng đến các dịch vụ khác. Điều này nghe có vẻ rất giống với chroot jails, nhưng LXC cung cấp nhiều thứ hơn là chỉ cô lập hệ thống file .

Tính di động - Các container LXC có thể được nén và di chuyển đến bất kỳ server nào khác có cùng kiến trúc bộ xử lý. Điều này hoạt động hiệu quả khi bạn mở rộng ứng dụng của bạn , vì các dịch vụ riêng lẻ có thể được sao chép hoặc di chuyển dễ dàng.

Giới hạn - Do sử dụng cggroup Linux, containers LXC có thể được cấu hình với các giới hạn về tài nguyên. Khi chạy một số lượng lớn các container , điều này có thể đảm bảo những container quan trọng nhất được ưu tiên đầu tiên.

Lưu ý: Hướng dẫn sau hy vọng rằng tất cả các lệnh trên server được thực thi với quyền là user gốc .

Cảnh báo: Đừng cố sử dụng hướng dẫn sau trên hệ thống Debian. Mặc dù có những điểm giống nhau, các gói Debian LXC có một số lỗi ngăn cản sự cách ly thích hợp giữa các containers và hệ thống server của chúng.

Cài đặt

Trước khi có thể tạo containers LXC đầu tiên của bạn , ta cần cài đặt các công cụ cần thiết để quản lý và tạo chúng:

apt-get install lxc

Gói này cài đặt các yêu cầu của LXC và cũng cài đặt cấu trúc mạng cho các container . Sau khi cài đặt gói hoàn tất, ta có thể kiểm tra kernel và cấu hình đã sẵn sàng bằng cách chạy lxc-checkconfig :

$ lxc-checkconfig  Kernel configuration not found at /proc/config.gz; searching...  Kernel configuration found at /boot/config-3.8.0-19-generic  --- Namespaces ---  Namespaces: enabled  Utsname namespace: enabled  Ipc namespace: enabled  Pid namespace: enabled  User namespace: missing  Network namespace: enabled  Multiple /dev/pts instances: enabled    --- Control groups ---  Cgroup: enabled  Cgroup clone_children flag: enabled  Cgroup device: enabled  Cgroup sched: enabled  Cgroup cpu account: enabled  Cgroup memory controller: enabled  Cgroup cpuset: enabled    --- Misc ---  Veth pair device: enabled  Macvlan: enabled  Vlan: enabled  File capabilities: enabled    Note : Before booting a new kernel, you can check its configuration  usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig  

Bạn có thể nhận thấy rằng 'Không gian tên user ' được chỉ ra là bị thiếu; lý tưởng là nó nên được kích hoạt, nhưng LXC sẽ vẫn hoạt động mà không có nó cho các trường hợp sử dụng được đề xuất trong hướng dẫn này.

Tạo containers mới

Các containers LXC mới được tạo bằng lệnh lxc-create . Ta sẽ sử dụng mẫu ubuntu để tạo và điền một containers mới có tên là 'test-container':

lxc-create -n test-container -t ubuntu

Lệnh này có thể mất vài phút để hoàn thành lần đầu tiên, vì nó download và lưu trữ tất cả các thành phần cần thiết vào bộ nhớ cache. Tuy nhiên, cuối cùng nó sẽ trở lại và bạn sẽ có một bản cài đặt Ubuntu rất tối thiểu được tạo bằng debootstrap trong một containers mới.

Vài dòng cuối cùng của kết quả tạo cũng sẽ cho ta biết tên user và password mặc định cho containers đã tạo:

##  # The default user is 'ubuntu' with password 'ubuntu'!  # Use the 'sudo' command to run tasks as root in the container.  ##

Bất cứ lúc nào, ta cũng có thể kiểm tra trạng thái của các containers bằng lxc-ls --fancy , hiện sẽ hiển thị containers của ta ở trạng thái dừng:

# lxc-ls --fancy  NAME            STATE    IPV4  IPV6  AUTOSTART  ----------------------------------------------  test-container  STOPPED  -     -     NO

Sau khi file cấu hình được lưu, bước tiếp theo là chạy containers của ta , có thể đạt được điều này với lxc-start :

lxc-start -n test-container -d

Lệnh này sẽ trả về ngay lập tức, trong khi containers sẽ bắt đầu ở chế độ nền. Sau vài giây, hãy thử lại lxc-ls --fancy và ta sẽ thấy containers đang chạy và đã được chỉ định một địa chỉ IP:

# lxc-ls --fancy  NAME            STATE    IPV4        IPV6  AUTOSTART  ----------------------------------------------------  test-container  RUNNING  10.0.3.143  -     NO

Lưu ý IP được chỉ định thuộc về một cầu nối nội bộ, nghĩa là các containers không thể truy cập được từ IP DigitalOcean bên ngoài của bạn nhưng có quyền truy cập vào internet. Trong phần tiếp theo, ta sẽ xem xét chuyển tiếp cổng để cho phép các dịch vụ bên trong containers lắng nghe trên giao diện VPS công khai.

Cuối cùng, ta có thể truy cập containers của bạn bằng lxc-console :

lxc-console -n test-container

Thao tác này sẽ đưa bạn vào dấu nhắc đăng nhập thông thường đang chạy cho containers , nơi bạn có thể sử dụng tổ hợp tên user / password được cung cấp trong quá trình tạo VPS của bạn (ubuntu / ubuntu). Mặc dù vậy, ta khuyên bạn nên thay đổi password mặc định này cho bất kỳ containers nào sẽ lưu trữ các dịch vụ kết nối internet.

Sau khi đăng nhập, bạn sẽ có một dấu nhắc bash thường xuyên mà từ đó bạn có thể làm hầu hết mọi thứ bạn làm trên server . Vì đây là một cài đặt tối thiểu, bạn có thể nhận thấy rằng một số công cụ bạn sử dụng không có, nhưng chúng có thể được cài đặt thông qua apt-get nếu cần.

Khi bạn khám phá xong containers mới của bạn , bạn có thể thoát khỏi console của nó và quay lại server lưu trữ bằng lệnh Ctrl-A sau đó là Q.

Cài đặt dịch vụ

Ví dụ: ta sẽ cài đặt nginx trong containers của bạn và làm cho nó có thể truy cập được từ internet. Vùng chứa của ta đang chạy version VPS Ubuntu của riêng nó một cách hiệu quả, nghĩa là cài đặt một dịch vụ cũng giống như cài đặt trên chính server ; do đó, nhiều hướng dẫn ở đây trên DigitalOcean sẽ hoạt động tốt ngay cả trong containers .

Sau khi bạn được kết nối thông qua lxc-console , ta có thể cài đặt gói nginx:

sudo apt-get install nginx  sudo service nginx start

Thao tác này sẽ cài đặt nginx và đảm bảo nó đang chạy, nhưng ta chưa thể truy cập nó từ giao diện công khai của server . Bạn có thể thấy trường hợp này xảy ra nếu bạn chuyển đến http: // your-DO-ip và lưu ý nó sẽ chưa phản hồi.

Như đã đề cập trước đó, các containers được cấp IP trong một phạm vi riêng tư hoạt động sau NAT và do đó thường không thể truy cập được từ internet. Điều này tương tự như cách hầu hết các mạng gia đình hoạt động, theo đó tất cả các máy tính chia sẻ một IP trên cổng.

Sử dụng iptables trên server , có thể xem NAT được cấu hình như thế nào:

# iptables -t nat -L  Chain PREROUTING (policy ACCEPT)  target     prot opt source               destination    Chain INPUT (policy ACCEPT)  target     prot opt source               destination    Chain OUTPUT (policy ACCEPT)  target     prot opt source               destination    Chain POSTROUTING (policy ACCEPT)  target     prot opt source               destination  MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24

Cài đặt này cho phép tất cả các containers truy cập vào mạng bên ngoài nhưng chuyển tiếp cổng là bắt buộc để hiển thị các dịch vụ trên containers với internet.

Nhìn lại kết quả lxc-ls --fancy từ phía trên, ta có thể thấy rằng containers của ta đã được gán IP riêng 10.0.3.143 (điều này có thể sẽ khác đối với bạn). Bằng cách thêm luật iptables vào bảng định tuyến trước, ta có thể chuyển tiếp các gói trên cổng 80 sang cổng 80 của containers nginx của ta .

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.3.143:80

Lưu ý: Nếu bạn đã có dịch vụ trên server đang lắng nghe trên cổng 80, luật này sẽ chuyển tiếp tất cả các gói đến containers (ngay cả khi không chạy) và do đó dịch vụ của server sẽ không thể truy cập được.

Điều hướng đến http: // your-DO-ip bây giờ sẽ hiển thị trang nginx mặc định, cho ta biết rằng quá trình cài đặt và chuyển tiếp cổng đã thành công:

Quá trình này hiện có thể được lặp lại trong các containers mới cho bất kỳ dịch vụ nào khác mà bạn muốn chạy. Lợi ích của phương pháp này là nếu một lỗ hổng bảo mật được tìm thấy và khai thác trong nginx, kẻ tấn công sẽ không thể ảnh hưởng đến bất kỳ dịch vụ nào khác, chẳng hạn như database của bạn, mà trước tiên không cần tìm một khai thác khác để thoát khỏi containers .

Thêm giới hạn

Bên cạnh sự cô lập, một lợi ích lớn khác của việc sử dụng LXC là khả năng áp dụng các giới hạn cgroup cho các quy trình trong một container .

Các giới hạn cho containers được xác định trong file cấu hình của nó, bạn có thể tìm thấy giới hạn cho containers của ta tại / var / lib / lxc / test-container / config .

Giới hạn bộ nhớ được dùng để đặt mức sử dụng RAM tối đa cho containers . Trong trường hợp này, ta sẽ giới hạn containers của bạn ở 50MB bộ nhớ:

lxc.cgroup.memory.limit_in_bytes = 50000000

Giới hạn CPU được định nghĩa hơi khác một chút; không giống như với bộ nhớ, nơi các giới hạn vật lý được xác định, các giới hạn CPU hoạt động với các "chia sẻ" của CPU:

lxc.cgroup.cpu.shares = 100

Những chia sẻ này không được liên kết với bất kỳ số lượng vật lý nào mà thay vào đó chỉ biểu thị sự phân bổ tương đối của tài nguyên CPU, nghĩa là một containers có nhiều chia sẻ hơn sẽ được ưu tiên truy cập CPU cao hơn. Mặc dù vậy, các con số được sử dụng là hoàn toàn tùy ý, vì vậy việc đưa ra một containers 10 và một containers khác 20 cũng giống như việc cho chúng lần lượt là 1000 và 2000, vì tất cả những gì nó cho ta biết là containers thứ hai có mức ưu tiên chia sẻ CPU gấp đôi. Chỉ cần đảm bảo bạn nhất quán với quy mô của bạn giữa các container .

Khi bạn đã thay đổi giới hạn cgroup trong file cấu hình, bạn cần tắt và khởi động lại containers để các thay đổi có hiệu lực.

Ngoài ra, các giới hạn có thể được đặt tạm thời trên một containers đang chạy bằng lệnh lxc-cgroup :

lxc-cgroup -n test-container cpu.shares 100

Tự động bắt đầu

Thường xảy ra trường hợp bạn muốn các containers tự động khởi động lại sau khi khởi động lại, đặc biệt nếu chúng đang lưu trữ các dịch vụ. Theo mặc định, các containers sẽ không được khởi động sau khi khởi động lại, ngay cả khi chúng đang chạy trước khi tắt máy.

Để thực hiện tự động khởi động containers , bạn chỉ cần softlink file cấu hình của nó vào folder / etc / lxc / auto :

ln -s /var/lib/lxc/test-container/config /etc/lxc/auto/test-container.conf

Bây giờ, chạy lại lxc-ls --fancy sẽ cho thấy containers của ta đã được cài đặt để tự động khởi động lại:

# lxc-ls --fancy  NAME            STATE    IPV4        IPV6  AUTOSTART  ----------------------------------------------------  test-container  RUNNING  10.0.3.143  -     YES

Phá hủy một containers

Khi bạn đã hoàn tất với một containers , nó có thể được xóa khỏi hệ thống của bạn để giải phóng dung lượng đĩa. Đầu tiên, hãy đảm bảo containers được dừng bằng lxc-shutdown :

lxc-shutdown -n test-container

Điều này sẽ cố gắng tắt containers một cách an toàn. Việc thay thế lxc-shutdown bằng lxc-stop sẽ thực hiện kết thúc ngay lập tức containers , tương tự như việc kéo phích cắm nguồn trên một máy thực và có thể khiến dữ liệu ở trạng thái bị hỏng. Do đó, chỉ sử dụng lxc-stop trong trường hợp lxc-shutdown không thành công.

Sau khi dừng và bạn chắc chắn rằng không có dữ liệu nào bạn muốn giữ lại trên containers , nó có thể bị hủy bằng lxc-kill :

lxc-destroy -n test-container

Tóm lược

Điều này đã cho thấy vòng đời cơ bản của các container LXC và cách chúng có thể mang lại lợi ích cho cài đặt của bạn. Nếu bạn cần tư vấn hay hỗ trợ gì thêm hãy để lại comment bên dưới.


Tags:

Các tin liên quan

Cách cài đặt CouchDB từ nguồn trên VPS Ubuntu 13.04 x64
2013-08-06
Cách quản lý gói trong Ubuntu và Debian với Apt-Get & Apt-Cache
2013-08-06
Cách cài đặt Go and Revel trên VPS Ubuntu 13.04 x64
2013-07-31
Cách thiết lập chứng chỉ SSL với PhpMyAdmin trên VPS Ubuntu 12.04
2013-07-30
Cách cài đặt và quản lý trình giám sát trên Ubuntu và VPS Debian
2013-07-23
Cách tạo ứng dụng Node.js bằng Sails.js trên VPS Ubuntu
2013-07-16
Cách cài đặt Chef và Ruby với RVM trên VPS Ubuntu
2013-07-15
Cài đặt và sử dụng Ranger, Trình quản lý tệp đầu cuối, trên VPS Ubuntu
2013-07-12
Cách triển khai ứng dụng Flask trên VPS Ubuntu
2013-07-03
Cách cài đặt và sử dụng màn hình trên server cloud Ubuntu
2013-07-01