Bài đăng nổi bật

Hướng dẫn thay đổi thư mục root mặc định của Docker trên Linux

Hoàn cảnh: người viết gặp một trường hợp như này Được team hạ tầng cấp cho một máy chủ gồm 2 phân vùng lưu trữ, 1 phân vùng 20GB được gắn và...

21 tháng 2, 2019

Hướng dẫn build docker trên Ubuntu


Hướng dẫn build docker trên Ubuntu

Lưu ý: các lệnh trong bài viết này đều phải chạy với quyền sudo

1.Cài đặt docker

Để cài đặt docker, chạy lệnh sau:
sudo apt-get  docker.io
Để kiểm tra xem đã cài đặt được chưa thì chạy lệnh:
docker --version
Đưa docker trở thành một dịch vu của hệ thống:
sysemctl start docker
systemctl enable docker 

2. Giới thiệu một số lệnh docker thông dụng

Docker sử dụng một file có tên là dockerfile để tạo image. File này sẽ bao gồm một loạt các lệnh chỉ dẫn cho docker biết cách tạo image như thế nào.
Nguyên tắc đọc file này như sau:
  • Đọc lần lượt từ trên xuống dưới.
  • Mỗi dòng là một lệnh, để ngắt dòng cần dùng ký tự "\"
  • Nếu có sửa file này, docker sẽ bắt đầu lại từ dòng được sửa cho tới hết file.
Dưới đây là một số lệnh thường dùng (lưu ý viết hoa):
  • FROM: Tên image gốc được sử  dụng để tạo image này. Dòng này là dòng bắt buộc và phải nằm trên cùng của file dockerfile.
  • MAINTAINER: tùy chọn, ghi thông tin người tạo image.
  • RUN: là dòng lệnh sẽ được chạy trong quá trình build image.
  • ADD: thêm một file/thư mục từ host vào image, có một tùy chọn cho phép docker download file này từ một địa chỉ url.
  • COPY: tương tự như ADD nhưng không hỗ trợ giải nén file nén và không hỗ trợ  download từ url.
  • ENV: định nghĩa một biến môi trường.
  • CMD: lệnh trong image sẽ được chạy khi image được khởi động.
  • ENTRYPOINT: định nghĩa một dòng lệnh mặc định sẽ được chạy khi image được chạy.
  • WORKDIR: thư mục mà lệnh trong tùy chọn CMD sẽ chạy sau khi image khởi động xong.
  • USER: là tên user hoặc uuid của user sẽ được tạo để chạy trong môi trường của image.
  • VOLUME: cho phép image được truy cập một thư mục của host khi image chạy.
  • #: comment trong docker file.

3. Hướng dẫn build docker image cơ bản

