<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[DevOps Zone]]></title><description><![CDATA[Smarter and Lazier]]></description><link>https://devopsz.com/</link><image><url>https://devopsz.com/favicon.png</url><title>DevOps Zone</title><link>https://devopsz.com/</link></image><generator>Ghost 2.1</generator><lastBuildDate>Wed, 18 Feb 2026 20:01:43 GMT</lastBuildDate><atom:link href="https://devopsz.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Locust - Performance Testing Tool (Phần 1)]]></title><description><![CDATA[<h2 id="performance-testing-l-g-">Performance Testing là gì?</h2><p><strong>Performance Testing</strong> là một loại kiểm thử nhằm xác định khả năng đáp ứng tối đa, các điểm tắc nghẽn của một hệ thống, từ đó đưa ra những điều chỉnh hợp lí để cải thiện hiệu suất của hệ thống. Trong bài viết này chúng</p>]]></description><link>https://devopsz.com/locustio/</link><guid isPermaLink="false">5b9f31440bcc9400017632ac</guid><dc:creator><![CDATA[Cuong Nguyen]]></dc:creator><pubDate>Thu, 02 Jan 2020 08:57:38 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/09/screenshot.png" medium="image"/><content:encoded><![CDATA[<h2 id="performance-testing-l-g-">Performance Testing là gì?</h2><img src="https://devopsz.com/content/images/2018/09/screenshot.png" alt="Locust - Performance Testing Tool (Phần 1)"><p><strong>Performance Testing</strong> là một loại kiểm thử nhằm xác định khả năng đáp ứng tối đa, các điểm tắc nghẽn của một hệ thống, từ đó đưa ra những điều chỉnh hợp lí để cải thiện hiệu suất của hệ thống. Trong bài viết này chúng tôi sẽ giới thiệu về Locust - một công cụ hỗ trợ cho load testing được viết bằng Python.</p><p>Mặc dù không được phổ biến như một số tool khác (như Jmeter, Gatling, ...) nhưng Locust cũng có nhiều tính năng khác thú vị rất phù hợp cho một số trường hợp.</p><h2 id="locust-l-g-">Locust là gì?</h2><p>Locust là một user load testing tool được viết bằng python, rất dễ sử dụng. Nó thường được dùng để load testing cho website, các hệ thống api, ... và để tìm ra số lượng người dùng đồng thời mà hệ thống có thể xử lí.</p><p>Ý tưởng của nó là dùng một nhóm các Locust để giả lập các requests tới website. Các hành vi của người dùng do chúng ta định nghĩa bằng python. Quá trình load testing được theo dõi real-time bằng UI.</p><p>Locust là event-based, do đó nó có thể hỗ trợ tạo ra hàng ngàn người dùng đồng thời trên một máy duy nhất. Trái ngược với nhiều ứng dụng event-base khác, nó không sứ dụng call-backs thay vào nó sử dụng light-weight processes, thông qua gevent.</p><p><strong>Ưu điểm:</strong></p><ul>
<li>Kịch bản test được viết bằng Python phù hợp cho các pro python (nhưng là nhược điểm cho người không thành thạo python), hơn nữa giúp dễ dàng quản lí kịch bản test với git</li>
<li>Dễ dàng setup môi trường phân tán, khả năng mở rộng tốt - hỗ trợ giả lập hàng trăm nghìn user</li>
<li>Có giao diện web, một số biểu đồ đơn giản để xem kết quả testing</li>
<li>Nhờ cơ chế event-based nên Locust dùng ít tài nguyên hơn một số tool khác (như Jmeter, Gatling). Có thể dễ dàng giả lập hàng nghìn user trên một laptop.</li>
<li>Và đặc biệt vì kịch bản được viết Python thay vì dùng giao diện như các tool khác nên chúng ta có thể Hackable nếu pro Python.</li>
</ul>
<p><strong>Nhược điểm:</strong></p><ul>
<li>Cần biết python.</li>
<li>Không có cơ chế recording như một số tool (Jmeter,Gatling...).</li>
<li>Phần thống kê báo cáo kết quả testing còn đơn giản.</li>
<li>Mặc định chỉ hỗ trợ giao thức http/https tuy nhiên chúng ta cũng có thể mở rộng ra các giao thức khác nhưng đòi hỏi cần nhiều kinh nghiệp lập trình Python</li>
</ul>
<p>Thao khảo thêm bài so sánh Locust với Jmeter:</p><p><a href="https://dzone.com/articles/jmeter-vs-locust-what-to-use-when">Jmeter vs locust what to use when</a></p>
<h2 id="c-i-t">Cài đặt </h2><pre><code>pip install locustio
locust --help
</code></pre>
<p><strong>Chú ý:</strong></p><p>Mỗi kết nối HTTP trên một máy sẽ mở một file mới (technically a file descriptor). Hệ điều hành có thể giới hạn số lượng file có thể mở. Nếu số lượng giới hạn này thấp hơn số lượng người dùng giả lập trong lúc test sẽ xảy ra lỗi. Vì thế chúng ta nên cấu hình lại số lượng giới hạn này (tùy thuộc vào từng hệ điều hành sẽ có các cách điều chỉnh khác nhau).</p><h2 id="s-d-ng-n-gi-n">Sử dụng đơn giản</h2><p>Tạo một file <em>locustfile.py</em><strong> </strong>đơn giản (các tham số chúng tôi sẽ giải thích sau)</p><pre><code class="language-python">from locust import HttpLocust, TaskSet

def login(l):
    l.client.post(&quot;/login&quot;, {&quot;username&quot;:&quot;ellen_key&quot;, &quot;password&quot;:&quot;education&quot;})

def index(l):
    l.client.get(&quot;/&quot;)

def profile(l):
    l.client.get(&quot;/profile&quot;)

