[{"data":1,"prerenderedAt":1210},["ShallowReactive",2],{"search-posts-dataset":3,"post-detail-/posts/how-to-install-docker-on-ubuntu-server":159,"all-published-articles-list":1146,"series-posts-/posts/how-to-install-docker-on-ubuntu-server":1206},[4,20,35,48,62,75,87,99,111,122,135,149],{"path":5,"title":6,"description":7,"categories":8,"tags":11,"date":16,"image":17},"/posts/incident-checklist","Checklist xử lí sự cố máy chủ Linux: Phục hồi sau thảm họa","Qui trình phản ứng và xử lí sự cố máy chủ Linux khi hệ thống bị sập, tràn RAM/HDD hoặc nghi ngờ bị xâm nhập: Các bước chuẩn đoán, cô lập, phân tích log và khôi phục.",[9,10],"linux","devops",[12,13,14,15],"incident","troubleshooting","security","sysadmin","2026-08-15T00:00:00.000Z",{"src":18,"alt":19},"/img/incident-response.webp","Xử lí sự cố máy chủ Linux",{"path":21,"title":22,"description":23,"categories":24,"tags":27,"date":31,"image":32},"/posts/backup-postgres-docker","Sao lưu tự động PostgreSQL trong Docker với cron job và gzip","Hướng dẫn xây dựng script tự động backup database PostgreSQL chạy trong Docker container: gzip, cron hàng ngày, tự động xóa bản sao lưu cũ và kiểm thử phục hồi.",[25,26],"docker","database",[28,29,30,10],"postgresql","backup","automation","2025-10-20T00:00:00.000Z",{"src":33,"alt":34},"/img/postgres-backup.webp","Sao lưu tự động PostgreSQL Docker",{"path":36,"title":37,"description":38,"categories":39,"tags":40,"date":44,"image":45},"/posts/docker-compose-production","Thiết kế Docker compose chuẩn Production","Hướng dẫn thực chiến xây dựng docker-compose.yml hoàn chỉnh cho Production: healthchecks, restart policies, resource limits, quản lí .env và Persistent Volumes",[25,10],[41,42,43],"production","compose","backend","2025-10-15T00:00:00.000Z",{"src":46,"alt":47},"/img/docker-compose.webp","Docker Compose Production Best Practices",{"path":49,"title":50,"description":51,"categories":52,"tags":53,"date":58,"image":59},"/posts/monitoring-server-basics","Giám sát server Linux từ cơ bản đến nâng cao: htop, ncdu, prometheus và Uptime Kuma","Cẩm nang toàn diện về giám sát hiệu năng máy chủ Linux: Khai thác công cụ CLI thời gian thực (Htop, Btop, Ncdu), thiết lập hệ thống cảnh báo sự cố Uptime Kuma qua Telegram và thu thập chỉ số với Prometheus & Grafana.",[9,10],[54,55,56,57],"monitoring","grafana","prometheus","uptime","2024-10-18T00:00:00.000Z",{"src":60,"alt":61},"/img/monitoring.webp","Giám sát máy chủ Linux",{"path":63,"title":64,"description":65,"categories":66,"tags":68,"date":71,"image":72},"/posts/nginx-reverse-proxy","Hướng dẫn cấu hình Nginx Reverse Proxy với SSL Certbot và Docker chuẩn Production","Cẩm nang toàn diện cấu hình Nginx Reverse Proxy trên Ubuntu: Tích hợp chứng chỉ SSL Let's Encrypt miễn phí qua Certbot, hỗ trợ WebSockets, HTTP/2, nén Brotli/Gzip và Rate Limiting chống DDoS.",[9,67],"nginx",[10,69,70],"ssl","webserver","2024-10-10T00:00:00.000Z",{"src":73,"alt":74},"/img/nginx.webp","Nginx Reverse Proxy với SSL",{"path":76,"title":77,"description":78,"categories":79,"tags":80,"date":83,"image":84},"/posts/how-to-secure-a-vps","Bảo mật máy chủ Linux VPS: Cẩm nang toàn diện 8 bước chống tấn công","Hướng dẫn thực chiến từng bước thiết lập bảo mật máy chủ Linux VPS mới: Vô hiệu hóa mật khẩu SSH, thiết lập SSH Key Ed25519, cấu hình Fail2ban, tường lửa UFW và cập nhật tự động Unattended-Upgrades.",[9,14],[81,82,10],"vps","hardening","2024-10-05T00:00:00.000Z",{"src":85,"alt":86},"/img/linux-security.webp","Bảo mật máy chủ Linux VPS",{"path":88,"title":89,"description":90,"categories":91,"tags":92,"date":95,"image":96},"/posts/systemd-node-service","Quản lí ứng dụng Node.js trong Production với Systemd Service và Journalctl","Hướng dẫn triển khai ứng dụng Node.js, Go hoặc Python dưới dạng Systemd Service trên Linux: Tự động khởi động lại khi crash, quản lý biến môi trường, giới hạn bộ nhớ RAM và theo dõi log thời gian thực với Journalctl.",[9,10],[93,94,43,41],"systemd","nodejs","2024-10-01T00:00:00.000Z",{"src":97,"alt":98},"/img/systemd.webp","Quản lý ứng dụng với Systemd Service",{"path":100,"title":101,"description":102,"categories":103,"tags":104,"date":107,"image":108},"/posts/how-to-install-docker-on-ubuntu-server","Hướng dẫn cài đặt Docker & Docker compose trên Ubuntu server","Hướng dẫn toàn diện cách cài đặt Docker Engine và Docker Compose V2 trên Ubuntu Server, cấu hình bảo mật non-root user, tối ưu daemon và xử lí xung đột tường lửa UFW",[9,25],[105,10,106],"beginner","ubuntu","2024-09-30T00:00:00.000Z",{"src":109,"alt":110},"/img/docker.webp","Cài đặt Docker trên Ubuntu Server",{"path":112,"title":113,"description":114,"categories":115,"tags":116,"date":118,"image":119},"/posts/ssh-key-authentication","Xác thực SSH Key từ cơ bản đến nâng cao: Ed25519, SSH Config và Bảo mật đa tầng","Cẩm nang toàn diện về xác thực SSH Key trên máy chủ Linux: So sánh Ed25519 vs RSA, cấu hình SSH Config quản lí hàng chục VPS, chuyển tiếp Agent Forwarding, và các qui tắc bảo mật chống lộ khóa.",[9,14],[117,10,15],"ssh","2024-09-25T00:00:00.000Z",{"src":120,"alt":121},"/img/ssh-keys.webp","Xác thực SSH Key Linux",{"path":123,"title":124,"description":125,"categories":126,"tags":127,"date":131,"image":132},"/posts/ufw-firewall-basics","Làm chủ tường lửa UFW trên Linux: Qui tắc, giới hạn kết nối và xử lí xung đột Docker","Hướng dẫn toàn diện làm chủ tường lửa UFW (Uncomplicated Firewall) trên Ubuntu: Thiết lập chính sách mặc định, mở cổng theo IP, giới hạn brute-force (Rate Limiting) và khắc phục lỗi Docker bypass tường lửa.",[9,14],[128,129,130,15],"ufw","firewall","networking","2024-09-20T00:00:00.000Z",{"src":133,"alt":134},"/img/ufw-firewall.webp","Cấu hình Tường lửa UFW Linux",{"path":136,"title":137,"description":138,"categories":139,"tags":141,"date":145,"image":146},"/posts/git-deploy-key","Tự động hóa triển khai với Git deploy keys: Thiết lập an toàn cho GitHub và GitLab","Hướng dẫn thiết lập Git Deploy Key chuẩn bảo mật để kéo mã nguồn tự động từ GitHub hoặc GitLab về máy chủ Production: Phân quyền Read-Only, cấu hình SSH Config và tích hợp Webhook tự động cập nhật.",[140,10],"git",[142,143,144,30],"github","gitlab","cicd","2024-09-18T00:00:00.000Z",{"src":147,"alt":148},"/img/git-deploy.webp","Git Deploy Keys cho máy chủ",{"path":150,"title":151,"description":152,"categories":153,"tags":154,"date":155,"image":156},"/posts/ubuntu-server-initial-setup","Qui trình thiết lập ban đầu cho Ubuntu Server: Swap, Timezone, User và Firewall","Hướng dẫn các bước thiết lập chuẩn mực ban đầu cho máy chủ Ubuntu Server mới: Cấu hình múi giờ Việt Nam (Asia/Ho_Chi_Minh), tạo phân vùng RAM ảo (Swap File), phân quyền Sudoer và kích hoạt tường lửa UFW.",[9],[106,105,15],"2024-09-15T00:00:00.000Z",{"src":157,"alt":158},"/img/ubuntu.webp","Thiết lập ban đầu Ubuntu Server",{"id":160,"title":101,"author":161,"body":162,"categories":1134,"date":107,"description":102,"draft":1135,"extension":1136,"image":1137,"meta":1138,"navigation":418,"path":100,"seo":1139,"series":1140,"series_order":257,"slug":1141,"stem":1142,"tags":1143,"updated":1144,"__hash__":1145},"post/posts/how-to-install-docker-on-ubuntu-server.md","Dương Thụ",{"type":163,"value":164,"toc":1119},"minimal",[165,170,179,182,185,188,192,195,220,235,237,241,244,287,290,318,320,324,327,376,378,382,385,457,460,533,536,550,552,556,559,589,592,612,615,643,646,668,670,674,690,736,739,751,754,769,780,782,786,792,867,870,889,892,917,919,923,933,948,953,998,1000,1004,1007,1098,1100,1104,1115],[166,167,169],"h2",{"id":168},"giới-thiệu-về-docker-và-containerization","Giới thiệu về Docker và Containerization",[171,172,173,174,178],"p",{},"Docker là nền tảng ảo hóa mức hệ điều hành (Containerization) phổ biến nhất thế giới hiện nay, cho phép các lập trình viên và kỹ sư hệ thống đóng gói toàn bộ ứng dụng cùng các thư viện phụ thuộc (dependencies) vào một đơn vị độc lập gọi là ",[175,176,177],"strong",{},"Container",".",[171,180,181],{},"So với máy ảo truyền thống (Virtual Machines) phải chạy cả một hệ điều hành khách (Guest OS) nặng nề với Hypervisor, container của Docker chia sẻ chung nhân Linux (Kernel) với máy chủ chủ (Host OS). Nhờ vậy, container khởi động chỉ trong vài phần trăm giây, tiêu thụ cực ít tài nguyên CPU/RAM và mang lại tính nhất quán 100% giữa môi trường phát triển (Local Development), kiểm thử (Staging) và vận hành thực tế (Production).",[171,183,184],{},"Trong bài viết này, chúng ta sẽ cùng nhau cài đặt phiên bản Docker Engine mới nhất và Docker Compose V2 từ repository chính thức của Docker Inc trên máy chủ Ubuntu Server (hỗ trợ Ubuntu 20.04, 22.04 và 24.04 LTS), đồng thời thiết lập các cấu hình tối ưu hiệu năng và bảo mật tốt nhất.",[186,187],"hr",{},[166,189,191],{"id":190},"chuẩn-bị-trước-khi-cài-đặt","Chuẩn bị trước khi cài đặt",[171,193,194],{},"Trước khi bắt đầu, hãy đảm bảo bạn đã đáp ứng các yêu cầu sau:",[196,197,198,206,217],"ol",{},[199,200,201,202,178],"li",{},"Một máy chủ Ubuntu Server 20.04, 22.04 hoặc 24.04 LTS với quyền truy cập ",[203,204,205],"code",{},"sudo",[199,207,208,209,212,213,216],{},"Kiến trúc CPU được hỗ trợ: ",[203,210,211],{},"x86_64"," (amd64) hoặc ",[203,214,215],{},"aarch64"," (arm64).",[199,218,219],{},"Kết nối Internet ổn định để tải các gói phần mềm và Docker Images.",[221,222,224],"info-box",{"type":223},"warning",[171,225,226,227,230,231,234],{},"Mặc dù Ubuntu có sẵn gói ",[203,228,229],{},"docker.io"," trong kho APT mặc định, nhưng gói này thường lỗi thời so với bản mới nhất từ Docker. Chúng tôi khuyến nghị cài đặt trực tiếp từ kho chính thức của Docker (",[203,232,233],{},"docker-ce",") để nhận được các bản vá bảo mật và tính năng mới nhất.",[186,236],{},[166,238,240],{"id":239},"bước-1-gỡ-bỏ-các-phiên-bản-docker-cũ-nếu-có","Bước 1: Gỡ bỏ các phiên bản Docker cũ (nếu có)",[171,242,243],{},"Nếu trước đây máy chủ đã từng cài đặt các gói Docker không chính thức, hãy gỡ bỏ chúng để tránh xung đột xung quanh package manager:",[245,246,251],"pre",{"className":247,"code":248,"language":249,"meta":250,"style":250},"language-bash shiki shiki-themes github-dark github-dark github-dark","sudo apt-get remove -y docker docker-engine docker.io containerd runc\n","bash","",[203,252,253],{"__ignoreMap":250},[254,255,258,261,265,268,272,275,278,281,284],"span",{"class":256,"line":257},"line",1,[254,259,205],{"class":260},"sb7EE",[254,262,264],{"class":263},"skqr8"," apt-get",[254,266,267],{"class":263}," remove",[254,269,271],{"class":270},"sKJT9"," -y",[254,273,274],{"class":263}," docker",[254,276,277],{"class":263}," docker-engine",[254,279,280],{"class":263}," docker.io",[254,282,283],{"class":263}," containerd",[254,285,286],{"class":263}," runc\n",[171,288,289],{},"Sau đó, hãy cập nhật lại danh mục gói phần mềm của hệ thống:",[245,291,293],{"className":247,"code":292,"language":249,"meta":250,"style":250},"sudo apt-get update && sudo apt-get upgrade -y\n",[203,294,295],{"__ignoreMap":250},[254,296,297,299,301,304,308,310,312,315],{"class":256,"line":257},[254,298,205],{"class":260},[254,300,264],{"class":263},[254,302,303],{"class":263}," update",[254,305,307],{"class":306},"sFJ4l"," && ",[254,309,205],{"class":260},[254,311,264],{"class":263},[254,313,314],{"class":263}," upgrade",[254,316,317],{"class":270}," -y\n",[186,319],{},[166,321,323],{"id":322},"bước-2-cài-đặt-các-gói-phụ-thuộc-cần-thiết","Bước 2: Cài đặt các gói phụ thuộc cần thiết",[171,325,326],{},"Cài đặt các tiện ích hỗ trợ nạp kho APT thông qua giao thức bảo mật HTTPS:",[245,328,330],{"className":247,"code":329,"language":249,"meta":250,"style":250},"sudo apt-get install -y \\\n    ca-certificates \\\n    curl \\\n    gnupg \\\n    lsb-release\n",[203,331,332,346,354,362,370],{"__ignoreMap":250},[254,333,334,336,338,341,343],{"class":256,"line":257},[254,335,205],{"class":260},[254,337,264],{"class":263},[254,339,340],{"class":263}," install",[254,342,271],{"class":270},[254,344,345],{"class":270}," \\\n",[254,347,349,352],{"class":256,"line":348},2,[254,350,351],{"class":263},"    ca-certificates",[254,353,345],{"class":270},[254,355,357,360],{"class":256,"line":356},3,[254,358,359],{"class":263},"    curl",[254,361,345],{"class":270},[254,363,365,368],{"class":256,"line":364},4,[254,366,367],{"class":263},"    gnupg",[254,369,345],{"class":270},[254,371,373],{"class":256,"line":372},5,[254,374,375],{"class":263},"    lsb-release\n",[186,377],{},[166,379,381],{"id":380},"bước-3-thiết-lập-docker-official-gpg-key-và-apt-repository","Bước 3: Thiết lập Docker Official GPG Key và APT Repository",[171,383,384],{},"Tạo thư mục lưu trữ khóa bảo mật GPG và tải khóa chính thức của Docker về máy:",[245,386,388],{"className":247,"code":387,"language":249,"meta":250,"style":250},"# Tạo thư mục keyring\nsudo install -m 0755 -d /etc/apt/keyrings\n\n# Tải và lưu GPG Key của Docker\nsudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc\nsudo chmod a+r /etc/apt/keyrings/docker.asc\n",[203,389,390,396,414,420,425,444],{"__ignoreMap":250},[254,391,392],{"class":256,"line":257},[254,393,395],{"class":394},"sGGCZ","# Tạo thư mục keyring\n",[254,397,398,400,402,405,408,411],{"class":256,"line":348},[254,399,205],{"class":260},[254,401,340],{"class":263},[254,403,404],{"class":270}," -m",[254,406,407],{"class":270}," 0755",[254,409,410],{"class":270}," -d",[254,412,413],{"class":263}," /etc/apt/keyrings\n",[254,415,416],{"class":256,"line":356},[254,417,419],{"emptyLinePlaceholder":418},true,"\n",[254,421,422],{"class":256,"line":364},[254,423,424],{"class":394},"# Tải và lưu GPG Key của Docker\n",[254,426,427,429,432,435,438,441],{"class":256,"line":372},[254,428,205],{"class":260},[254,430,431],{"class":263}," curl",[254,433,434],{"class":270}," -fsSL",[254,436,437],{"class":263}," https://download.docker.com/linux/ubuntu/gpg",[254,439,440],{"class":270}," -o",[254,442,443],{"class":263}," /etc/apt/keyrings/docker.asc\n",[254,445,447,449,452,455],{"class":256,"line":446},6,[254,448,205],{"class":260},[254,450,451],{"class":263}," chmod",[254,453,454],{"class":263}," a+r",[254,456,443],{"class":263},[171,458,459],{},"Tiếp theo, thêm kho lưu trữ APT chính thức của Docker vào danh sách nguồn tải phần mềm:",[245,461,463],{"className":247,"code":462,"language":249,"meta":250,"style":250},"echo \\\n  \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \\\n  $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable\" | \\\n  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n",[203,464,465,472,489,516],{"__ignoreMap":250},[254,466,467,470],{"class":256,"line":257},[254,468,469],{"class":270},"echo",[254,471,345],{"class":270},[254,473,474,477,480,483,486],{"class":256,"line":348},[254,475,476],{"class":263},"  \"deb [arch=$(",[254,478,479],{"class":260},"dpkg",[254,481,482],{"class":270}," --print-architecture",[254,484,485],{"class":263},") signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu ",[254,487,488],{"class":270},"\\\n",[254,490,491,494,496,499,501,504,507,510,514],{"class":256,"line":356},[254,492,493],{"class":263},"  $(",[254,495,178],{"class":270},[254,497,498],{"class":263}," /etc/os-release && ",[254,500,469],{"class":270},[254,502,503],{"class":263}," \"",[254,505,506],{"class":306},"$VERSION_CODENAME",[254,508,509],{"class":263},"\") stable\"",[254,511,513],{"class":512},"sWuGj"," |",[254,515,345],{"class":270},[254,517,518,521,524,527,530],{"class":256,"line":364},[254,519,520],{"class":260},"  sudo",[254,522,523],{"class":263}," tee",[254,525,526],{"class":263}," /etc/apt/sources.list.d/docker.list",[254,528,529],{"class":512}," >",[254,531,532],{"class":263}," /dev/null\n",[171,534,535],{},"Cập nhật lại index gói phần mềm để hệ thống nhận diện kho Docker vừa thêm:",[245,537,539],{"className":247,"code":538,"language":249,"meta":250,"style":250},"sudo apt-get update\n",[203,540,541],{"__ignoreMap":250},[254,542,543,545,547],{"class":256,"line":257},[254,544,205],{"class":260},[254,546,264],{"class":263},[254,548,549],{"class":263}," update\n",[186,551],{},[166,553,555],{"id":554},"bước-4-cài-đặt-docker-engine-và-docker-compose-v2","Bước 4: Cài đặt Docker Engine và Docker Compose V2",[171,557,558],{},"Bây giờ chúng ta sẽ cài đặt toàn bộ gói cốt lõi của Docker:",[245,560,562],{"className":247,"code":561,"language":249,"meta":250,"style":250},"sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n",[203,563,564],{"__ignoreMap":250},[254,565,566,568,570,572,574,577,580,583,586],{"class":256,"line":257},[254,567,205],{"class":260},[254,569,264],{"class":263},[254,571,340],{"class":263},[254,573,271],{"class":270},[254,575,576],{"class":263}," docker-ce",[254,578,579],{"class":263}," docker-ce-cli",[254,581,582],{"class":263}," containerd.io",[254,584,585],{"class":263}," docker-buildx-plugin",[254,587,588],{"class":263}," docker-compose-plugin\n",[171,590,591],{},"Kiểm tra trạng thái dịch vụ Docker sau khi cài đặt:",[245,593,595],{"className":247,"code":594,"language":249,"meta":250,"style":250},"sudo systemctl status docker --no-pager\n",[203,596,597],{"__ignoreMap":250},[254,598,599,601,604,607,609],{"class":256,"line":257},[254,600,205],{"class":260},[254,602,603],{"class":263}," systemctl",[254,605,606],{"class":263}," status",[254,608,274],{"class":263},[254,610,611],{"class":270}," --no-pager\n",[171,613,614],{},"Đảm bảo dịch vụ Docker luôn tự khởi động cùng hệ thống khi máy chủ reboot:",[245,616,618],{"className":247,"code":617,"language":249,"meta":250,"style":250},"sudo systemctl enable docker\nsudo systemctl enable containerd\n",[203,619,620,632],{"__ignoreMap":250},[254,621,622,624,626,629],{"class":256,"line":257},[254,623,205],{"class":260},[254,625,603],{"class":263},[254,627,628],{"class":263}," enable",[254,630,631],{"class":263}," docker\n",[254,633,634,636,638,640],{"class":256,"line":348},[254,635,205],{"class":260},[254,637,603],{"class":263},[254,639,628],{"class":263},[254,641,642],{"class":263}," containerd\n",[171,644,645],{},"Kiểm tra phiên bản vừa cài đặt:",[245,647,649],{"className":247,"code":648,"language":249,"meta":250,"style":250},"docker --version\ndocker compose version\n",[203,650,651,658],{"__ignoreMap":250},[254,652,653,655],{"class":256,"line":257},[254,654,25],{"class":260},[254,656,657],{"class":270}," --version\n",[254,659,660,662,665],{"class":256,"line":348},[254,661,25],{"class":260},[254,663,664],{"class":263}," compose",[254,666,667],{"class":263}," version\n",[186,669],{},[166,671,673],{"id":672},"bước-5-quản-lý-docker-không-cần-quyền-root-non-root-user","Bước 5: Quản lý Docker không cần quyền Root (Non-root user)",[171,675,676,677,680,681,683,684,686,687,689],{},"Mặc định, Docker daemon gắn kết với Unix socket thuộc sở hữu của người dùng ",[203,678,679],{},"root",". Nếu không muốn gõ ",[203,682,205],{}," trước mỗi lệnh ",[203,685,25],{},", bạn hãy thêm user hiện tại vào nhóm ",[203,688,25],{},":",[245,691,693],{"className":247,"code":692,"language":249,"meta":250,"style":250},"# Tạo group docker nếu chưa tồn tại\nsudo groupadd -f docker\n\n# Thêm user hiện tại vào group docker\nsudo usermod -aG docker $USER\n",[203,694,695,700,712,716,721],{"__ignoreMap":250},[254,696,697],{"class":256,"line":257},[254,698,699],{"class":394},"# Tạo group docker nếu chưa tồn tại\n",[254,701,702,704,707,710],{"class":256,"line":348},[254,703,205],{"class":260},[254,705,706],{"class":263}," groupadd",[254,708,709],{"class":270}," -f",[254,711,631],{"class":263},[254,713,714],{"class":256,"line":356},[254,715,419],{"emptyLinePlaceholder":418},[254,717,718],{"class":256,"line":364},[254,719,720],{"class":394},"# Thêm user hiện tại vào group docker\n",[254,722,723,725,728,731,733],{"class":256,"line":372},[254,724,205],{"class":260},[254,726,727],{"class":263}," usermod",[254,729,730],{"class":270}," -aG",[254,732,274],{"class":263},[254,734,735],{"class":306}," $USER\n",[171,737,738],{},"Để các thay đổi nhóm có hiệu lực ngay lập tức mà không cần đăng xuất máy chủ, hãy chạy:",[245,740,742],{"className":247,"code":741,"language":249,"meta":250,"style":250},"newgrp docker\n",[203,743,744],{"__ignoreMap":250},[254,745,746,749],{"class":256,"line":257},[254,747,748],{"class":260},"newgrp",[254,750,631],{"class":263},[171,752,753],{},"Kiểm tra chạy thử container không cần quyền root:",[245,755,757],{"className":247,"code":756,"language":249,"meta":250,"style":250},"docker run hello-world\n",[203,758,759],{"__ignoreMap":250},[254,760,761,763,766],{"class":256,"line":257},[254,762,25],{"class":260},[254,764,765],{"class":263}," run",[254,767,768],{"class":263}," hello-world\n",[221,770,772],{"type":771},"success",[171,773,774,775,779],{},"Nếu màn hình hiển thị thông điệp ",[776,777,778],"em",{},"\"Hello from Docker! This message shows that your installation appears to be working correctly.\""," thì bạn đã cấu hình thành công!",[186,781],{},[166,783,785],{"id":784},"bước-6-tối-ưu-cấu-hình-docker-daemon-daemonjson","Bước 6: Tối ưu cấu hình Docker Daemon (daemon.json)",[171,787,788,789,689],{},"Để tối ưu hóa dung lượng ổ đĩa và kiểm soát log container tránh làm tràn ổ cứng, bạn nên cấu hình file ",[203,790,791],{},"/etc/docker/daemon.json",[245,793,795],{"className":247,"code":794,"language":249,"meta":250,"style":250},"sudo tee /etc/docker/daemon.json \u003C\u003C 'EOF'\n{\n  \"log-driver\": \"json-file\",\n  \"log-opts\": {\n    \"max-size\": \"10m\",\n    \"max-file\": \"3\"\n  },\n  \"storage-driver\": \"overlay2\",\n  \"live-restore\": true\n}\nEOF\n",[203,796,797,812,817,822,827,832,837,843,849,855,861],{"__ignoreMap":250},[254,798,799,801,803,806,809],{"class":256,"line":257},[254,800,205],{"class":260},[254,802,523],{"class":263},[254,804,805],{"class":263}," /etc/docker/daemon.json",[254,807,808],{"class":512}," \u003C\u003C",[254,810,811],{"class":263}," 'EOF'\n",[254,813,814],{"class":256,"line":348},[254,815,816],{"class":263},"{\n",[254,818,819],{"class":256,"line":356},[254,820,821],{"class":263},"  \"log-driver\": \"json-file\",\n",[254,823,824],{"class":256,"line":364},[254,825,826],{"class":263},"  \"log-opts\": {\n",[254,828,829],{"class":256,"line":372},[254,830,831],{"class":263},"    \"max-size\": \"10m\",\n",[254,833,834],{"class":256,"line":446},[254,835,836],{"class":263},"    \"max-file\": \"3\"\n",[254,838,840],{"class":256,"line":839},7,[254,841,842],{"class":263},"  },\n",[254,844,846],{"class":256,"line":845},8,[254,847,848],{"class":263},"  \"storage-driver\": \"overlay2\",\n",[254,850,852],{"class":256,"line":851},9,[254,853,854],{"class":263},"  \"live-restore\": true\n",[254,856,858],{"class":256,"line":857},10,[254,859,860],{"class":263},"}\n",[254,862,864],{"class":256,"line":863},11,[254,865,866],{"class":263},"EOF\n",[171,868,869],{},"Giải thích các tham số:",[871,872,873,881],"ul",{},[199,874,875,880],{},[175,876,877],{},[203,878,879],{},"log-opts: max-size & max-file",": Giới hạn mỗi container chỉ được ghi tối đa 3 file log, mỗi file không quá 10MB. Điều này ngăn chặn việc container ghi log quá nhiều làm sập ổ cứng máy chủ.",[199,882,883,888],{},[175,884,885],{},[203,886,887],{},"live-restore: true",": Giữ cho các container tiếp tục chạy ngay cả khi Docker daemon bị restart hoặc cập nhật phần mềm.",[171,890,891],{},"Khởi động lại Docker daemon để áp dụng cấu hình:",[245,893,895],{"className":247,"code":894,"language":249,"meta":250,"style":250},"sudo systemctl daemon-reload\nsudo systemctl restart docker\n",[203,896,897,906],{"__ignoreMap":250},[254,898,899,901,903],{"class":256,"line":257},[254,900,205],{"class":260},[254,902,603],{"class":263},[254,904,905],{"class":263}," daemon-reload\n",[254,907,908,910,912,915],{"class":256,"line":348},[254,909,205],{"class":260},[254,911,603],{"class":263},[254,913,914],{"class":263}," restart",[254,916,631],{"class":263},[186,918],{},[166,920,922],{"id":921},"bước-7-cảnh-báo-quan-trọng-về-docker-và-tường-lửa-ufw","Bước 7: Cảnh báo quan trọng về Docker và Tường lửa UFW",[171,924,925,926,929,930,178],{},"Một vấn đề phổ biến trên máy chủ Linux là Docker tự động can thiệp vào bảng định tuyến ",[203,927,928],{},"iptables"," để mở cổng (NAT), điều này có thể ",[175,931,932],{},"vượt qua các quy tắc của tường lửa UFW",[171,934,935,936,939,940,943,944,947],{},"Ví dụ: Nếu bạn dùng lệnh ",[203,937,938],{},"docker run -p 8080:80 nginx",", cổng ",[203,941,942],{},"8080"," sẽ mở công khai ra Internet ngay cả khi bạn chưa hề cho phép cổng 8080 trong UFW (",[203,945,946],{},"ufw allow 8080",").",[949,950,952],"h3",{"id":951},"giải-pháp-an-toàn-khuyến-nghị","Giải pháp an toàn khuyến nghị:",[196,954,955,988],{},[199,956,957,960,961,964,965],{},[175,958,959],{},"Chỉ bind cổng vào localhost",": Khi chạy các ứng dụng đứng sau Nginx Reverse Proxy, chỉ bind cổng vào ",[203,962,963],{},"127.0.0.1",":\n",[245,966,970],{"className":967,"code":968,"language":969,"meta":250,"style":250},"language-yaml shiki shiki-themes github-dark github-dark github-dark","ports:\n  - \"127.0.0.1:8080:80\"\n","yaml",[203,971,972,980],{"__ignoreMap":250},[254,973,974,978],{"class":256,"line":257},[254,975,977],{"class":976},"sRcpU","ports",[254,979,964],{"class":306},[254,981,982,985],{"class":256,"line":348},[254,983,984],{"class":306},"  - ",[254,986,987],{"class":263},"\"127.0.0.1:8080:80\"\n",[199,989,990,993,994,997],{},[175,991,992],{},"Sử dụng ufw-docker",": Cài đặt công cụ hỗ trợ đồng bộ ",[203,995,996],{},"ufw-docker"," nếu muốn quản lý các container thông qua UFW một cách tường minh.",[186,999],{},[166,1001,1003],{"id":1002},"bước-8-các-lệnh-docker-cơ-bản-cần-nhớ","Bước 8: Các lệnh Docker cơ bản cần nhớ",[171,1005,1006],{},"Dưới đây là bảng tổng hợp các lệnh Docker thường dùng trong quản trị hàng ngày:",[1008,1009,1010,1024],"table",{},[1011,1012,1013],"thead",{},[1014,1015,1016,1021],"tr",{},[1017,1018,1020],"th",{"align":1019},"left","Lệnh",[1017,1022,1023],{"align":1019},"Ý nghĩa",[1025,1026,1027,1038,1048,1058,1068,1078,1088],"tbody",{},[1014,1028,1029,1035],{},[1030,1031,1032],"td",{"align":1019},[203,1033,1034],{},"docker ps",[1030,1036,1037],{"align":1019},"Liệt kê các container đang chạy",[1014,1039,1040,1045],{},[1030,1041,1042],{"align":1019},[203,1043,1044],{},"docker ps -a",[1030,1046,1047],{"align":1019},"Liệt kê toàn bộ container (kể cả đã tắt)",[1014,1049,1050,1055],{},[1030,1051,1052],{"align":1019},[203,1053,1054],{},"docker images",[1030,1056,1057],{"align":1019},"Xem danh sách các image đã tải về máy",[1014,1059,1060,1065],{},[1030,1061,1062],{"align":1019},[203,1063,1064],{},"docker logs -f \u003Cid>",[1030,1066,1067],{"align":1019},"Xem log thời gian thực của container",[1014,1069,1070,1075],{},[1030,1071,1072],{"align":1019},[203,1073,1074],{},"docker exec -it \u003Cid> /bin/sh",[1030,1076,1077],{"align":1019},"Truy cập vào shell bên trong container",[1014,1079,1080,1085],{},[1030,1081,1082],{"align":1019},[203,1083,1084],{},"docker system df",[1030,1086,1087],{"align":1019},"Kiểm tra dung lượng ổ đĩa Docker đang chiếm",[1014,1089,1090,1095],{},[1030,1091,1092],{"align":1019},[203,1093,1094],{},"docker system prune -af",[1030,1096,1097],{"align":1019},"Dọn dẹp toàn bộ container, image thừa không dùng",[186,1099],{},[166,1101,1103],{"id":1102},"tổng-kết","Tổng kết",[171,1105,1106,1107,1110,1111,1114],{},"Bạn đã cài đặt thành công ",[175,1108,1109],{},"Docker Engine"," và ",[175,1112,1113],{},"Docker Compose V2"," bản chuẩn từ nhà phát triển, đồng thời cấu hình bảo mật non-root user và giới hạn log tự động. Bây giờ bạn đã sẵn sàng để triển khai các ứng dụng web, cơ sở dữ liệu và microservices một cách chuyên nghiệp và linh hoạt.",[1116,1117,1118],"style",{},"html pre.shiki code .sb7EE, html code.shiki .sb7EE{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#B392F0}html pre.shiki code .skqr8, html code.shiki .skqr8{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#9ECBFF}html pre.shiki code .sKJT9, html code.shiki .sKJT9{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sFJ4l, html code.shiki .sFJ4l{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#E1E4E8}html pre.shiki code .sGGCZ, html code.shiki .sGGCZ{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sWuGj, html code.shiki .sWuGj{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#F97583}html pre.shiki code .sRcpU, html code.shiki .sRcpU{--shiki-default:#85E89D;--shiki-dark:#85E89D;--shiki-light:#85E89D}",{"title":250,"searchDepth":348,"depth":348,"links":1120},[1121,1122,1123,1124,1125,1126,1127,1128,1129,1132,1133],{"id":168,"depth":348,"text":169},{"id":190,"depth":348,"text":191},{"id":239,"depth":348,"text":240},{"id":322,"depth":348,"text":323},{"id":380,"depth":348,"text":381},{"id":554,"depth":348,"text":555},{"id":672,"depth":348,"text":673},{"id":784,"depth":348,"text":785},{"id":921,"depth":348,"text":922,"children":1130},[1131],{"id":951,"depth":356,"text":952},{"id":1002,"depth":348,"text":1003},{"id":1102,"depth":348,"text":1103},[9,25],false,"md",{"src":109,"alt":110},{},{"title":101,"description":102},"Tự học Docker từ A-Z","how-to-install-docker-on-ubuntu-server","posts/how-to-install-docker-on-ubuntu-server",[105,10,106],"2026-08-22","AlsFXlAYjX",[1147,1152,1157,1162,1167,1172,1177,1182,1186,1191,1196,1201],{"path":5,"title":6,"categories":1148,"tags":1149,"date":16,"draft":1135,"slug":1150,"description":7,"image":1151},[9,10],[12,13,14,15],"incident-checklist",{"src":18,"alt":19},{"path":21,"title":22,"categories":1153,"tags":1154,"date":31,"draft":1135,"slug":1155,"description":23,"image":1156},[25,26],[28,29,30,10],"backup-postgres-docker",{"src":33,"alt":34},{"path":36,"title":37,"categories":1158,"tags":1159,"date":44,"draft":1135,"slug":1160,"description":38,"image":1161},[25,10],[41,42,43],"docker-compose-production",{"src":46,"alt":47},{"path":49,"title":50,"categories":1163,"tags":1164,"date":58,"draft":1135,"slug":1165,"description":51,"image":1166},[9,10],[54,55,56,57],"monitoring-server-basics",{"src":60,"alt":61},{"path":63,"title":64,"categories":1168,"tags":1169,"date":71,"draft":1135,"slug":1170,"description":65,"image":1171},[9,67],[10,69,70],"nginx-reverse-proxy",{"src":73,"alt":74},{"path":76,"title":77,"categories":1173,"tags":1174,"date":83,"draft":1135,"slug":1175,"description":78,"image":1176},[9,14],[81,82,10],"how-to-secure-a-vps",{"src":85,"alt":86},{"path":88,"title":89,"categories":1178,"tags":1179,"date":95,"draft":1135,"slug":1180,"description":90,"image":1181},[9,10],[93,94,43,41],"systemd-node-service",{"src":97,"alt":98},{"path":100,"title":101,"categories":1183,"tags":1184,"date":107,"draft":1135,"slug":1141,"description":102,"image":1185},[9,25],[105,10,106],{"src":109,"alt":110},{"path":112,"title":113,"categories":1187,"tags":1188,"date":118,"draft":1135,"slug":1189,"description":114,"image":1190},[9,14],[117,10,15],"ssh-key-authentication",{"src":120,"alt":121},{"path":123,"title":124,"categories":1192,"tags":1193,"date":131,"draft":1135,"slug":1194,"description":125,"image":1195},[9,14],[128,129,130,15],"ufw-firewall-basics",{"src":133,"alt":134},{"path":136,"title":137,"categories":1197,"tags":1198,"date":145,"draft":1135,"slug":1199,"description":138,"image":1200},[140,10],[142,143,144,30],"git-deploy-key",{"src":147,"alt":148},{"path":150,"title":151,"categories":1202,"tags":1203,"date":155,"draft":1135,"slug":1204,"description":152,"image":1205},[9],[106,105,15],"ubuntu-server-initial-setup",{"src":157,"alt":158},[1207,1208,1209],{"path":100,"title":101,"series":1140,"series_order":257,"date":107,"draft":1135,"slug":1141},{"path":36,"title":37,"series":1140,"series_order":348,"date":44,"draft":1135,"slug":1160},{"path":21,"title":22,"series":1140,"series_order":356,"date":31,"draft":1135,"slug":1155},1789616168142]