VMWare Player là 1 phần mềm ảo hóa được sử dụng rộng rãi trong cộng đồng system admin, phục vụ cho việc làm lab cũng như thử nghiệm những hệ điều hành mới mà không cần phải cài đặt trên máy host và đây là phần mềm ưa thích của mình thay vì cài VirtualBox hay VMWare Workstation.
Thông tin về hệ thống, VMWare Player 14.0.0 trên OS kernel 4.13.0-37-gerenic
Tuy nhiên, sau khi cài đặt bản VmWare Workstation 14 Player trên Ubuntu 16.04 thì mình gặp phải lỗi sau khi tạo 1 VM.
Mặc dù RAM của host còn available rất nhiều 😕
Sau khi search google thì mình được biết đây là bug của VMWare trên host kernel 4.13 và mình đã follow thực hiện hotfix theo các bước sau.
Thông tin hotfix ở đây https://github.com/mkubecek/vmware-host-modules/commit/770c7ffe611520ac96490d235399554c64e87d9f
Nginx đã bắt đầu hỗ trợ gRPC từ bản 1.13.10, tuy nhiên vẫn trang trên mainline, chưa stable, thông tin được cập nhật từ trang chủ https://www.nginx.com/blog/nginx-1-13-10-grpc/
Sau đây, mình sẽ hướng dẫn các bạn complie nginx từ source theo document https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/ trên Centos 7.
Fact:
cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
Cài các gói phụ thuộc cần thiết bao gồm, openssl, zlib, pcre
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz
$ tar -zxf pcre-8.41.tar.gz
$ cd pcre-8.41
$ ./configure
$ make
$ make install
$ wget http://zlib.net/zlib-1.2.11.tar.gz
$ tar -zxf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure
$ make
$ make install
$ wget http://www.openssl.org/source/openssl-1.0.2k.tar.gz
$ tar -zxf openssl-1.0.2k.tar.gz
$ cd openssl-1.0.2k
$ ./config–prefix=/usr
$ make
$ make install
Download source
$ wget http://nginx.org/download/nginx-1.13.10.tar.gz
$ tar zxf nginx-1.13.10.tar.gz
$ cd nginx-1.13.10
Top 11 sai lầm người Quản trị hệ thống hay mắc phải
Một người Quản trị hệ thống (System Admin) giữ một vai trò trong lĩnh vực Công nghệ thông tin/Mạng máy tính. Họ chịu trách nhiệm về các hoạt động của máy chủ dịch vụ làm sao để không bị gián đoạn và ảnh hưởng đến việc kinh doanh của công ty. Nhận thức của một quản trị viên hệ thống về các lỗ hỏng bảo mật hệ thống và việc ảnh hưởng đến các máy chủ liên quan hoạt động công ty là một đức tính rất cần cho bất kỳ tổ chức/công ty nào đang thuê họ. Trong công việc của mình các Quản trị viên thường mắc phải 11 sai lầm sau, cùng Cuongquach.com tìm hiểu nhé.
Một trong những vấn đề về bảo mật quan trọng nhất là hạn chế cho người dùng đặc quyền quá cao. Các ứng dụng cũng như vậy, chỉ cần đáp ứng theo đúng requirement của ứng dụng yêu cầu là được.
Khi một ứng dụng thực thi với quyền root, đồng nghĩa nó có thể kiểm soát máy chủ của bạn. Nếu đó là ứng dụng nhiễm mã độc thì hacker hoặc kẻ xấu có thể truy cập được vào máy chủ của bạn và kiểm soát nó.
2. Sử dụng lại mật khẩu trong hệ thống quản lý
Đôi khi máy chủ được thiết lập với mật khẩu yếu, hoặc theo thói quen quản trị viên hệ thống thường sử dụng cùng một mật khẩu trên cùng hệ thống. Điều này là không nên tí nào. Việc sử dụng cùng mật khẩu dẫn đến nguy cơ tiềm tàng rất cao.
Brute force là dạng tấn công đoán mật khẩu, nếu sử dụng cùng mật khẩu thì việc có được một mật khẩu đồng nghĩa có cả một hệ thống trong tay. Hacker có thể làm bất cứ điều gì nguy hiểm mà ta không lường trước được.
Thay vì sử dụng mật khẩu, quản trị viên nên cân nhắc sử dụng private/public key để đăng nhập vào máy chủ. Bằng cách sử dụng mật mã bất đối xứng, public key được lưu trên server và người quản trị giữ private key thì kẻ tấn công còn lâu mới khai thác được ta.
3. Chia sẻ tài khoản quản trị
Các tài khoản quản trị thường có đặc quyền rất cao, quản trị viên thường hay sử dụng tài khoản quản trị mà không kiểm soát tốt. Nhiều người còn chia sẻ tài khoản quản trị cho nhau. Rồi đến một thời điểm nào đó, khi người quản trị rời khỏi công ty, mật khẩu cũng không thay đổi hoặc không thu hồi tài khoản. Vì vậy các tài khoản này thường có khả năng bị truy cập trái phép vào hệ thống.
Quản trị viên nên thay đổi mật khẩu định kỳ, bất kỳ ai rời khỏi tổ chức nên rà soát và thu hồi tài khoản.
4. Quên gia hạn SSL
Các chứng chỉ SSL certificate đều có thời gian hết hạn, sau khi hết hạn kết nối sẽ không còn đảm bảo tính bảo mật, người truy cập sẽ thấy cảnh báo bảo mật ngay. Hacker có thể tận dụng trang web hết hạn này để khai thác để lấy dữ liệu khách hàng hoặc sử dụng cho mục đích xấu. Quản trị viên thường là những người thực hiện việc xin cấp SSL, nhưng họ lại quên gia hạn và khách hàng của tổ chức họ trở thành nạn nhân khi web mất SSL.
5. Không theo dõi log file
Duy trì file log và theo dõi nó rất quan trọng đối với quản trị hệ thống. Các file này sẽ có ích khi khắc phục sự cố, cho phép quản trị viên thấy vấn đề xảy ra. Quản trị viên nên theo dõi file log và khi nào chúng được tạo, phải biết chúng chứa thông tin gì và sao lưu để khi cần sử dụng.
6. Lưu trữ mật khẩu dạng plain-text
Việc lưu trữ mật khẩu dạng ký tự thường không được mã hóa dễ dẫn đến rủi ro bị khai thác. Vì mật khẩu dạng thường bất ký ai cũng có thể đọc được và sử dụng để truy cập trái phép tài nguyên. Quy tắc quản lý mật khẩu đòi hỏi rằng mật khẩu không nên được lưu dưới dạng text như vậy. Các quản trị viên có thể xem xét sử dụng các extension hoặc app tích hợp ở các trình duyệt như Lastpasss, Dashlane, KeePass, Roboform 8 để ghi nhớ password giúp mình.
7. Báo cáo lỗi
Khi mọi người báo cáo vấn đề của hệ thống thông qua email hay các ứng dụng chat nhóm, trong mô tả vấn đề quản trị viên thường cung cấp thông tin đăng nhập vào hệ thống, điều này không nên. Khi có vấn đề về hệ thống thì phải được chuyển tiếp đến bộ phận liên quan để nhóm này giải quyết.
8. Không giữ hệ thống cập nhật thường xuyên
Một vài quản trị viên không chú ý đến cập nhật bảo mật thường xuyên khi có, như lỗi Meltdown và Spectre gần đây mình xin hỏi các bạn đã update hay chưa? Mình cá rằng chắc cũng 30% chưa đâu. Bất kỳ khi nào có bản vá bảo mật, quản trị viên nên kiểm tra các nghiên cứu các lỗi đó ảnh hưởng ra sao đến hệ thống mình và xem xét cập nhật.
9. Superuser tasks
Quản trị viên không nên cho người dùng khả năng truy cập hoặc sử dụng các lệnh đặc quyền. Đặc biệt khi lỡ như người dùng bị tấn công, hacker có thể leo thang đặc quyền chiếm quyền kiểm soát hệ thống, lấy đi các thông tin quan trọng.
Người dùng nên đăng nhập bằng tài khoản cá nhân của mình và sử dụng lệnh SUDO (Linux) cho các lệnh được chỉ định khi cần.
10. Không chấm dứt các tài khoản đang hoạt động
Với các tài khoản không sử dụng nữa, hacker có thể nhắm mục tiêu đến những tài khoản này và khai thác chúng, đặc biết là nếu họ có mật khẩu mặc định. Quản trị viên nên vô hiệu hóa các tài khoản không sử dụng nữa bằng cách chỉnh sửa tệp mật khẩu và thay bằng chuổi mã hóa.
11. Thực thi các script không rõ nguồn gốc
Ngay cả khi có nguồn gốc tin cậy, quản trị viên cũng nên biết rằng việc tải script về qua internet là không an toàn. Vì vậy khi thực thi bạn nên xem các lệnh thực hiện trong script có dẫn đến hành động bất chính nào không nhé.
Tổng kết
Hy vọng qua bài viết “Top 11 sai lầm người Quản trị hệ thống hay mắc phải” này các quản trị viên hệ thống sẽ có thêm kiến thức trước các vấn đề bảo mật như hiện tại. Tin tặc ngày càng phát triển và tinh vi hơn, điều quan trọng là luôn bổ sung kiến thức bảo mật để bảo đảm hệ thống mình luôn ổn định. Cám ơn các bạn đã theo dõi.
Docker là một hệ thống mã nguồn mở, hỗ trợ đóng gói và tự động triển khai phần mềm trong các container. Nó cung cấp một cách nhanh, gọn để tạo môi trường hoạt động cho phần mềm, giảm thiểu rủi ro giữa dev và ops khi developper phát triển trên cùng một môi trường như môi trường vận hành, giúp dễ dàng tự động hóa và tăng tốc chu trình phát triển phần mềm (dev, test, deploy…).
Ưu điểm:
Triển khai ứng dụng nhanh chóng : container bao gồm các yêu cầu tối thiểu để chạy của ứng dụng , làm giảm kích thước của chúng và cho phép chúng được triển khai nhanh chóng .
Khả năng di chuyển linh động : một ứng dụng và tất cả các phụ thuộc của nó có thể được gói vào một container duy nhất , độc lập với các phiên bản máy chủ của Linux kernel , phân phối nền tảng , hoặc mô hình triển khai.Container này có thể được chuyển sang một máy chạy Docker, và được thực hiện mà không hề có vấn đề tương thích hay không.
Kiểm soát phiên bản và tái sử dụng.
Dễ dàng chia sẻ : với Docker Hub hoặc 1 public Registry việc chia sẻ container rất dễ dàng thực hiện và thân thiện với mọi người kể cả developer, tester, admin system.
Nhẹ và chi phí tối thiểu : Docker image thường rất nhỏ , tạo điều kiện cho việc kiểm thử và giảm thời gian để triển khai các ứng dụng mới container.
I.2 Khi nào sử dụng docker
Tách biệt các cài đặt cho từng ứng dụng, không gây ảnh hưởng lẫn nhau.
Xây dựng môi trường làm việc mà không quá tốn nhiều thời gian cho việc cài đặt.
Đồng nhất môi trường phát triển.
Đóng gói môi trường thực thi một cách nhỏ gọn kèm theo cho dự án.
I.3 Kiến trúc của Docker
Docker sử dụng kiến trúc client-server:
Client: Là bộ công cụ ở dạng dòng lệnh dùng để pull/push/search các templates dựng sẵn từ registry công cộng hoặc riêng một tổ chức nào đó thông qua Restful API và tập hợp các lệnh khác để tương tác với container.
Server: chạy trên nền hệ điều hành của máy chủ dưới dạng một daemon, chịu trách nhiệm cho các tác vụ như đóng gói, thực thi, tải về container image.
I.4 Các thành phần của docker
Docker được tạo bởi 3 phần chính : Container, Image, Registry
Container: dùng để tách biệt ứng dụng và các thành phần thưc thi của ứng dụng đó với các container khác trên cùng 1 máy chủ và với chính máy chủ chứa container đó.
Image: là các template dựng sẵn đã chứa đủ các thành phần của môi trường thực thi cần cho ứng dụng và được dùng để tạo các container. Chẳng hạn một image chứa hệ điều hành Ubuntu đã cài đặt sẵn Apache và ứng dụng web
Registry : Là kho chứa images. Người dùng có thể tạo ra các images của mình và tải lên đây hoặc tải về các images được chia sẻ (Docker Hub)
Hình 1.1 Mô hình tương tác giữa các thành phần docker
Docker Daemon
Như thế hiện trên hình vẽ , Docker daemon chạy trên các máy host. Người dùng sẽ không tương tác trực tiếp với các daemon, mà thông qua Docker Client.
Docker Client
Là giao diện người dùng của Docker, nó cung cấp cho người dùng giao diện dòng lệnh và thực hiện phản hồi với các Docker daemon.
Docker images
Là một template chỉ cho phép đọc, ví dụ một image có thể chứa hệ điều hành Ubuntu và web app. Images được dùng để tạo Docker container. Docker cho phép chúng ta build và cập nhật các image có sẵn một cách cơ bản nhất, hoặc bạn có thể download Docker images của người khác.
Docker Container
Docker container có nét giống với các directory. Một Docker container giữ mọi thứ chúng ta cần để chạy một app. Mỗi container được tạo từ Docker image. Docker container có thể có các trạng thái run, started, stopped, moved và deleted.
I.5 Sự khác nhau giữa Docker và Máy Ảo
Hình 1.2 Mô hình docker và máy ảo
Cùng xét mô hình kiến trúc của VM: Mỗi ứng dụng được ảo hóa bao gồm chính ứng dụng đấy và cũng chứa các phụ thuộc của nó giống như bên container. Tuy nhiên bên VM sẽ kèm theo thêm 1 guest OS. Điều này dẫn tới việc đóng gói ứng dụng được ảo hóa sẽ có dung lượng lên tới hàng GB.
Khác với container là chia sẻ host OS đồng nghĩa với việc các container sẽ có OS giống nhau thì với máy ảo, mỗi một VM có thể có OS khác so với các VM khác và thậm trí OS của các VM hoàn toàn có thể khác với host OS.
Xét về tính linh hoạt: Nếu như bạn muốn bảo trì máy host, với container thì khi bảo trì mà buộc phải khởi động lại máy thì đồng nghĩa với việc hoạt động của các container có trong máy đó sẽ bị gián đoạn. Tuy nhiên với VM, bạn hoàn toàn có thể di chuyển các VM có trong máy cần được bảo dưỡng sang tạm các máy tính khác. Điều này giúp ứng dụng có trong các VM hoạt động mà không bị gián đoạn.
Xét về tính an toàn: Với container, do dùng chung OS nên nếu có lỗ hổng nào đấy ở kernel của host OS thì nó sẽ ảnh hưởng tới toàn bộ container có trong host OS đấy
Sử dụng Docker tạo và xóa container nhanh, dễ dàng, trong khi Virtual Machine yêu cầu cài đặt đầy đủ và sử dụng nhiều tài nguyên của máy để thực thi việc cài đặt đó
Container ưu điểm là lightweight, có thể chạy nhiều container hơn VM khi triển khai trên cùng một máy chủ. Container bật tắt nhẹ nhành, nhanh chóng
VM có thể migrate giữa các máy chủ trong lúc chạy. Container thì phải dừng hẳn thì mới migrate được.
Hypervisor có thời gian khởi động trung bình là 20s, thay đổi phụ thuộc vào tốc độ của ổ đĩa.
Containers khởi động và làm cho ứng dụng sẵn sàng chạy trong 500ms, mang lại tính khả thi cao cho những dự án cần sự mở rộng nhanh.
I.6 Quy trình thực thi của một hệ thống sử dụng Docker.
Như hình vẽ trên , một hệ thống Docker được thực thi với 3 bước chính :
Build -> Push -> Pull,Run
a, Build.
Đầu tiên chúng ta sẽ tạo một dockerfile, trong dockerfile này chính là code của chúng ta.
Dockerfile này sẽ được Build tại một máy tính đã cài đặt Docker Engine.
Sau khi build ta sẽ thu được Container, trong Container này chứa bộ thư viện và ứng dụng của chúng ta.
b, Push.
Sau khi có được Container, chúng ta thực hiện push Container này lên đám mây và lưu trữ ở đó.Việc push này có thể thực hiện qua môi trường mạng Internet.
c, Pull, Run
Giả sử một máy tính muốn sử dụng Container chúng ta đã push lên đám mây (máy đã cài Docker Engine) thì bắt buộc máy phải thực hiện việc Pull container này về máy. Sau đó thực hiện Run Container này.
II.Cấu trúc của một Docker File
II.1 Docker File
Dockerfile là 1 file text chứa các lệnh thực thi để build 1 image cho docker. Với dockerfile chúng ta có 1 phương tiện để build các image 1 cách tự động và share với nhau 1 cách dễ dàng, 1 team của 1 dự án có thể dung dockerfile để tạo các môi trường dev và test đồng nhất với nhau
II.2 Cấu trúc tập lệnh của một Docker File
+ FROM <image>
Đây là lệnh phải có với bất kỳ 1 dockerfile nào, và phải nằm ở line đầu tiên của file
Mục đích của lệnh là set image làm cơ sở để từ đó tạo nên image muốn build
Ví dụ: FROM ubuntu:12.04
=>Nếu image cơ sở này không tồn tại trong local thì docker sẽ tự pull image này từ Docker Hub
+ MAINTAINER <name>
Lệnh dùng để set tác giả của image, có thể có hoặc không
+ RUN <command>
Lệnh dùng để thực thi 1 command trên hệ thống(của image)
+ CMD <command>
Trong 1 dockerfile chỉ có thể có 1 lệnh CMD. Lệnh này để tạo command được thưc thi khi khởi chạy image
+ ADD <src> <dest>
Lệnh dùng để copy file từ remote hoặc local file được chỉ định ở <src> vào path trên container được chỉ đinh ở <dest>
+ EXPOSE <port> [<port>]
Lệnh dùng để chỉ định rằng containner của image sẽ listen trên các port nào đó trong khi chạy
III. Một số tập lệnh làm việc với Docker ( Docker Engine)
+Pull một image từ Docker Hub $ docker pull {image_name}
+Liệt kê các images hiện có $ docker images
+Xóa một image $ docker rmi {image_id/name}
+Liệt kê các container đang chạy $ docker ps $ docker ps -a #Liệt kê các container đã tắt
+Xóa một container $ docker rm -f {container_id/name}
+Đổi tên một container $ docker rename {old_container_name} {new_container_name}
+Khởi động một container $ docker start {new_container_name} $ docker exec -it {new_container_name} /bin/bash
+Tạo mới một container, đồng thời khởi động với tùy chọn cổng và volume $ docker run –name {container_name} -p {host_port}:{container_port} -v {/host_path}:{/container_path} -it {image_name} /bin/bash
+Xem các thay đổi trên container $ docker diff {container_name}
+Commit các thay đổi trên container và image $ docker commit -m “message” {container_name} {image_name}
+Save image thành file .tar $ docker save {image_name} > {/host_path/new_image.tar}
+Tạo một image mới từ file .tar $ cat musashi.tar | docker import – {new_image_name}:latest
+Xem lịch sử các commit trên image $ docker history {image_name}
+Khôi phục lại images từ IMAGE_ID $ docker tag {iamge_id} {image_new_name}:{tag}
+Build một image từ container $ docker build -t {container_name} . Dấu . ở đây có thể hiểu là Dockerfile đang nằm trong thư mục hiện tại.
Tham khảo phần demo tạo 1 Docker file & container qua link github sau:
https://github.com/lieunn/docker-lamp
IV. Docker Storage
Volume trong Docker
=>Volume trong Docker được dùng để chia sẻ dữ liệu cho container. Để sử dụng volume trong docker dùng cờ hiệu (flag) -v trong lệnh docker run.
Có thể sử dụng Volume trong Docker trong những trường hợp sau
Chia sẻ giữa container và container.
Chia sẻ giữa container và host.
Sử dụng volume để gắn (mount) một thư mục nào đó trong host với container.
Sử dụng volume để chia sẻ dữ liệu giữa host và container
Trong tình huống này thư mục trên máy host (máy chứa container) sẽ được mount với một thư mục trên container, dữ liệu sinh ra trên thư mục được mount của container sẽ xuất hiện trên thư mục của host.
* Có 2 chế độ chia sẻ volume trong docker, đó là read-write (rw) hoặc read-only (ro). Nếu không chỉ ra cụ thể thì mặc định sử dụng chế độ read-write. Ví dụ chế độ read-only, sử dụng tùy chọn ro.
$ docker run -it -v $(pwd)/bindthis:/var/www/html/webapp:ro ubuntu bash
Các lưu ý về volume trong Docker
Đường dẫn trong cờ hiệu -v phải là đường dẫn tuyệt đối, thường dùng $(pwd)/ten_duong_dan để chỉ đúng đường dẫn.
Có thể chỉ định việc mount giữa thư mục trên host và thư mục trên container ở các chế độ read-wirte hoặc read-only, mặc định là read-write.
Để chia sẻ volume dùng tùy chọn –volumes-from
Sử dụng Docker với một số storage khác
=>Nhu cầu về lưu trữ data ngày càng tăng => cần 1 giải pháp storage hợp lý, có thể kể đến Ceph, Glusterfs, Openfiler ….
=> Có thể xây dựng một hệ thống storage ceph, gluster tách riêng sau đó sẽ mount các volume share tương ứng về volume local trên docker container
Hình 3.1.Mô hình lưu trữ Ceph-Docker
Như hình trên thì ta sẽ xây dựng một hệ thống ceph cluster chứa các volume cần share, client sẽ xây dựng 2 host docker để map volume share về local và mount vào các docker container
Network của docker được quản lý thông qua một virtual bridge gọi là docker0. 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 startchẳng hạn) thì những step dưới đây sẽ diễn ra:
+ 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
Networking giữa các container với nhau
Để kiểm soát việc các container có làm việc đượ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 <port> trong Dockerfile hoặc là –expose <port> khi khởi động container.
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
=>Mặc định, docker dùng bridge network. Khi cài đặt docker, bạn sẽ thấy một interface docker0 trên host. Khi khởi chạy một container trong host, một interface mới đại diện cho nó sẽ được sinh ra trên host:
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
Compose là công cụ giúp định nghĩa và khởi chạy multi-container Docker applications. Trong Compose, chúng ta sử dụng Compose file để cấu hình application’s services. Chỉ với một câu lệnh, lập trình viên có thể dễ dàng create và start toàn bộ các services phục vụ cho việc chạy ứng dụng.
Compose là một công cụ tuyệt vời không chỉ dùng cho development, testing, staging environments, mà còn ứng dụng trong CI workflows. Việc sử dụng Docker Compose được tóm lược trong 3 bước cơ bản sau:
Khai báo app’s environment với Dockerfile.
Khai báo các services cần thiết để chạy app trong docker-compose.yml.
Run docker-compose up và Compose sẽ start và run app.
Setup Docker-Compose tham khảo qua link github sau:
https://github.com/lieunn/docker-compose
VII. Docker-Swarm
Docker swarm là một công cụ giúp chúng ta tạo ra một clustering Docker. Nó giúp chúng ta gom nhiều Docker Engine lại với nhau và ta có thể “nhìn” nó như duy nhất một virtual Docker Engine.
Trong phiên bản v1.12.0, Docker Swarm là một tính năng được tích hợp sẵn trong Docker Engine.
Trong phần này, tôi sẽ tạo ra 1 cụm cluster gồm 1 manager và 2 worker chạy dịch vụ web-server.
node manager sẽ là node quản lý cluster.
node worker là các node chạy dịch vụ. Nếu mà node worker die thì node manager sẽ run container trên chính nó.
Hazelcast là một mạng lưu trữ dữ liệu trên bộ nhớ Ram (in-memory data grid). Hazelcast đưa ra cài đặt của các interface trong Java như: Map, Queue, Excecutor Service, Lock… Nó được thiết kế rất nhẹ và dễ sử dụng.
Hazelcast được cài đặt bằng ngôn ngữ Java, client hỗ trợ các ngôn ngữ Java, C/C++, C# , Python…
Hazelcast cũng có thể được xem như một giao thức lưu đệm (memcache protocol).
Hazelcast sử dụng cơ chế mạng ngang hàng, không có master và slave. Tất cả các node lưu số lượng dữ liệu như nhau, và xử lý bằng nhau.
Hazelcast lưu trữ mọi thứ trên Ram (in-memory). Nó được thiết kế để thực thi rất nhanh các thao tác đọc và cập nhật (read/update) dữ liệu.
Hazelcast lưu các bản sao (backup) của mỗi mảnh dữ liệu trên các node khác nhau. Khi một node bị lỗi, dự liệu trên node đó sẽ được khôi phục lại từ bản sao (bản backup) và cụm Hazelcast vẫn hoạt động bình thường, không có thời gian ngừng hoạt động (downtime = 0).
Sharding(các mảnh dữ liệu) trong Hazelcast được gọi là các Partition. Mặc định Hazelcast có 271 partition. Các partition được phân tán trên tất cả các node của cụm. Hazelcast cũng tạo bản backup của các partition và phân tán chúng trên các node.
2> Một số Use Case Hazelcast.
Application scaling
Cache-as-a-service
Cross-JVM communication and shared storage
Distributed cache, often in front of a database
In-memory processing and Analytics
In-memory computing
Internet of Things infrastructure
Key-value database
Memcached alternative with a protocol compatible interface[4]
Microservices infrastructure
NoSQL data store
Spring Cache
Web Session clustering
3> Kiến trúc Client-Server Hazelcast.
Hazelcast cung cấp một kiến trúc phân mảnh & phân tán dữ liệu qua cluster node.
+ Hazelcast IMDG có những đặc điểm sau:
Dữ liệu được lưu trữ trên RAM.
Nhiều bản sao được lưu trữ trên nhiều node để auto-recovery dữ liệu trong trường hợp một hoặc nhiều node fail.
Mô hình dữ liệu hướng đối tượng và là kiểu dữ liệu không quan hệ(non-relational).
Resource có thể được tự động thêm hoặc gỡ bỏ để tăng lượng CPU và RAM.
Dữ liệu có thể được duy trí từ một hazelcast node đến một cơ sở dữ liệu quan hệ hoặc NoSQL.
Một Java API Map có thể truy xuất vào kho dữ liệu phân tán key-value.
– update management-center data
– update multicast data
– update tcp-ip data
<group>
<name>sandbox</name>
<password>[email protected]#1234</password>
</group>
<management-center enabled=”true”>http://192.168.175.130:8080/mancenter</management-center>
<network>
<port auto-increment=”true” port-count=”100″>5701</port>
<outbound-ports>
<!–
Allowed port range when connecting to other nodes.
0 or * means use system provided port.
–>
<ports>0</ports>
</outbound-ports>
<join>
<multicast enabled=”false”>
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
<tcp-ip enabled=”true”>
<interface>192.168.175.128</interface>
<member-list>
<member>192.168.175.128</member>
<member>192.168.175.129</member>
</member-list>
</tcp-ip>
<aws enabled=”false”>
$ cd /build/hazelcast-3.9/bin
$ chmod +x *.sh
$ ./start.sh => check port default 5701 is listen and join cluster (member list)
– update management-center data
– update multicast data
– update tcp-ip data
<group>
<name>sandbox</name>
<password>[email protected]#1234</password>
</group>
<management-center enabled=”true”>http://192.168.175.130:8080/mancenter</management-center>
<network>
<port auto-increment=”true” port-count=”100″>5701</port>
<outbound-ports>
<!–
Allowed port range when connecting to other nodes.
0 or * means use system provided port.
–>
<ports>0</ports>
</outbound-ports>
<join>
<multicast enabled=”false”>
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
<tcp-ip enabled=”true”>
<interface>192.168.175.129</interface>
<member-list>
<member>192.168.175.128</member>
<member>192.168.175.129</member>
</member-list>
</tcp-ip>
<aws enabled=”false”>
$ cd /build/hazelcast-3.9/bin
$ chmod +x *.sh
$ ./start.sh => check port default 5701 is listen and join cluster (member list)
Sau khi update OS cho lappi thân yêu của mình từ bản Ubuntu 14.04 lên bản 16.04.03 mới hơn thì mình gặp một số vấn đề, trong đó có việc là cái touchpad của mình không còn tapping được nữa, do bị disable mặc định bởi cái libinput gì đó của hệ thống. Sau 1 thời gian google và tìm cách giải quyết thì mình note lại những cái mình đã thực hiện, sẽ giúp cho các bạn bớt 1 chút thời gian vàng ngọc.
Mình cài phiên bản GNOME Ubuntu 16.04.03 LTS
uname -a
Linux x091s-X250 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Thực hiện cài đặt libinput mới
sudo apt-get install xserver-xorg-input-libinput
Nhưng sẽ gặp lỗi như sau:
The following packages have unmet dependencies: xserver-xorg-input-libinput : Depends: xorg-input-abi-22 Depends: xserver-xorg-core (>= 2:1.17.99.902) E: Unable to correct problems, you have held broken packages.
để cài gói xorg-core, libinput cũng đã bao gồm ở trong này.
sudo apt-get install xserver-xorg-core
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following package was automatically installed and is no longer required:
libxfont2
Use ‘sudo apt autoremove’ to remove it.
The following additional packages will be installed:
xserver-common
Suggested packages:
xfonts-100dpi | xfonts-75dpi
The following packages will be REMOVED:
ubuntu-gnome-desktop xorg xserver-xorg-core-hwe-16.04 xserver-xorg-hwe-16.04 xserver-xorg-input-all-hwe-16.04 xserver-xorg-input-evdev-hwe-16.04
xserver-xorg-input-synaptics-hwe-16.04 xserver-xorg-input-wacom-hwe-16.04 xserver-xorg-video-all-hwe-16.04 xserver-xorg-video-amdgpu-hwe-16.04
xserver-xorg-video-ati-hwe-16.04 xserver-xorg-video-fbdev-hwe-16.04 xserver-xorg-video-intel-hwe-16.04 xserver-xorg-video-nouveau-hwe-16.04
xserver-xorg-video-qxl-hwe-16.04 xserver-xorg-video-radeon-hwe-16.04 xserver-xorg-video-vesa-hwe-16.04 xserver-xorg-video-vmware-hwe-16.04
The following NEW packages will be installed:
xserver-xorg-core
The following packages will be upgraded:
xserver-common
1 upgraded, 1 newly installed, 18 to remove and 171 not upgraded.
Sau đó thực hiện
sudo vi /usr/share/X11/xorg.conf.d/90-libinput.conf
Đây là file cấu hình quy định cách input cho mouse hay touchpad.
Thêm 2 dòng Tapping True và DisableWhileTyping True để config cho touchpad.
The ability to take risks by stepping outside your comfort zone is the primary way by which we grow. But we are often afraid to take that first step. In truth, comfort zones are not really about comfort, they are about fear. Break the chains of fear to get outside. Once you do, you will learn to enjoy the process of taking risks and growing in the process. Here are seven ways to help you get started:
1. Become aware of what’s outside of your comfort zone
In other words: What are the things that you believe are worth doing but are afraid of doing yourself because of the potential for disappointment or failure? Draw a circle and write those things down outside the circle. This process will not only allow you to clearly identify your discomforts, but your comforts. Write identified comforts inside the circle.
2. Become clear about what you are aiming to overcome
Take the list of discomforts and go deeper. Remember, the primary emotion you are trying to overcome is fear. How does this fear apply uniquely to each situation? Be very specific. Are you afraid of walking up to people and introducing yourself in social situations? Why? Is it because you are insecure about the sound of your voice? Are you insecure about your looks? Or, are you afraid of being ignored?
3. Get comfortable with discomfort
One way to get outside of your comfort zone is to literally expand it. Make it a goal to avoid running away from discomfort. Let’s stay with the theme of meeting people in social settings. If you start feeling a little panicked when talking to someone you’ve just met, try to stay with it a little longer than you normally would before retreating to comfort. If you stay long enough and practice often enough, it will start to become less uncomfortable.
4. See failure as a teacher
Many of us are so afraid of failure, that we would rather do nothing than take a shot at our dreams. Begin to treat failure as a teacher. What did you learn from the experience? How can you take that lesson to your next adventure to increase your chance of success?
5. Take baby steps
Don’t try to jump outside your comfort zone, you will likely become overwhelmed and jump right back in. Take small steps toward the fear you are trying to overcome. If you want to do public speaking, start by taking every opportunity to speak to small groups of people. You can even practice with family and friends.
6. Hang out with risk takers
There is no substitute for this step. If you want to become better at something, you must start hanging out with the people who are doing what you want to do and start emulating them. Almost inevitably, their influence will start have an effect on your behavior.
7. Be honest with yourself when you are trying to make excuses
Don’t say “Oh, I just don’t have the time for this right now.” Instead, be honest and say “I am afraid to do this.” Don’t make excuses, just be honest. You will be in a better place to confront what is truly bothering you and increase your chance of moving forward.
8. Identify how stepping out will benefit you
What will the ability to engage in public speaking do for your personal and professional growth? Keep these potential benefits in mind as motivations to push through fear.
9. Don’t take yourself too seriously
Learn to laugh at yourself when you make mistakes. Risk taking will inevitably involve failure and setbacks that will sometimes make you look foolish to others. Be happy to roll with the punches when others poke fun.
10. Focus on the fun
Enjoy the process of stepping outside your safe boundaries. Enjoy the fun of discovering things about yourself that you may not have been aware of previously.
Như các bạn cũng đã theo dõi trong 2 phần trước, đáng lý giờ này mình phải viết part 3 cho việc “cách bày tỏ thái độ và deal lương như thế nào cho hiệu quả”, tuy nhiên mình vẫn chưa pass được vòng technical 🙁 và cũng chưa thực sự đề cập về những vấn đề technical trong bài viết trước, nên mình sẽ viết phần 2+ này để bổ sung.
Trong bài viết này sẽ viết ra những câu hỏi và gợi ý câu trả lời, không biết là có chính xác hay không nữa, vì người đánh giá và cho điểm câu trả lời câu hỏi là người khác, có thể đây là 1 dạng “tips and tricks” nhưng cũng có thể là những điều vớ vẫn nào đó, bạn chỉ có thể đọc và tham khảo, không nên đặt quá nhiều niềm tin vào nó nhé.:)
Ở VNG sẽ không có kiểu đưa ra 1 câu hỏi dạng đánh đố ứng viên, nhất là ở vị trí SE, tùy vào job detail mà bạn apply, ví dụ như vị trí Senior và SE ở đây. Các bạn nộp resume vào để thử sức và review vòng technical nhé.
Hôm nay có 1 bạn chia sẻ với mình 1 câu hỏi bạn ấy gặp khi phỏng vấn ở 1 công ty của Pháp, văn phòng tại HCM, theo mình thì nó là 1 dạng đánh đố, mặc dù nó không hề khó, nhất là lúc bạn có thời gian google hay suy nghĩ kỹ, tuy nhiên, trong lúc phỏng vấn, đây thực sự là vấn đề nếu bạn không thực sự “cứng”.
Câu hỏi: Không dùng vòng lặp (for, while), tạo được 1000 thư mục với prefix do bạn chỉ định?
Bạn mất bao nhiêu lâu để trả lời câu hỏi này? Đáp án ở cuối bài nhé!!!
Ngoài ra còn số câu hỏi có liên quan tới các kiến thức “thực sự rất cơ bản” mà bắt buộc bạn phải trả lời như sau:
Trình bày tổng quát về mô hình OSI, TCP/IP
Trình bày 1 số giao thức ở tầng 2/3
Trình bày 2 mode của FTP và điểm khác nhau
Ở mức độ cao hơn, câu hỏi sẽ tương tự như sau:
So sánh ưu khuyết điểm của nginx và haproxy khi làm 1 LB
Docker và các khái niệm liên quan
Database mysql, postgres, cassandra
Câu hỏi về IPTables
Ngoài ra còn 1 số câu hỏi khác như:
Giao thức Socket ở tầng mấy của mô hình OSI?
Một số lỗi bảo mật nghiêm trọng và cách xử lý
Trên đây là 1 số câu hỏi mà mình sưu tầm được và theo trí nhớ của mình sau những lần phỏng vấn rớt ở đây, mong các bạn đóng góp thêm nhưng câu hỏi và câu trả lời tại đây nhé.
Là dân system chắc là các bạn cũng đã từng nghe nhắc nhiều đến cụm từ “Configuration Management” hoăc cứ google là ra hàng tá bài viết liên quan.
Vâng! Configuration Management (CM) có thể hiểu là công cụ hỗ trợ, cấu hình, cài đặt hệ thống một cách tự động. Có rất nhiều công cụ như Ansible, Chef, Puppet, Saltstack … Loạt bài viết này sẽ không tập trung vào việc so sánh các công cụ CM mà chỉ hướng dẫn bạn cách cài đặt và sử dụng Ansible.
1. Ansible là cái gì?
Ansible có thể hiểu nôm na là công cụ dùng để quản lý cài đặt, cấu hình hệ thống một cách tập trung và cho phép thực thi câu lệnh điều khiển.
2. Ansible có những tính năng gì hay ho ?
+ Dự phòng tài nguyên (provisioning)
+ Quản lý cấu hình (configuration management)
+ Triển khai ứng dụng (app deployment)
+ Giao hàng liên tục (continous delivery)
+ Bảo mật và tuân thủ (security and compliance)
+ Điều phối (orchestration).
3. Đặc điểm của Ansible
+ Không cần cài đặt phần mềm lên các agent, chỉ cần cài đặt tại master.
+ Không service, daemon, chỉ thực thi khi được gọi
+ Cú pháp dễ đọc, dễ học, dễ hiểu
4. Ansible playbook thì sao?
Ansible playbook giúp chúng ta tổ chức công việc của mình theo nhiều cách. Trong hình thức trực tiếp nhất, chúng ta có thể làm việc với các module của Ansible sử dụng công cụ dòng lệnh “ansible” và file inventory.
4.1. Inventory
File inventory giúp Ansible biết các server mà nó cần kết nối sử dụng SSH, thông tin kết nối nó yêu cầu, và tùy chọn các biến gắn liền với các server này. File inventory có định dạng là INI. Trong file inventory, chúng ta có thể chỉ định nhiều hơn một máy chủ và gom chúng thành nhiều nhóm.
Ex: file inventory hosts.ini như sau
[webservers]
192.168.175.129
192.168.175.130
4.2 Task (nhiệm vụ)
Một khái niệm quan trọng khác là các task. Mỗi task của Ansible chứa một tên, một module để gọi, các tham số của module, và tùy chọn các điều kiện trước và sau. Chúng cho phép chúng ta gọi các module Ansible và truyền thông tin tới các task kế tiếp.
4.3 Vars (Các biến)
Biến hữu dụng cho việc tái sử dụng thông tin chúng ta cung cấp hoặc tập hợp. Chúng ta có thể định nghĩa biến trong các file inventory, các file YAML hoặc trong các playbook.
4.4 Playbook
Ansible playbook được viết bằng cú pháp YAML. Nó có thể chứa nhiều hơn một play. Mỗi play chứa tên của các nhóm máy chủ để kết nối tới và các nhiệm vụ nó cần thực hiện. Nó cũng có thể chứa các biến/các role/các handler, nếu đã định nghĩa.
Ex: cấu trúc của một playbook
– hosts: dbservers
gather_facts: no
vars:
who: World
tasks:
– name: say hello
debug: msg=”Hello {{ who }}”
– name: retrieve the uptime
command: uptime
Trong playbook trên, chúng ta đã nói rằng Ansible sẽ thao tác trên các server đã được định nghĩa trong nhóm máy chủ “dbservers”. Chúng ta đã tạo một biến gọi là “who” và sau đó chúng ta định nghĩa các nhiệm vụ của chúng ta. Chú ý rằng trong nhiệm vụ đầu tiên nơi chúng ta in ra một thông điệp debug, chúng ta đã sử dụng biến “who” và Ansible in “Hello World” ra màn hình. Trong nhiệm vụ thứ 2, chúng ta nói với Ansible kết nối tới mỗi máy chủ và sau đó thực thi lệnh “uptime”.
5. Hướng dẫn cài đặt và tổ chức một ansible playbook
5.1 Cài đặt.
Việc cài đặt ansible khá là đơn giản:
Trên CentOS:
$ yum install epel-release
$ yum install ansible Trên Ubuntu:
Cấu hình PPA, cài đặt:
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
Trên các phiên bản Ubuntu cũ, gói software-properties-common có tên khác là python-software-properties
5.2 Viết một playbook cho việc triển khai các dịch vụ
Ở đây mình đã có viết một playbook cho việc deploy các dịch vụ như nginx, mongodb, redis, postgresql.
Mô hình deploy:
+ node master ( 192.168.75.128): cài đặt ansible tool
+ node deploy services (192.168.75.129 & 192.168.75.130): các dịch vụ như nginx, mongodb, redis, postgresql sẽ được deploy trên 2 node này
Các bạn có thể tham khảo playbook qua link github sau:
Đang trong kỳ nghỉ lễ quốc khánh 2/9 chắc là các bạn cũng có những trải nghiệm thú vị cùng bạn bè hoặc gia đình, riêng mình thì kỳ nghĩ lễ này cũng ko có plan đi đây đi đó nên rảnh rổi sinh nông nổi, ngồi viết vài câu chuyện tản mạn chia sẻ cùng các bạn, gọi là cho đỡ tẻ nhạt bớt trong kỳ nghỉ lễ này :v. Tiếp nối những seri linh ta linh tinh trước đó về chuyện đời chuyện nghề của 1 system admin, hôm này mình tiếp tục cùng bàn luận về topic nho nhỏ ” làm thế nào để biết mình đang đi đúng con đường ” theo cách nghĩ khách quan của bản thân mình thôi nha các bạn :-).
Ngược dòng xa xôi chút về những năm cuối cấp 3, thời điểm mà ai ai cũng có những lựa chọn riêng về ngành nghề vs ước mơ sẽ theo đuổi, có người thì đã định hướng từ trước, có người thì cũng chả biết nên theo ngành nghề nào cứ tham khảo ý kiến ai đó, bạn bè or người quen rồi chọn trường theo, kiểu như mông lung như một trò đùa =)).
Chặng đường tiếp theo sau đó có lẽ là cánh cổng ĐH nơi bước đầu hiện thực hóa những hoài bảo, một chương mới trên con đường sự nghiệp được mở ra, ở đó thứ cho bạn có lẽ là những hành trang về nghề nghiệp để bước vào đời từ kiến thức chuyên môn của từng ngành nghề, kiến thức xã hội, mối quan hệ….
Sau khi có được tấm bằng ĐH (cử nhân, kỹ sư…) ai cũng đi tìm cho mình một công việc theo đúng chuyên môn được đào tạo, nhưng cuộc sống mà đâu phải lúc nào cũng theo ý ta, có bạn thì làm đúng chuyên môn, còn có bạn thì lại rẽ theo hướng khác. Nói về mình thì định hướng trước đó là làm về quản trị mạng, hệ thống nên sau khi tốt nghiệp ra trường cũng rán tìm một công việc có liên quan, nhưng những ngày đầu vì kiến thức, kỹ năng, kinh nghiệm làm việc ko nhiều nên cũng ít công ty nào để ý tới, thời điểm đó cũng rải CV như phát tờ rơi :v miễn là có một công việc để làm.
Sau những tháng ngày ròng rã tìm kiếm cv, chạy đi PV như là chạy show :v cũng chỉ tìm được ở những vị trí lèn tèn như Monitor, Vận hành hệ thống, thoạt nghe thì có chút dính líu tới chuyên môn nhưng vào làm thì chẳng có gì nhiều đâu các bạn, thao tác chính chủ yếu là các phím Crl + C + V =)), Snipping Tool, theo dõi mấy cái biểu đồ màu mè hoa lá hẹ, các dòng log error đỏ lòm, có bất thường gì thì la lên cho các sếp mà thời đó đúng nghĩ là kiếp cầm ca (làm theo ca đó các bạn =)) ), dĩ nhiên là công việc khá chán rồi nhưng cũng gọi là có công việc để kiếm cơm qua ngày là zui zui gồi.
Một khoảng thời gian sau đó mình tìm được 1 vị trí system theo đúng chuyên môn mình mong đợi, công việc trước đó khá chán nhưn bù lại là có chút time rảnh nên mình cũng tự đào sâu kiến thức qua những bài LAB, hỏi han các bậc tiền bối đi trước mới có cơ may tìm được cv phù hợp sau này. Những chặng đường sau đó và cho đến bây giờ thì mình đều đảm nhận vị trí là 1 system admin, công việc hiện tại vẫn cho mình những niềm vui & lợi ích nhất định, đặc biệt vẫn còn đam mê với nghề cho nên cũng gọi là đang đi đúng con đường mà mình lựa chọn trước đó mặc dù cũng đã trải qua những tháng này đen tối trong sự nghiệp :v, đó là điều hiển nhiên ai cũng đã từng trải qua.
Vậy thì câu hỏi “Làm thế nào để biết mình đang đi đúng con đường”, con đường ở đây là con đường sự nghiệp( con đường lớn) nói chung và trong nghê IT nói riêng(con đường nhỏ),không ai dám chắc là mình chỉ làm một công việc đó suốt đời, có thể nghề này rồi lại nghề khác(hoàn cảnh đẩy đưa :v) nhưng nếu xét ở một phạm vi nào đó trong những ngành nghề chúng ta đã từng làm thì cái gọi là “đúng con đường” có thể hiểu là ở giai đoạn đó, nghề đó, công việc đó mang lại cho bản thân ta những niềm vui, sự thành công nhất định, một sự hưng phấn, bầu nhiệt huyết và cả sự đam mê trong công việc . IT cũng không ngoại lệ, một khi trải qua những khoảng thời gian trước đó cho đến thời điểm hiện tại trong cái nghề mà bạn đã chọn, nó không mang lại nhiều thành công cho bạn, không tạo được cho bạn hứng thú trong khi làm việc hay nói cách khác là cảm giác chán việc chán nghề thì bạn có thể cân nhắc cho mình những hướng đi, ngã rẽ mới , biết đâu được bạn lại gặt hái được nhiều thành công hơn ở những con đường mới đó thì sao.
Hãy phá vỡ mọi giới hạn của bản thân, hiện thực hóa những ý tưởng đang tồn tại trong đầu bạn, biến điều không thể thành có thể. Chúc các bạn thành công!