class UserBehavior(TaskSet):
    tasks = {index: 2, profile: 1}

    def on_start(self):
        login(self)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000```</code></pre>
<p>hoặc sử dụng cách sau tương đương:</p><pre><code class="language-python">from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def on_start(self):
    &quot;&quot;&quot; on_start is called when a Locust start before any task is scheduled &quot;&quot;&quot;
        self.login()

    def login(self):
        self.client.post(&quot;/login&quot;, {&quot;username&quot;:&quot;ellen_key&quot;, &quot;password&quot;:&quot;education&quot;})

    @task(2)
    def index(self):
         self.client.get(&quot;/&quot;)
    @task(1)
    def profile(self):
        self.client.get(&quot;/profile&quot;)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000

</code></pre>
<p><strong>Start Locust</strong></p><p><code>locust --host=http://example.com</code></p>
<p>Nếu sử dụng tên file khác <em>locustfile.py</em> ta có thể sử dụng tham số -f</p><p><code>locust -f locust_files/my_locust_file.py --host=http://example.com</code></p>
<p>Ngay sau khi chạy script ta truy cập: <a href="http://127.0.0.1:8089">http://127.0.0.1:8089</a></p><p>Tại đây chúng ta sẽ xác định số lượng user giả lập, tiến hành chạy load testing và xem kết quả monitoring</p><p><strong>Hình minh họa:</strong></p><figure class="kg-card kg-image-card"><img src="https://lh3.googleusercontent.com/HMK586b0ZP_BNsoieqjQo1x2um5Z36AGiOWz5rhxSBUt1h0_pStnJUFXB5KGHeyx1a50yJ-Mll8BzA-LHAsWI-e-A_4Dw3hdR9CIoHbRPWtyv6cSE9zfRBZ8iCYughgV0wwn-UA5" class="kg-image" alt="Locust - Performance Testing Tool (Phần 1)"></figure><figure class="kg-card kg-image-card"><img src="https://lh6.googleusercontent.com/qz6Dpz9fwVctLFUD5M2AB95Jrtep6R5o_mOdi4-rvhzxYAnwoFSyPLvhSuuNuzb8hsArn7GK6iZzP603FxwDlxjo1riya4qDBCSZqUV7GBMRf-hkmzAeLnpfihIgQqKz5S9hyw9h" class="kg-image" alt="Locust - Performance Testing Tool (Phần 1)"></figure><p></p><p>Còn tiếp ...</p><p>Phần sau chúng tôi sẽ hướng dẫn cách viết kịch bản testing, mong các bạn tiếp tục theo dõi. </p><h2 id="tham-kh-o-">Tham khảo:</h2><p><a href="https://docs.locust.io/en/latest/quickstart.html">https://docs.locust.io/en/latest/quickstart.html</a><br><a href="https://www.blazemeter.com/blog/jmeter-vs-locust-which-one-should-you-choose">https://www.blazemeter.com/blog/jmeter-vs-locust-which-one-should-you-choose</a><br><a href="https://www.blazemeter.com/blog/locust-assertions-a-complete-user-manual">https://www.blazemeter.com/blog/locust-assertions-a-complete-user-manual</a></p>]]></content:encoded></item><item><title><![CDATA[Quản lí dữ liệu trong Docker]]></title><description><![CDATA[<p>Tiếp theo loại bài về Docker hôm nay chúng tôi sẽ trình bày các cách để quản lí data của container khi sử dụng Docker.</p><p>Mặc định tất cả các file được tạo bên trong container được lưu trữ trên một <strong>writable container layer</strong>. Nó có nhiều nhược điểm:</p><ul>
<li>Dữ</li></ul>]]></description><link>https://devopsz.com/manage-data-in-docker/</link><guid isPermaLink="false">5c0b53fb0755c20001ade571</guid><category><![CDATA[Ops]]></category><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Cuong Nguyen]]></dc:creator><pubDate>Tue, 11 Dec 2018 02:32:04 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/12/i.png" medium="image"/><content:encoded><![CDATA[<img src="https://devopsz.com/content/images/2018/12/i.png" alt="Quản lí dữ liệu trong Docker"><p>Tiếp theo loại bài về Docker hôm nay chúng tôi sẽ trình bày các cách để quản lí data của container khi sử dụng Docker.</p><p>Mặc định tất cả các file được tạo bên trong container được lưu trữ trên một <strong>writable container layer</strong>. Nó có nhiều nhược điểm:</p><ul>
<li>Dữ liệu sẽ mất khi container đó bị xóa, khó có thể truy xuất dữ liệu nếu một container khác hoặc process khác cần dữ liệu này.</li>
<li>Container layer được gắn chặt với máy host khi mà container running. Khi đó chúng ta không dễ để chuyển dữ liệu được lưu trên container layer tới chỗ khác.</li>
<li>Ghi dữ liệu trên container layer cần phải đi qua 1 lớp storage driver =&gt; giảm hiệu năng ghi dữ liệu so với data volume (ghi trực tiếp lên host filesystem).</li>
</ul>
<p>Docker hỗ trợ 3 cách để lưu trữ dữ liệu của Docker container là: <strong>volume</strong>, <strong>bind mount</strong> và<strong> tmpfs volume</strong> (Docker on Linux). Volume thường là lựa chọn tốt nhất.</p><figure class="kg-card kg-image-card"><img src="https://lh5.googleusercontent.com/bfIG2k5NFBM55atSf9EhNOG3ZpPL1wBUQcjTTlt7JWpNeVpQySu9ba28cW9Ymz04Jf-2wIQPEZXgfsxYZ7SxUBqJhpOqdg2eH42OpptfFB69hH_2tp-UfE2Captm_YZajsCdp0xm" class="kg-image" alt="Quản lí dữ liệu trong Docker"><figcaption>(nguồn docker.com)</figcaption></figure><ul>
<li>Dữ liệu trên <strong>volume</strong> được lưu trên filesystem của Docker host (<code>/var/lib/docker/volumes/</code>) và được quản lý bởi Docker deamon. Các process không liên quan đến Docker sẽ không sử dụng đến phần dữ liệu này. Volumes là cách lưu trữ dữ liệu tốt nhất trên Docker.</li>
<li><strong>Bind mount</strong> có thể được lưu ở bất cứ đâu trên máy host. Các process không liên quan đến Docker hoặc một container khác có thể chỉnh sửa các file này bất kỳ lúc nào.</li>
<li><strong>Tmpfs</strong> mount được lưu trên bộ nhớ (RAM) của máy host và không ghi lên trên host filesystem (không ghi lên disk).</li>
</ul>
<h2 id="docker-storage">Docker Storage</h2><h3 id="volume">Volume</h3><p>Được khởi tạo và quản lý bởi Docker. Chúng ta có thể khởi tạo một volume bằng cách sử dụng lệnh <code>docker volume create</code> hoặc tạo volume khi khởi tạo một  container/service.</p><p>Khi chúng ta khởi tạo một volume, volume này sẽ nằm trong một thư mục xác định  trên Docker host. Khi chúng ta mount volume này lên container tức là chúng ta mount thư mục đó vào container. Cách thức hoạt động của volume tương tự như bind mount, ngoại trừ việc volume được quản lý bởi Docker và được tách biệt (isolate) với các thành phần khác của máy host.</p><p>Một volume có thể được mount lên nhiều container cùng một lúc. Khi không có container nào sử dụng volume đó, volume này vẫn tồn tại và được quản lý bởi Docker mà không bị xóa đi như container layer. Chúng ta có thể xóa <strong>tất cả</strong> các volume không sử dụng bằng cách dùng lệnh <strong>docker volume prune</strong>.</p><p>Chúng ta có thể đặt tên cho một volume, nếu chúng ta không đặt tên thì Docker sẽ tự động đặt tên cho volume đó và tên này là duy nhất trên một Docker host.</p><p>Volume trên Docker hỗ trợ dùng nhiều loại volume drivers, cho phép lưu trữ dữ liệu trên remote host hoặc trên hạ tầng lưu trữ của các nhà cung cấp dịch vụ cloud.</p><p><strong>Khi nào nên dùng volume</strong></p><p>Volume là cách thường được dùng khi cần lưu trữ dữ liệu lâu dài trong container và services. Một số ứng dụng của volumes gồm:</p><ul>
<li>Chia sẻ dữ liệu giữa nhiều container đang chạy cùng lúc. Nhiều container có thể đồng thời mount cùng 1 volume. (read-write hoặc read only). Volume không tự động xóa đi, chúng ta cần phải gõ lệnh nếu muốn xóa volume.</li>
<li>Khi chúng ta muốn lưu trữ dữ liệu của container trên remote host hoặc trên cloud provider (AWS, GCE, Azure…).</li>
<li>Hoạt động được trên cả Linux và Windows container.</li>
<li>Dữ liệu được lưu trên volume sẽ không làm tăng kích thước của container.</li>
<li>Khi chúng ta cần backup, phục hồi hoặc di chuyển dữ liệu từ một Docker host này sang một host khác, volume là sự lựa chọn lý tưởng trong những trường hợp này. Ta có thể tạm dừng một container, backup volume của container này (thường nằm trong <code>/var/lib/docker/volumes/</code>)</li>
</ul>
<h3 id="bind-mounts">Bind mounts</h3><p>Có từ thời xửa thời xưa khi Docker mới ra đời. So với volume thì bind mount có ít chức năng hơn. Khi chúng ta dùng bind mount, chúng ta có thể mount 1 file hoặc một thư mục vào container. File hoặc thư mục này được truy cập theo đường dẫn tuyệt đối trên máy host. Bind mount có hiệu năng truy xuất rất cao, nhưng phụ thuộc vào file system của máy host.</p><p><strong>Chú ý:</strong> khi dùng bind mount, các process trong container có thể thay đổi filesystem của máy host (tạo file, thêm xóa sửa các dữ liệu hoặc thư mục quan trọng của hệ thống). Tính năng này tuy mạnh nhưng có thể tạo ra nhiều nguy cơ về bảo mật, gây ảnh hưởng tới các process khác trên máy host.</p><p><strong>Khi nào nên dùng bind mount</strong></p><ul>
<li>Chia sẻ các file cấu hình từ máy host sang container. Ví dụ: bind mount file <code>/etc/resolv.conf</code> từ máy host lên mỗi container.</li>
<li>Chia sẻ source code từ Docker host sang container.</li>
<li>Khi file container cần file và thư mục phải đồng bộ với Docker host.</li>
</ul>
<h3 id="tmpfs-mounts">tmpfs mounts</h3><p>tmpfs mount không được lưu trên đĩa cứng. tmpfs mount thường được dùng để lưu dữ liệu khi container đang chạy (dữ liệu này không cần được lưu trữ lâu dài).</p><p><strong>Khi nào nên dùng tmpfs mount</strong></p><p>tmpfs mount được dùng khi chúng ta không muốn lưu dữ liệu lâu dài trên cả máy host hoặc trong container vì lý do an ninh. Hoặc do chúng ta muốn đảm bảo hiệu năng của container khi cần xử lý một lượng lớn dữ liệu tạm thời</p><h3 id="m-t-s-ch-khi-d-ng-bind-mount-ho-c-volume">Một số chú ý khi dùng bind mount hoặc volume</h3><p>Khi dùng bind mount hoặc volume thì cần chú ý những điều sau:</p><ul>
<li>Nếu chúng ta mount một volume trống từ host lên container, và trong thư mục tương ứng trên container đã có sẵn dữ liệu thì các file trên đó sẽ được copy vào volume. Tương tự vậy, nếu chúng ta khởi động một container và yêu cầu một volume (volume này chưa tồn tại), Docker engine sẽ tạo ra một volume trống cho ta.</li>
<li>Nếu chúng ta mount một bind mount hoặc một volume đã có dữ liệu vào một thư mục trên container và thư mục này cũng đã có dữ liệu, dữ liệu trên container sẽ bị “tạm thời thay thế” bởi dữ liệu mới mount. Khi chúng ta unmount thì dữ liệu này sẽ hiện ra như cũ.</li>
<li>Khi chúng ta dùng cờ <code>-v</code> hoặc <code>--volume</code> để bind-mount một file hay thư mục chưa tồn tại trên Docker host thì Docker sẽ tạo ra một thư mục mới.</li>
<li>Nếu chúng ta dùng cờ <code>--mount</code> để bind-mount một file hay thư mục chưa tồn tại trên Docker host thì Docker không tự động tạo thư mục mới mà sẽ thông báo lỗi.</li>
</ul>
<h2 id="v-d-v-s-d-ng-docker-storage">Ví dụ về sử dụng docker storage </h2><p>Gỉa sử chúng ta cần develop một ứng dụng wordpress bao gồm 2 container: </p><ul>
<li><strong>wordpress</strong>: chứa mã nguồn và chạy ứng dụng wordpress</li>
<li><strong>mariadb</strong>: chạy ứng dụng mariadb database (giống với mysql database)</li>
</ul>
<p>Khi đó chúng ta sẽ sử dụng bind mount mã nguồn của wordpress vào container wordpress, sử dụng volume để persist data của mariadb database. Sử dụng với docker compose ta có thể xem file <code>docker-compose.yml</code> sau. (các bạn có thể xem chi tiết file docker-compose.yml và cấu trúc thư mục tại đây: <a href="https://github.com/cuongtransc/docker-training/tree/master/compose/wordpress">https://github.com/cuongtransc/docker-training/tree/master/compose/wordpress</a>)</p><pre><code class="language-yaml">services:
    wordpress:
        image: cuongtransc/wordpress:4.8
        ports:
            - &quot;80:80&quot;
        networks:
            - back
        volumes:
            - ./wordpress-data/:/var/www/html/ 

    mariadb:
        image: mariadb:10.1
        networks:
            - back
        volumes:
            - mariadb-data:/var/lib/mysql/

networks:
    back:
    
volumes:
    - mariadb-data
</code></pre>
<p>Với cách làm như trên, khi chúng ta sửa source code của wordpress trên máy host của chúng ta thì source code wordpress trong container cũng được thay đổi theo mà không cần build lại image. Còn với mariadb dữ liệu cũng được persistent và được Docker đảm bảo an toàn, không cho tiến trình khác có thể sửa đổi.</p><h3 id="tham-kh-o-">Tham khảo:</h3><p><a href="https://docs.docker.com/storage/">https://docs.docker.com/storage/</a></p><p><a href="https://cloudcraft.info/nhap-mon-docker-phan-2-gioi-thieu-cac-kieu-luu-tru-du-lieu-tren-docker/">https://cloudcraft.info/nhap-mon-docker-phan-2-gioi-thieu-cac-kieu-luu-tru-du-lieu-tren-docker/</a></p>]]></content:encoded></item><item><title><![CDATA[Docker 101 (Phần 4)]]></title><description><![CDATA[1. Các trường hợp sử dụng Docker
2. Các ví dụ thực tế
3. Docker Mindmap]]></description><link>https://devopsz.com/docker-101-part-4/</link><guid isPermaLink="false">5bbf9421d909b300012874f1</guid><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Cuong Tran]]></dc:creator><pubDate>Thu, 11 Oct 2018 18:37:58 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/10/17-docker-user-cases-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://devopsz.com/content/images/2018/10/17-docker-user-cases-1.png" alt="Docker 101 (Phần 4)"><p><a href="https://devopsz.com/docker-101-part-1/">Phần 1: Docker là gì?</a></p><p><a href="https://devopsz.com/docker-101-part-2/">Phần 2: Ai sẽ dùng Docker?</a></p><p><a href="https://devopsz.com/docker-101-part-3/">Phần 3: Làm việc với Docker thế nào?</a></p><p><a href="https://devopsz.com/docker-101-part-4/">Phần 4: Có thể dùng Docker trong các trường hợp nào?</a></p><h3 id="4-1-c-c-tr-ng-h-p-d-ng-docker">4.1 Các trường hợp dùng Docker</h3><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/17-docker-user-cases.png" class="kg-image" alt="Docker 101 (Phần 4)"><figcaption><em>Các trường hợp dùng Docker (use cases)</em></figcaption></figure><p><strong>Docker có thể dùng trong các trường hợp:</strong></p>
<ul>
<li>Hiện đại hóa các ứng dụng truyền thống.</li>
<li>Microservices.</li>
<li>DevOps (CI/CD).</li>
<li>Tối ưu hóa hạ tầng tính toán.</li>
<li>Hybrid Cloud.</li>
<li>Dev Labs, tạo môi trường thử nghiệm cho Dev.</li>
</ul>
<h3 id="4-2-c-c-v-d-th-c-t-">4.2 Các ví dụ thực tế</h3><p>Một số công ty đã  áp dụng Docker vào hệ thống thực.</p>
<ul>
<li>Shopify: chỉ cần 2 phút để triển khai ứng dụng monolithic của Shopify (bao gồm website bán hàng, quản lí khách hàng, ứng dụng Facebook, email marketing...)</li>
<li>Baidu: sử dụng Docker để thay thế OpenStack cho hệ thống PaaS.</li>
<li>eBay: sử dụng Docker để đơn giản hóa việc deploy ứng dụng.</li>
<li>Uber: giảm thời gian triển khai từ vài tuần xuống còn vài phút.</li>
<li>BBC New: giảm thời gian 30 phút triển khai cho 500 developer.</li>
</ul>
<h2 id="5-docker-mindmap">5. Docker Mindmap</h2><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/18-docker-mindmap.png" class="kg-image" alt="Docker 101 (Phần 4)"><figcaption>Docker Mindmap&nbsp;</figcaption></figure><h3 id="t-i-li-u-tham-kh-o">Tài liệu tham khảo</h3><ol>
<li>
<p><strong>Docker helped turbocharge Uber deployment</strong>. <a href="http://thenewstack.io/docker-helped-turbocharge-ubers-deployments/">http://thenewstack.io/docker-helped-turbocharge-ubers-deployments/</a></p>
</li>
<li>
<p>Cuong Tran. <strong>Docker Training</strong>. <a href="https://github.com/cuongtransc/docker-training">https://github.com/cuongtransc/docker-training</a></p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Docker 101 (Phần 3)]]></title><description><![CDATA[1. Kiến trúc của Docker
2. Một số câu lệnh cơ bản của Docker
3. Docker Container
4. Docker Image]]></description><link>https://devopsz.com/docker-101-part-3/</link><guid isPermaLink="false">5bbf8783d909b300012874ee</guid><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Cuong Tran]]></dc:creator><pubDate>Thu, 11 Oct 2018 17:50:52 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/10/13-architecture-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://devopsz.com/content/images/2018/10/13-architecture-1.png" alt="Docker 101 (Phần 3)"><p><a href="https://devopsz.com/docker-101-part-1/">Phần 1: Docker là gì?</a></p><p><a href="https://devopsz.com/docker-101-part-2/">Phần 2: Ai sẽ dùng Docker?</a></p><p><a href="https://devopsz.com/docker-101-part-3/">Phần 3: Làm việc với Docker thế nào?</a></p><p><a href="https://devopsz.com/docker-101-part-4/">Phần 4: Có thể dùng Docker trong các trường hợp nào?</a></p><h3 id="3-1-ki-n-tr-c-c-a-docker">3.1 Kiến trúc của Docker</h3><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/13-architecture.png" class="kg-image" alt="Docker 101 (Phần 3)"><figcaption><i>Kiến trúc của Docker (Nguồn: docker.com)</i></figcaption></figure><p>Docker là có kiến trúc Client-Server, gồm:</p><ul><li><strong>Docker Daemon</strong>: chạy ở trên host, đóng vai trò server, nhận các RESTful requests từ Docker Client và thực thi.</li><li><strong>Docker CLI</strong>: có vai trò là client, cung cấp giao diện tương tác với người dùng (command line) và gửi các RESTful requests tương ứng đến Docker Daemon.</li><li><strong>Docker Registry</strong>: private hay public registry, là nơi lưu trữ và chia sẻ các Docker Image.</li></ul><p><strong>Docker Daemon</strong> (còn gọi là <strong>Docker Engine</strong>) là một lightweight runtime giúp build, run và quản lí các containers và các thành phần liên quan.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/14-docker-components.png" class="kg-image" alt="Docker 101 (Phần 3)"><figcaption><em>Các đối tượng quản lí của Docker Engine (Nguồn: Internet)</em></figcaption></figure><p><strong>Docker Engine</strong> quản lí 4 đối tượng chính. Tất cả các đối tượng đều có tên và ID.</p><ul><li><strong>Image</strong>: là read-only template dùng để tạo containers. Được cấu tạo theo dạng layers, và tất cả các layers là read-only. Có thể tạo Docker Image bằng cách buid từ Dockerfile hoặc commit từ Docker Container.</li><li><strong>Container</strong>: là một runnable instance của một Docker Image. Khi chạy một container từ một Image, sẽ có một wriable layer được tạo ra và tất cả các thay đổi về dữ liệu sẽ diễn ra ở layer này. Lúc này, có thể sử dụng lệnh commit một container để tạo ra một image mới.</li><li><strong>Network</strong>: cung cấp private network (VLAN) để các container trên một host có thể liên lạc được với nhau, hoặc các container trên nhiều hosts có thể liên lạc được với nhau (multi-host networking).</li><li><strong>Volume</strong>: dùng để lưu trữ các dữ liệu độc lập với vòng đời của container và giúp cho các containers có thể chia sẻ dữ liệu với nhau và với host.</li></ul><p>Sơ đồ minh họa các lệnh phổ biến của Docker Client và mối quan hệ của 4 đối tượng trên.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/15-docker-component-interaction.png" class="kg-image" alt="Docker 101 (Phần 3)"><figcaption>Mối quan hệ của Docker Image, Container, Network, Volume (Nguồn: Luis Herrera Benítez)</figcaption></figure><h3 id="3-2-m-t-s-c-u-l-nh-c-b-n-c-a-docker">3.2 Một số câu lệnh cơ bản của Docker</h3><table>
<thead>
<tr>
<th>Nhóm câu lệnh</th>
<th>Câu lệnh</th>
<th>Câu lệnh</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Image</strong></td>
<td><code>docker image pull &lt;image_name&gt;</code></td>
<td>Pull một image từ Docker Hub</td>
</tr>
<tr>
<td></td>
<td><code>docker image ls</code></td>
<td>Liệt kê các images hiện có</td>
</tr>
<tr>
<td></td>
<td><code>docker image rm &lt;image_name&gt;</code></td>
<td>Xóa một image</td>
</tr>
<tr>
<td></td>
<td><code>docker image build -t &lt;image_name&gt; .</code></td>
<td>Build một image từ Dockerfile</td>
</tr>
<tr>
<td></td>
<td><code>docker image history &lt;image_name&gt;</code></td>
<td>Xem lịch sử build của một image</td>
</tr>
<tr>
<td><strong>Container</strong></td>
<td><code>docker container run &lt;image_name&gt;</code></td>
<td>Tạo một container</td>
</tr>
<tr>
<td></td>
<td><code>docker container start &lt;container_name&gt;</code></td>
<td>Start một container</td>
</tr>
<tr>
<td></td>
<td><code>docker container stop &lt;container_name&gt;</code></td>
<td>Stop một container</td>
</tr>
<tr>
<td></td>
<td><code>docker container rm &lt;container_name&gt;</code></td>
<td>Xóa một container</td>
</tr>
<tr>
<td></td>
<td><code>docker container ps</code></td>
<td>Liệt kê các container đang chạy</td>
</tr>
<tr>
<td></td>
<td><code>docker container diff &lt;container_name&gt;</code></td>
<td>Xem các thay đổi trên container</td>
</tr>
</tbody>
</table>
<h3 id="3-3-docker-container">3.3 Docker Container</h3><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/16-docker-container-lifecycle.png" class="kg-image" alt="Docker 101 (Phần 3)"><figcaption><em>Vòng đời của Container (Nguồn:Internet)</em></figcaption></figure><p>Docker Container có đặc điểm là chóng tàn (<strong>emphemeral</strong>), nghĩa có thể khởi tạo nhanh và cũng có thể xóa nhanh. Không nên lưu dữ liệu trong container. Nếu cần lưu thì nên sử dụng <a href="https://docs.docker.com/storage/volumes/">Volume</a>.</p><p>Docker Container sử dụng cơ chế <strong>process-based</strong>. Người dùng có thể tạo Docker Container bằng: </p><ul>
<li><code>docker run &lt;image_name&gt; &lt;command&gt;</code></li>
<li><code>docker run &lt;image_name&gt;</code></li>
</ul>
<p>Khi thực hiện một trong hai cách trên, một Docker Container sẽ được tạo và thực thi <strong>câu lệnh truyền vào</strong> hoặc <strong>câu lệnh mặc định</strong> đã được định nghĩa trong Docker Image. Câu lệnh này sẽ sinh process có <code>pid = 1</code>.</p>
<p>Nếu process này kết thúc thì Docker Container kết thúc. Khi đó, tất cả các process con của <code>pid = 1</code> sẽ bị kill.</p>
<p><strong>Vấn đề được đặt ra:</strong> Làm sao để start, stop application trong container đúng cách?</p>
<h3></h3><h3 id="33dockerimage">3.3 Docker Image</h3>
<p>Để có thể chạy ứng dụng với Docker, bước đầu tiên cần làm là đóng gói ứng dụng vào Docker Image.</p>
<p>Ở đây, có một số điểm cần lưu ý, ví dụ như cần đóng gói ứng dụng như thế nào để ứng dụng có thể start, stop đúng cách.</p>
<p><strong>Sử dụng entrypoint để quản lí việc start, stop application:</strong><br>
Một kịch bản được sử dụng khi build Docker Image là: sử dụng <code>entrypoint</code> để thực hiện các thao tác để chuẩn bị các điều kiện, start, stop application đúng cách.</p>
<p>Cụ thể, nhiệm vụ của entrypoint là:</p>
<ol>
<li>Chuẩn bị các điều kiện môi trường để start application đúng cách.</li>
<li>Start application.</li>
<li>Thực hiện các thao tác để stop application đúng cách.</li>
</ol>
<p>Sử dụng shell để làm <code>entrypoint</code>: nhận và xử lí các command được truyền vào khi chạy Docker Container.</p>
<ol>
<li>Sử dụng <code>python jinja2</code> để sinh ra các file cấu hình từ template. <code>File cấu hình = jinja2(file cấu hình, tham số truyền vào bằng biến ENV)</code></li>
<li>Copy file cấu hình bằng lệnh <code>cp</code>.</li>
<li>Thực hiện các lệnh để khởi tạo ứng dụng, <code>chown</code> quyền các file cần thiết. Đảm bảo ứng dụng có thể start được.</li>
<li>Chạy ứng dụng.</li>
<li>Để ứng dụng <code>handle SIGTERM</code> hoặc sử dụng shell script để handle SIGTERM. Đảm bảo tắt ứng dụng đúng cách.</li>
</ol>
<p>(Còn tiếp ...)</p><h3 id="t-i-li-u-tham-kh-o">Tài liệu tham khảo</h3><ol>
<li>Luis Herrera Benítez, Docker Captain and AWS Ambassador. <strong>Exploring Docker</strong>. <a href="https://medium.com/@lherrera/mapping-docker-d003aa9017c1">https://medium.com/@lherrera/mapping-docker-d003aa9017c1</a></li>
<li><strong>Hệ sinh thái Docker</strong>. <a href="https://kipalog.com/posts/He-sinh-thai-Docker">https://kipalog.com/posts/He-sinh-thai-Docker</a></li>
<li>Nguyễn Sỹ Thanh Sơn. <strong><a href="https://docs.google.com/presentation/d/1SKJL-_AR75BbE3KLvmY9arYcwcvDXrOD47s_P3ZPaOU/edit">Docker - Hướng tiếp cận mới của xu thế DevOps</a></strong>, SFD 2016.</li>
<li>Cuong Tran. <strong>Docker Image Template</strong>. <a href="https://github.com/cuongtransc/docker-image-tmpl">https://github.com/cuongtransc/docker-image-tmpl</a></li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Docker 101 (Phần 2)]]></title><description><![CDATA[1. Docker cho lập trình viên (Dev)
2. Docker cho quản trị viên (Ops)
3. Dev và Ops quan tâm gì khi làm việc với Docker?]]></description><link>https://devopsz.com/docker-101-part-2/</link><guid isPermaLink="false">5bbf7923d909b300012874eb</guid><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Cuong Tran]]></dc:creator><pubDate>Thu, 11 Oct 2018 17:17:35 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/10/11-container-structure-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://devopsz.com/content/images/2018/10/11-container-structure-1.png" alt="Docker 101 (Phần 2)"><p><a href="https://devopsz.com/docker-101-part-1/">Phần 1: Docker là gì?</a></p><p><a href="https://devopsz.com/docker-101-part-2/">Phần 2: Ai sẽ dùng Docker?</a></p><p><a href="https://devopsz.com/docker-101-part-3/">Phần 3: Làm việc với Docker thế nào?</a></p><p><a href="https://devopsz.com/docker-101-part-4/">Phần 4: Có thể dùng Docker trong các trường hợp nào?</a></p><h3 id="2-1-docker-cho-l-p-tr-nh-vi-n-dev-">2.1 Docker cho lập trình viên (Dev)</h3><p>Với lập trình viên, Docker mang lại những giá trị sau:</p><ul><li><strong>Tính đóng gói</strong> (encapsulation): không lo lắng về việc thiếu thư viện phụ thuộc, thông tin cấu hình (config) khi triển khai một ứng dụng. Build một lần và chạy mọi nơi.</li><li><strong>Tính cô lập</strong> (isolation): tránh được xung đột khi chạy nhiều ứng dụng trên cùng một máy.</li><li><strong>Tính di động</strong> (portable): có thể dễ dàng chạy ứng dụng trên nhiều máy khác nhau. Không cần cài đặt lại.</li><li><strong>Có thể kịch bản hóa</strong> (script) hóa các công việc như kiểm thử tự động (automation testing), tích hợp (integration), đóng gói (packaging).</li><li><strong>Nhỏ gọn, chạy nhanh và ít tốn kém</strong> (overhead) hơn rất nhiều so với máy ảo (Virtual Machine).</li></ul><h3 id="2-2-docker-cho-qu-n-tr-vi-n-ops-">2.2 Docker cho quản trị viên (Ops)</h3><p>Với Ops, Docker mang lại những giá trị sau:</p><ul><li>Giúp cho việc quản lí toàn bộ vòng đời (lifecycle) của ứng dụng <strong>hiệu quả, nhất quán và có thể lặp lại</strong></li><li><strong>Tăng chất lượng code</strong>.</li><li><strong>Loại bỏ xung đột</strong> giữa các môi trường phát triển, thử nghiệm và môi trường thực (production).</li><li>Cải thiện đáng kể về tốc độ và độ tin cậy của hệ thống tích hợp liên tục và triển khai liên tục (<strong>CI/CD System</strong>)</li><li><strong>Tiết kiệm chi phí</strong> về thời gian, tài nguyên.</li></ul><h3 id="2-3-dev-v-ops-quan-t-m-g-khi-l-m-vi-c-v-i-docker">2.3 Dev và Ops quan tâm gì khi làm việc với Docker?</h3><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/11-container-structure.png" class="kg-image" alt="Docker 101 (Phần 2)"><figcaption><em>Cấu tạo của container trong giao vận (Nguồn: Internet)</em></figcaption></figure><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/12-dev-ops-care.png" class="kg-image" alt="Docker 101 (Phần 2)"><figcaption>Những vấn đề Dev và Ops quan tâm khi làm việc với Docker</figcaption></figure><p>(Còn tiếp ...)</p><h3 id="t-i-li-u-tham-kh-o">Tài liệu tham khảo</h3><p>Nguyễn Sỹ Thanh Sơn. <strong><a href="https://docs.google.com/presentation/d/1SKJL-_AR75BbE3KLvmY9arYcwcvDXrOD47s_P3ZPaOU/edit">Docker - Hướng tiếp cận mới của xu thế DevOps</a></strong>, SFD 2016.</p>
]]></content:encoded></item><item><title><![CDATA[DevOps Technologies]]></title><description><![CDATA[<p>DevOps là một văn hóa làm việc đề cao sự hợp tác, kéo hai giai đoạn phát triển (development) và vận hành (operations) xích lại gần nhau hơn. Khái niệm DevOps ra đời nhằm tối ưu hóa chu trình phát triển phần mềm, giúp sản phẩm IT được release nhanh</p>]]></description><link>https://devopsz.com/devops-technologies/</link><guid isPermaLink="false">5bb388b9d909b300012874e5</guid><category><![CDATA[Dev]]></category><dc:creator><![CDATA[Cuong Nguyen]]></dc:creator><pubDate>Tue, 02 Oct 2018 15:46:04 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/10/1-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://devopsz.com/content/images/2018/10/1-1.png" alt="DevOps Technologies"><p>DevOps là một văn hóa làm việc đề cao sự hợp tác, kéo hai giai đoạn phát triển (development) và vận hành (operations) xích lại gần nhau hơn. Khái niệm DevOps ra đời nhằm tối ưu hóa chu trình phát triển phần mềm, giúp sản phẩm IT được release nhanh và thường xuyên hơn. </p><p>Để giúp các bạn mới bắt đầu làm quen với DevOps có cái nhìn tổng quan và dễ tiếp cận hơn, chúng tôi đã tổng hợp các Technologies được sử dụng phổ biến trong DevOps. (Click vào link mindmap để xem rõ hơn)</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/10/1.png" class="kg-image" alt="DevOps Technologies"></figure><p>Link mindmap: <a href="https://www.mindmeister.com/1118050770">https://www.mindmeister.com/1118050770#</a></p><p>P/S:  Nếu bạn nào biết thêm công nghệ nào hay, hữu ích thì hãy chia sẻ với mọi người ở dưới phần bình luận nhé!</p>]]></content:encoded></item><item><title><![CDATA[Monitoring System (Phần 2)]]></title><description><![CDATA[<p>Ở <a href="https://devopsz.com/monitoring-system-part-1/">phần 1</a>, chúng ta đã cùng tìm hiểu về tổng quan một hệ thống monitoring và các thành phần của TIG Stack - một stack monitoring phổ biến. Phần này chúng ta sẽ tìm hiểu cách deploy TIG Stack bằng Docker.</p><h2 id="tig-stack-docker">TIG stack Docker</h2><p>Sử dụng Docker sẽ giúp</p>]]></description><link>https://devopsz.com/monitoring-system-part-2/</link><guid isPermaLink="false">5b8b693a0bcc9400017632a0</guid><category><![CDATA[Ops]]></category><dc:creator><![CDATA[Cuong Nguyen]]></dc:creator><pubDate>Tue, 04 Sep 2018 11:54:25 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/09/Grafana---Telegraf-metrics--2--1.png" medium="image"/><content:encoded><![CDATA[<img src="https://devopsz.com/content/images/2018/09/Grafana---Telegraf-metrics--2--1.png" alt="Monitoring System (Phần 2)"><p>Ở <a href="https://devopsz.com/monitoring-system-part-1/">phần 1</a>, chúng ta đã cùng tìm hiểu về tổng quan một hệ thống monitoring và các thành phần của TIG Stack - một stack monitoring phổ biến. Phần này chúng ta sẽ tìm hiểu cách deploy TIG Stack bằng Docker.</p><h2 id="tig-stack-docker">TIG stack Docker</h2><p>Sử dụng Docker sẽ giúp chúng ta deploy TIG stack một cách dễ dàng và nhanh chóng, nhưng sẽ có một vài điểm cần lưu ý.</p><p>Trong thực tế hầu hết các trường hợp chúng ta thường monitor một cluster hơn là một máy đơn, vì thế bài viết này sẽ hướng dẫn deploy lên một cluster được quản lí bởi <a href="https://docs.docker.com/engine/swarm/">Docker Swarm</a>.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/09/TIG-Stack.png" class="kg-image" alt="Monitoring System (Phần 2)"><figcaption>TIG with docker swarm</figcaption></figure><p>Với Swarm cluster, <strong>InfluxDB</strong> và <strong>Grafana</strong> sẽ được cài trên cùng một node để tối ưu việc query, <strong>Telegraf</strong> sẽ được deploy với mode là global.</p><h3 id="telegraf">Telegraf</h3><p>Mặc định khi chạy Telegraf bằng container nó chỉ collect metrics của container đó, để có thể collect data của host chúng ta cần mount một số file từ host vào và thay đổi một số config.</p><ul><li>Chúng ta cần mount các file sau (chú ý mode là ro): </li></ul><pre><code>- /var/run/docker.sock:/var/run/docker.sock:ro # collect docker metrics
- /sys:/rootfs/sys:ro
- /proc:/rootfs/proc:ro
- /etc:/rootfs/etc:ro</code></pre><ul><li>Mặc định khi gửi metric đến database, Telegraf sẽ gửi kèm hostname (hostname của container). Vì thế chúng ta nên thay đổi config hostname trong file config của Telegraf hoặc đặt tên hostname của container cho phù hợp.</li><li>Để collect thông tin của các docker containers chạy trên host chúng ta cần uncomment phần <code>[[inputs.docker]]</code> trong file config, và mout file <code>/var/run/docker.sock</code> của host</li><li>Trong trường hợp muốn collect dữ liệu file log của một ứng dụng chạy trên host (có thể là container) chúng ta cần mount các file log vào trong Telegraf container và sử dụng plugin logparser để collect log. Tham khảo thêm: <a href="https://github.com/influxdata/telegraf/tree/release-1.5/plugins/inputs/logparser">https://github.com/influxdata/telegraf/tree/release-1.5/plugins/inputs/logparser</a></li><li>Trường hợp muốn collect các metrics của các services như mongo, rabbitmq (chạy trong container), chúng ta cần container của Telegraf có thể kết nối với các container của các services kia. Để giải quyết vấn để này chúng ta có thể làm theo 2 cách sau:<br><strong>Cách 1:</strong> Tạo external docker network và sử dụng cho tất cả các container<br><strong>Cách 2:</strong> Mapping port của services ra bên ngoài và Telegraf có thể sử dụng ip của host hoặc <code>docker0</code> để truy cập</li></ul><h3 id="influxdb">InfluxDB</h3><p>Chạy InfluxDB với docker container chúng ta cần chú ý giữ an toàn dữ liệu của nó bằng cách sử dụng volume:</p><pre><code>volumes:
     - &quot;influxdb-data:/var/lib/influxdb&quot;
</code></pre>
<p>Chúng ta có thể thêm biến environment để tạo sẵn database cho Telegraf:</p><pre><code>environment:
     - INFLUXDB_DB=telegraf
</code></pre>
<p>Cấu hình data retention cho database của Telegraf. Mặc định InfluxDB sẽ tạo một RETENTION POLICY có tên là autogen với DURATION là vô hạn cho mỗi database, vì thế để cấu hình lại data retention cho database ta có thể sửa policy này:</p><pre><code>ALTER RETENTION POLICY autogen ON telegraf DURATION 30d REPLICATION 1 SHARD DURATION 24h0
</code></pre>
<h3 id="grafana">Grafana</h3><p>Với <strong>Grafana</strong> chúng ta cũng cần giữ an toàn các dữ liệu của nó bằng cách sử dụng volume:</p><pre><code>volumes:
      - grafana-data:/var/lib/grafana
</code></pre>
<p>Chúng ta cũng có thể sử dụng các biến environment để cấu hình password cho admin, hoặc tài khoản để gửi mail alert, ...</p><p>Grafana cung cấp một tập các dashboard được cấu hình sẵn tại đây: <a href="https://grafana.com/dashboards">https://grafana.com/dashboards</a> . Chúng ta tìm dashboard phù hợp rồi import vào Grafana thay vì phải config từ đầu. Với Telegraf, chúng tôi thường import dashboard này: <a href="https://grafana.com/dashboards/61">https://grafana.com/dashboards/61</a></p><p>Để mọi người dễ hình dung các config, chúng tôi đã tạo sẵn Github repo. Mọi người có thể tham khảo tại: <a href="https://github.com/devopszcom/tig-monitoring">https://github.com/devopszcom/tig-monitoring</a></p><h2 id="screenshot">Screenshot</h2><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/09/Grafana---Telegraf-metrics--1-.png" class="kg-image" alt="Monitoring System (Phần 2)"></figure><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/09/Grafana---Telegraf-metrics--2-.png" class="kg-image" alt="Monitoring System (Phần 2)"></figure><h2 id="tham-kh-o">Tham khảo</h2><p><a href="https://angristan.xyz/monitoring-telegraf-influxdb-grafana/">https://angristan.xyz/monitoring-telegraf-influxdb-grafana/</a></p>]]></content:encoded></item><item><title><![CDATA[Monitoring System (Phần 1)]]></title><description><![CDATA[Bài viết này sẽ giới thiệu tổng quan về hệ thống monitoring và giới thiệu Telegraf - Influxdb - Grafana (TIG) một stack monitoring phổ biến]]></description><link>https://devopsz.com/monitoring-system-part-1/</link><guid isPermaLink="false">5b82bf0c80ef020001cd2c30</guid><category><![CDATA[Ops]]></category><dc:creator><![CDATA[Cuong Nguyen]]></dc:creator><pubDate>Tue, 28 Aug 2018 02:59:37 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/08/Grafana---Telegraf-metrics-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://devopsz.com/content/images/2018/08/Grafana---Telegraf-metrics-2.png" alt="Monitoring System (Phần 1)"><p>Bài viết này sẽ giới thiệu tổng quan về hệ thống monitoring và giới thiệu <strong>Telegraf - Influxdb - Grafana (TIG)</strong> một stack monitoring phổ biến. Qua phần 2 chúng ta sẽ tìm hiểu cách deploy TIG stack với docker.</p><h2 id="kh-i-ni-m">Khái niệm</h2><p><strong>Monitoring system</strong> là một hệ thống theo dõi, ghi lại các trạng thái, hoạt động của máy tính hay ứng dụng một cách liên tục. </p><h2 id="t-i-sao-ch-ng-ta-c-n-monitoring-system">Tại sao chúng ta cần Monitoring system?</h2><ul><li>Dựa vào kết quả của hệ thống monitoring chúng ta có thể điêù chỉnh việc sử dụng tài nguyên (cpu, ram, disk, ...) sao cho phù hợp</li><li>Ngăn chặn các sự cố có thể xảy ra, nếu có xảy ra chúng ta cũng có thể phát hiện sớm hơn</li><li>Giảm thiểu thời gian quản lý hệ thống</li></ul><p><strong>=&gt; Một hệ thống Monitoring tốt sẽ giúp tăng năng suất, chất lượng sản phẩm</strong></p><h2 id="c-c-c-i-m-c-a-m-t-h-th-ng-monitoring">Các đặc điểm của một hệ thống monitoring</h2><ul><li>Xử lí real time</li><li>Có hệ thống cảnh báo</li><li>Visualization</li><li>Có khả năng tạo reports</li><li>Có khả năng cài cắm các plugins</li></ul><h2 id="th-nh-ph-n">Thành phần</h2><figure class="kg-image-card"><img src="https://devopsz.com/content/images/2018/08/MonitorSystem.png" class="kg-image" alt="Monitoring System (Phần 1)"><figcaption>Monitoring system architecture</figcaption></figure><p>Thông thường một hệ thống monitoring thường có 4 thành phần chính:</p><p><strong>Collector</strong>: Được cài trên các máy agent (các máy muốn monitor), có nhiệm vụ collect metrics của host và gửi về database. Ví dụ: Cadvisor, Telegraf, Beat, ...</p><p><strong>Database</strong>: Lưu trữ các metrics mà colletor thu thập được, thường thì chúng ta sẽ sử dụng các time series database. Ví dụ ElasticSearch, InfluxDB , Prometheus, Graphite (Whisper)</p><p><strong>Visualizer</strong>: Có nhiệm vụ trực quan hóa các metrics thu thập được qua các biểu đồ, bảng, .... Ví dụ: Kibana, Grafana, Chronograf</p><p><strong>Alerter</strong>: Gửi thống báo đến cho sysadmin khi có sự cố xảy ra</p><p><strong>Có rất nhiều stack phổ biến như:</strong></p><p>• Logstash - Elasticsearch - Kibana</p><p>• Prometheus - Node Exporter - Grafana</p><p>• Telegraf - InfluxDB - Grafana</p><h2 id="telegraf-influxdb-grafana-stack">Telegraf - Influxdb - Grafana Stack</h2><figure class="kg-image-card"><img src="https://devopsz.com/content/images/2018/08/TIG.png" class="kg-image" alt="Monitoring System (Phần 1)"><figcaption>TIG Stack Architecture</figcaption></figure><p><strong>Telegraf</strong> và <strong>Influxdb</strong> đều là sản phẩm của InfluxData, cả hai đều mà mã nguồn mở và được viết bởi Go. Mặc dù InfluxData cung cấp một stack hoàn chỉnh để monitor với Chronograf để visualize và Kapacitor để alerting (TICK stack) nhưng chúng ta có thể sử dụng Grafana để thay thế cho cả Chronograf lẫn Kapacitor.</p><h3 id="telegraf">Telegraf</h3><p><a href="https://www.influxdata.com/time-series-platform/telegraf/">https://www.influxdata.com/time-series-platform/telegraf/</a></p><p>Telegraf là một agent để collecting và reporting metrics và data được viết bởi Go. </p><p>Nó có thể tích hợp để collect nhiều loại nguồn dữ liệu khác nhau của metrics, events, và logs trực tiếp từ containers và system mà nó chạy trên đó. Nó cũng có thể pull metrics từ các third-party APIs, Kafka. Nó cũng có nhiều output plugin để gửi metrics thu thập được tới nhiều dạng datastores, services, message queues khác nhau như  InfluxDB, Graphite, OpenTSDB, Datadog, Librato, Kafka, ...</p><h3 id="influxdb">InfluxDB</h3><p><a href="https://www.influxdata.com/time-series-platform/influxdb/">https://www.influxdata.com/time-series-platform/influxdb/</a></p><p><strong>InfluxDB</strong> là một <strong>Time Series Database</strong> (là database được tối ưu hóa để xử lý dữ liệu chuỗi thời gian, các dãy số được lập chỉ mục theo thời gian. )</p><p><strong>InfluxDB</strong> được sử dụng để lưu các dữ liệu cho các trường hợp liên quan đến một lượng lớn time-stamped data, bao gồm DevOps monitoring, log data, application metrics, IoT sensor data, và real-time analytics. Nó có thể tự động xóa các dữ liệu cũ, không cần thiết và cung cấp một ngôn ngữ giống SQL để tương tác với dữ liệu.</p><p>Data trong InfluxDB được tổ chức dưới dạng <strong>time series</strong>. Time series có thể có một hoặc nhiều points, mỗi point là một mẫu rời rạc các số liệu. Point gồm:</p><p>• Time (timestamp)</p><p>• Một measurement (ví dụ "cpu_load")</p><p>• Ít nhất một key-value field (giá trị đo được, ví dụ "value=0.64", hoặc "temperature=21.2")</p><p>• Không hoặc nhiều key-value tags chứa metadata của value (ví dụ “host=server01”, “region=EMEA”, “dc=Frankfurt”)</p><p>Chúng ta có thể xem <strong>measurement</strong> như là <strong>table</strong> trong sql có primary <strong>index</strong> luôn là <strong>time</strong>. <strong>tags</strong> và <strong>field</strong> là <strong>columns</strong> của table, tags được index còn field thì không. Điểm khác biệt ở đây là InfluxDB có thể có hàng triệu measurements, chúng ta không cần định nghĩa schemas trước và giá trị null không được lưu trữ.</p><p><strong>Downsampling and data retention</strong></p><p>InfluxDB có thể xử lí được hàng trăm ngìn dữ liệu trong 1 giây. Cách lưu trữ dữ liệu giúp nó làm được điều này.</p><p>InfluxDB cung cấp 2 tính năng là <strong>Continuous Queries (CQ)</strong> và <strong>Retention Policies (RP)</strong>. Chúng sẽ tự động xử lí downsampling data và expiring old data.</p><p><strong>Continuous Query (CQ)</strong> là một InfluxQL query cái mà sẽ chạy tự động và theo định kỳ trong database. CQs yêu cầu một function trong mệnh đề SELECT và phải bao gồm mệnh đề GROUP BY time() - có thể hiểu là thằng này sẽ chạy trước các câu truy vấn của mình.</p><p><strong>Retention Policy (RP)</strong> là một phần của InfluxDB’s data structure, biểu thị thời gian mà InfluxDB lưu giữu data. InfluxDB sẽ so sánh giữa thời gian của host với thời gian của dữ liệu và xóa bỏ các dữ liệu có thời gian cũ hơn RP’s DURATION (do chúng ta cấu hình). Một single database có thể có một số RPs và RPs là duy nhất cho mỗi database.</p><h3 id="grafana">Grafana</h3><p><a href="https://grafana.com/grafana">https://grafana.com/grafana</a></p><p>Là một mã nguồn mở cho phép chúng ta query, visualize, alert các metrics thu thập được.<br>Khẩu hiệu của Grafana: </p><blockquote><em>No matter where your data is, or what kind of database it lives in, you can bring it together with Grafana. Beautifully.</em></blockquote><p><strong>Các tính năng của Grafana:</strong></p><ul><li>Visualize: table, chart, ...</li><li>Alert: alert to email, slack, ...</li><li>Unify: Hỗ trợ nhiều loại database như InfluxDB, ElasticSearch, Graphite, ...</li><li>Open: mã nguồn mở, có thể chạy trên nhiều hệ điều hành, có office Docker image</li><li>Extend: Cung cấp nhiều plugin, nhiều dashboard template</li><li>Collaborate: Hỗ trợ teamwork</li></ul><p>(Còn tiếp)</p><h2 id="tham-kh-o">Tham khảo</h2><p><a href="https://hackernoon.com/monitor-your-infrastructure-with-tig-stack-b63971a15ccf">https://hackernoon.com/monitor-your-infrastructure-with-tig-stack-b63971a15ccf</a></p><p><a href="https://angristan.xyz/monitoring-telegraf-influxdb-grafana/">https://angristan.xyz/monitoring-telegraf-influxdb-grafana/</a></p><p><a href="https://blog.pandorafms.org/why-you-need-a-monitoring-system/">https://blog.pandorafms.org/why-you-need-a-monitoring-system/</a></p>]]></content:encoded></item><item><title><![CDATA[Docker 101 (Phần 1)]]></title><description><![CDATA[Trong những năm gần đây, công nghệ Container ngày càng phát triển và trở nên phổ biến, với gương mặt nổi bật là Docker. Docker được sử dụng từ các công ty hàng đầu thế giới như Google, Uber đến các công ty khởi nghiệp, từ các lập trình viên (Dev) đến những người vận hành hệ thống (Ops).]]></description><link>https://devopsz.com/docker-101-part-1/</link><guid isPermaLink="false">5b823c65a4fde40001df8dd9</guid><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Cuong Tran]]></dc:creator><pubDate>Sun, 26 Aug 2018 05:36:42 GMT</pubDate><media:content url="https://devopsz.com/content/images/2018/08/09-docker-build-ship-run-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://devopsz.com/content/images/2018/08/09-docker-build-ship-run-1.png" alt="Docker 101 (Phần 1)"><p>Trong những năm gần đây, công nghệ Container ngày càng phát triển và trở nên phổ biến, với gương mặt nổi bật là Docker. Docker được sử dụng từ các công ty hàng đầu thế giới như Google, Uber đến các công ty khởi nghiệp, từ các lập trình viên (Dev) đến những người vận hành hệ thống (Ops).</p><p>Vậy Docker là gì? Vì sao Docker trở nên phổ biến như vậy? Vì sao tập người dùng của Docker rộng như vậy (Dev + Ops)? Chúng tôi xin được trình bày một số kiến thức về Docker thông qua chuỗi bài Docker 101.</p><p><a href="https://devopsz.com/docker-101-part-1/">Phần 1: Docker là gì?</a></p><p><a href="https://devopsz.com/docker-101-part-2/">Phần 2: Ai sẽ dùng Docker?</a></p><p><a href="https://devopsz.com/docker-101-part-3/">Phần 3: Làm việc với Docker thế nào?</a></p><p><a href="https://devopsz.com/docker-101-part-4/">Phần 4: Có thể dùng Docker trong các trường hợp nào?</a></p><h3 id="1-1-v-n-tri-n-khai-h-th-ng-ph-n-m-m">1.1 Vấn đề triển khai hệ thống phần mềm</h3><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/01-software-deploy-complex.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption><em>Sự phức tạp của việc triển khai hệ thống phần mềm trên nhiều môi trường khác nhau (Nguồn: docker.com)</em></figcaption></figure><p>Với sự phát triển của công nghệ, việc triển khai hệ thống phần mềm trong thực tế ngày càng trở nên phức tạp.</p><p><strong>Vấn đề:</strong> Các hệ thống phần mềm rất đa dạng về công nghệ.</p><p><strong>Câu hỏi:</strong> Làm thế nào để các services (dịch vụ) và apps (ứng dụng) có thể tương tác với nhau một cách thích hợp (kết nối được với nhau, không xảy ra xung đột).</p><p><strong>Vấn đề:</strong> Môi trường triển khai rất đa dạng, từ môi trường Dev, QA server đến môi trường Production Servers, Public Cloud.</p><p><strong>Câu hỏi: </strong>Làm thế nào để có thể di chuyển (migrate), triển khai hệ thống phần mềm một cách trôi chảy và nhanh chóng?</p><p>Với hệ thống phần mềm trên, việc triển khai là một việc phức tạp và tốn nhiều công sức.</p><p>Nếu chúng ta có:</p><ul><li> n: là số lượng phần mềm 	</li><li> m: là số lượng môi trường </li></ul><p>Chúng ta sẽ cần triển khai nxm lần như hình dưới đây.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/02-software-deploy-matrix.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption><i>Ma trận triển khai phần mềm (Nguồn: docker.com)</i></figcaption></figure><h3 id="1-2-v-n-v-n-chuy-n-h-ng-h-a-trong-giao-v-n">1.2 Vấn đề vận chuyển hàng hóa trong giao vận</h3><p>Trước khi giải quyết vấn đề này, chúng ta cùng xem lại một vấn đề tương tự đã có trong lịch sử: <strong>vấn đề vận chuyển hàng hóa trong giao vận</strong>.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/03-logistics-complex.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption>Sự phức tạp của việc vận chuyển nhiều loại hàng hóa trên nhiều loại phương tiện khác nhau (Nguồn: docker.com)<span class="-mobiledoc-kit__atom">‌‌</span></figcaption></figure><p>Việc vận chuyển hàng hóa trước những năm 1960 gặp vấn đề tương tự:</p><p><strong>Vấn đề:</strong> Có rất nhiều loại hàng hóa khác nhau.</p><p><strong>Câu hỏi:</strong>Các hàng hóa có bị trỗn lẫn vào nhau và làm giảm chất lượng không? Ví dụ: Vận chuyển hạt cà phê và gia vị cùng nhau.</p><p><strong>Vấn đề:</strong>Vận chuyển trên nhiều loại phương tiện khác nhau.</p><p><strong>Câu hỏi: </strong>Làm thế nào để có thể vận chuyển một cách trôi chảy và nhanh chóng? Ví dụ: vận chuyển hàng hóa từ thuyền lên tàu hỏa, rồi lên xe tải.</p><p>Một cách tương tự, chúng ta cũng có ma trận vận chuyển hàng hóa, với:</p><ul><li> n: là số lượng hàng hóa. 	</li><li> m: là số lượng phương tiện.  	 </li></ul><p>Chúng ta sẽ cần nxm lần đóng gói hàng hóa trên các phương tiện khác nhau.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/04-logistics-matrix.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption>Ma trận vận chuyển hàng hóa (Nguồn: docker.com)<span class="-mobiledoc-kit__atom">‌‌</span></figcaption></figure><h3 id="1-3-gi-i-ph-p-g-cho-ng-nh-giao-v-n">1.3 Giải pháp gì cho ngành giao vận?</h3><p>Những người trong ngành giao vận đã phát minh ra <strong>Container</strong>, phương tiện đóng gói đa năng.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/05-logistics-solution.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption>Giải pháp cho giao vận: container (Nguồn: docker.com)<span class="-mobiledoc-kit__atom">‌‌</span></figcaption></figure><ul><li>Một container tiêu chuẩn có thể chứa được hầu hết các loại mặt hàng và đóng kín cho đến khi đến được đích cuối cùng.</li><li>Trong quá trình vận chuyển, container có thể được đặt vào các phương tiện khác nhau, có thể xếp chồng lên nhau, được vận chuyển hiệu quả trên các khoảng cách dài và dễ dàng chuyển từ phương tiện này sang phương tiện khác.</li></ul><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/06-logistics-result-2.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption>Hệ sinh thái vận chuyển sử dụng container (Nguồn: docker.com)<span class="-mobiledoc-kit__atom">‌‌</span></figcaption></figure><p><strong>Kết quả:</strong> Việc phát minh ra container đã tạo nên một hệ sinh thái vận chuyển sử dụng container.</p><ul><li>90% hàng hóa được vận chuyển trong các container tiêu chuẩn.</li><li>Giảm được chi phí và thời gian để nạp và dỡ hàng.</li><li>Giảm đáng kể tổn thất do trộm cắp hoặc hư hỏng.</li><li>Giảm tỉ trọng của chi phí vận chuyển trong giá thành phẩm (từ hơn 25% xuống dưới 3%).</li><li>Hiện nay, có hơn 5000 tàu vận chuyển hơn 200 triệu containers mỗi năm.</li></ul><h3 id="1-4-gi-i-ph-p-g-cho-vi-c-tri-n-khai-h-th-ng-ph-n-m-m">1.4 Giải pháp gì cho việc triển khai hệ thống phần mềm?</h3><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/07-software-deploy-solution.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption>Docker là một hệ thống vận chuyển container cho phần mềm (Nguồn: docker.com)<span class="-mobiledoc-kit__atom">‌‌</span></figcaption></figure><p>Tương tự như ngành giao vận, những người trong ngành công nghệ thông tin đã phát minh ra công nghệ container cho phần mềm. Và Docker là một giải pháp tiêu biểu cho công nghệ container.</p><ul><li>Docker là một động cơ (engine) cho phép đóng gói phần mềm như một container nhẹ (lightweight), di động (portable), hoạt động độc lập (self-sufficient).</li><li>Có thể thao tác bằng cách sử dụng các lệnh tiêu chuẩn, và chạy nhất quán trên hầu hết các nền tảng phần cứng.</li></ul><p>Bằng cách sử dụng công nghệ container, vấn đề triển khai hệ thống phần mềm đã được giải quyết, giảm được độ phức tạp của việc triển khai nxm lần xuống còn n lần đóng gói phần mềm vào container.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/08-software-deploy-matrix-resolved.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption>Docker giải quyết được vấn đề triển khai hệ thống phần mềm (Nguồn: docker.com)<span class="-mobiledoc-kit__atom">‌‌</span></figcaption></figure><p><strong>Kết quả:</strong></p><ul><li>Thời gian triển khai từ hệ thống phát triển (Dev) sang hệ thống thực 	(Production) giảm từ 9 tháng xuống còn 15 phút (ING)</li><li>Thời gian để chạy công việc tích hợp (job) trong hệ thống tích hợp liên tục 	(CI) giảm hơn 60% (BBC)</li><li>Thời gian triển khai từ hệ thống phát triển (Dev) sang hệ thống thực 	(Production) giảm từ vài tuần xuống còn vài phút (Uber)</li></ul><h3 id="1-5-kh-i-ni-m-c-b-n-v-docker">1.5 Khái niệm cơ bản về Docker</h3><p>Docker là một công cụ dùng để đóng gói, vận chuyển và chạy container một cách đơn giản và dễ dàng trên các nền tảng khác nhau.</p><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/09-docker-build-ship-run.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption>Docker - Build, Ship and Run (Nguồn: docker.com)<span class="-mobiledoc-kit__atom">‌‌</span></figcaption></figure><p>Docker đóng gói một phần mềm trong một hệ thống tập tin (file system) hoàn chỉnh, có chứa mọi thứ cần thiết để chạy, bao gồm:</p><ul><li>Mã (Code)</li><li>Runtime</li><li>Các công cụ hệ thống (System Tools)</li><li>Các thư viện hệ thống (System Libraries)</li><li>Bất cứ thứ gì bạn có thể cài trên một server</li></ul><figure class="kg-card kg-image-card"><img src="https://devopsz.com/content/images/2018/08/10-docker-vs-virtual-machine.png" class="kg-image" alt="Docker 101 (Phần 1)"><figcaption>So sánh Container và Máy ảo (Virtual Machine) (Nguồn: docker.com)<span class="-mobiledoc-kit__atom">‌‌</span></figcaption></figure><p>Docker thực hiện ảo hóa ở mức hệ điều hành. Mỗi container là cô lập (isolated), nhưng dùng chung Kernel và một số bin/thư viện thích hợp. Điều này giúp container triển khai nhanh hơn, ít tốn kém hơn (overhead), di chuyển (migration) dễ dàng và khởi động lại nhanh hơn.</p><p>(Còn tiếp ...)</p><h3 id="t-i-li-u-tham-kh-o">Tài liệu tham khảo</h3><p><a href="https://www.docker.com/,">https://www.docker.com/</a></p>]]></content:encoded></item></channel></rss>