Tạo một docker file bằng lệnh:
nano ./Dockerfile
Thêm dòng sau vào đầu file để build image từ base ubuntu:16.04
#Download base image ubuntu 16.04
FROM ubuntu:16.04
Thêm dòng sau để image có repository được cập nhật lúc build:
RUN apt-get update 
Thêm dòng sau để cài một số ứng dụng cần thiết, ở đây ta đang cài nginx, php-fpm:
RUN apt-get install -y nginx php7.0-fpm supervisor && \
    rm -rf /var/lib/apt/lists/*
Thêm dòng sau để thay virtualhost configure mặc định:
#Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.0/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf
# Enable php-fpm on nginx virtualhost configuration
COPY default ${nginx_vhost}
RUN sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' ${php_conf} && \
    echo "\ndaemon off;" >> ${nginx_conf}
#Copy supervisor configuration
COPY supervisord.conf ${supervisor_conf}
Thêm dòng sau để tạo thư mục mới:
RUN mkdir -p /run/php && \
    chown -R www-data:www-data /var/www/html && \
    chown -R www-data:www-data /run/php
Thêm dòng sau để gắn thêm volume của host vào docker image:
# Volume configuration
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
Thêm dòng sau để các dịch vụ tự chạy sau khi image được khởi động xong:

# Configure Services and Port

COPY start.sh /start.sh

CMD ["./start.sh"]


EXPOSE 80 443
Để bắt đầu build image, ta chạy lệnh sau:
docker build -t nginx_image .
Lệnh trên sẽ tạo file image tại cùng thư mục với file dockerfile.
Sau khi build xong, có thể kiểm tra xem image đã được tạo thành công chưa bằng lênh, nếu thành công ta sẽ  thấy một image có tên là nginx_image hiện ra trong danh sách:
docker image
Để chạy image mới ta có thể dùng lệnh:
docker run -d -v /webroot:/var/www/html -p 80:80 --name hakase nginx_image
Có thể kiểm tra xem image đã khởi động xong chưa bằng lệnh:
docker ps

13 tháng 2, 2019

Sử dụng phân vùng swap trên môi trường Linux

1. Trước tiên cần hiểu SWAP trên môi trường Linux là gì?
Có thể hiểu đơn giản phân vùng SWAP là  một vùng nhớ bổ sung thêm cho bộ nhớ của hệ thống (RAM), nằm trên ổ đĩa cứng. Nếu bộ nhớ hệ thống bị đầy thì một số vùng nhớ sẽ được đưa xuống SWAP thay vì bị hệ thống hủy tiến trình.
Tuy nhiên, phân vùng SWAP có một vấn đề là do nó là một phần bộ nhớ nằm trên ổ đĩa (HDD hoặc SDD) nên tốc độ của nó sẽ chậm hơn so với tốc độ bộ nhớ chính nên không có nghĩa là bạn có thể sử dụng nó để thay thế hoàn toàn cho bộ nhớ chính.
2. Vậy nguyên tắc hoạt động của phân vùng SWAP như nào?
Có một hiểu lầm phổ biến về việc sử dụng phân vùng SWAP trên các hệ thống, đó là: việc sử dụng phân vùng SWAP gây ảnh hưởng tới hiệu năng của toàn bộ hệ thống do tốc độ đọc ghi trên phân vùng này chậm hơn tốc độ đọc ghi trên RAM. Điều này là hoàn toàn sai lầm. Trong trường hợp hệ thống của bạn có đủ RAM để hoạt động, việc bạn có cấp thêm phân vùng SWAP cho hệ thống hay không cũng không ảnh hưởng gì tới hiệu năng của hệ thống do hệ thống không phải liên tục chuyển đổi giữa RAM và SWAP. Còn trong trường hợp bạn không có đủ RAM thì sao?  Như các bạn đã biết thì bộ nhớ RAM có giá thành cao hơn rất nhiều so với giá của ổ đĩa và rõ ràng là bạn không thể cứ tăng RAM lên liên tục cho hệ thống, khi đó phân vùng SWAP sẽ giải quyết bài toán này cho bạn. Hãy xem ví dụ dưới đây:
  • Nếu bạn không sử dụng phân vùng SWAP và khi RAM của bạn bị sử dụng hết, kernel của hệ thống sẽ lựa chọn một/nhiều tiến trình mà nó nghĩ là cần phải loại bỏ (việc lựa chọn như nào phụ thuộc vào thuật toán được trang bị cho kernel) và loại bỏ chúng (kill).
  • Nếu bạn sử dụng phân vùng SWAP thì khi RAM của bạn bị sử dụng hết, kernel của hệ thống sẽ lựa chọn một vùng nhớ (memory page) ít được sử dụng nhất để đẩy xuống phân vùng SWAP để giải phóng RAM sử dụng vào các mục đích khác. Việc này có thể làm chậm hệ thống một chút nhưng sẽ đảm bảo cho ứng dụng của bạn không bị ảnh hưởng bới những ứng dụng khác.

Tuy nhiên, bạn cần luôn nhớ trong trường hợp nếu bạn có phân vùng SWAP mà vẫn bị hết thì tiến trình sẽ vẫn bị loại bỏ bởi kernel.
3. Vậy câu hỏi đặt ra ở đây là liệu có thực sự cần phân vùng SWAP?
Câu trả lời ở đây chính xác là TỐT NHẤT BẠN NÊN SỬ DỤNG, bởi lý do tôi đã nêu ở trên: nếu bạn đủ RAM thì hệ thống không phải thường xuyên đổ vùng nhớ xuống SWAP nên sẽ không bị ảnh hưởng tới hiệu năng hệ thống, còn trong trường hợp bị thiếu RAM (điều mà bạn không biết chắc lúc nào sẽ xảy ra) thì SWAP sẽ giúp cho các ứng dụng của bạn không bị ảnh hưởng.
4. Vậy tạo phân vùng SWAP như nào?
Để tạo phân vùng SWAP bạn cần có quyền sudo trên hệ thống.
Dùng lệnh dd để tạo file swap trên thư mục gốc của hệ thống, trong đó bs là kích thước block (block size) và count là số block., trong ví dụ dưới đây là tạo một file swap 4GB
sudo dd if=/dev/zero of=/swapfile bs=1G count=4
Trong đó:
- bs và count: có thể là c = 1, w = 2, b = 512, kB = 1000, K = 1024,  MB = 1000 * 1000, M = 1024 * 1024, xM = M, GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 cứ như thế với T, P, E, Z và Y
Cập nhật quyền read, write cho file swap:
sudo chmod 600 /swapfile
Cài đặt phân vùng swap:
sudo mkswap /swapfile
Cho phép hệ thống sử dụng file swap này là vùng nhớ swap:
sudo swapon /swapfile
Kiểm tra xem đã làm đúng các thao tác chưa:
sudo swapon -s
Hoặc:
sudo swapon --show
Cho phép hệ thống sử dụng phân vùng swap vừa tạo ngay cả khi bị khởi động lại:
sudo vi /etc/fstab
Thêm vào dòng sau:

/swapfile swap swap defaults 0 0 
Kiểm tra lại xem fstab đã được chưa bằng lệnh:
mount -a
Nếu không có thông báo lỗi nào hiện ra thì đã thêm vào fstab thành công.
Tham khảo thêm tại:
https://linuxize.com/post/create-a-linux-swap-file/