Tiếp tục với các bài viết về homelab, hôm nay sẽ là bài viết hướng dẫn cách cài đặt Docker và Docker Compose trên Ubuntu 20.04 LTS.
Mục Lục
I. Docker là gì?
Docker là một nền tảng ảo hoá mã nguồn mở giúp bạn build, test và deploy ứng dụng dưới dạng container trên mọi môi trường máy chủ, máy ảo khác nhau. Nó cho phép tạo môi trường độc lập, tách biệt khỏi hệ điều hành để khởi chạy hoặc phát triển ứng dụng. Môi trường ảo này được gọi là container.
Lợi ích của Docker so với sử dụng máy ảo VM
- Tắt / mở container chi trong vài giây.
- Dễ dàng thiết lập môi trường làm việc và chia sẻ cho người khác
- Container hoạt động độc lập, không ảnh hưởng đến container khác hoặc Host OS
- Tối ưu tài nguyên máy chủ nếu cần chạy nhiều ứng dụng độc lập so với việc tách riêng mỗi ứng dụng ra trên mỗi máy ảo.
Hiện tại mình đang dùng Docker trên máy ảo Hyper-V ở nhà để chạy Adguard Home, Omada Controller, Nginx Proxy Manager.
II. Cài đặt Docker
Cập nhật 08/01/2024: Bạn có thể thay thế toàn bộ các bước cài đặt Docker và Docker Compose bên dưới chỉ bằng 2 dòng lệnh sau
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Code language: Shell Session (shell)
1. Chuẩn bị hệ thống
Đầu tiên, cài đặt các package cần thiết để chuẩn bị cho việc cài đặt Docker.
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
Code language: Shell Session (shell)
Thêm Docker’s official GPG key vào hệ thống
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Code language: Nginx (nginx)
Thiết lập Docker repository
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Code language: Shell Session (shell)
Nếu bạn đang cài đặt cho Ubuntu 20.04 chạy trên Raspberry Pi, sử dụng lệnh này để thiết lập Docker repository
echo \
"deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Code language: Shell Session (shell)
2. Cài đặt Docker Engine
Sử dụng apt-get (hoặc apt) để cài đặt Docker vào máy
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
Code language: Shell Session (shell)
Để xác nhận Docker đã được cài đặt và hoạt động ổn định, kiểm tra bằng cách sau
sudo docker run hello-world
Code language: Dockerfile (dockerfile)
Nếu nhận được thông báo Hello from Docker! như hình dưới đây thì Docker đã sẵn sàng hoạt động
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
<https://hub.docker.com/>
For more examples and ideas, visit:
<https://docs.docker.com/get-started/>
Code language: Shell Session (shell)
3. Thêm user vào group Docker
Để quản lý Docker dưới tài khoản non-root (không cần phải chèn sudo
khi gõ lệnh), bạn cần gán tài khoản hiện tại vào user group Docker như sau
sudo groupadd docker
sudo usermod -aG docker $USER
Code language: Nginx (nginx)
III. Cài đặt Docker Compose
Tiếp theo, cài đặt thêm Docker Compose để sau này có thể khởi tạo các ứng dụng sử dụng nhiều container một cách nhanh chóng.
Docker Compose là một công cụ dùng để định nghĩa và chạy các chương trình Docker sử dụng nhiều container (multi-container). Với Docker Compose, chúng ta sử dụng một file YAML để thiết lập các service cần thiết cho chương trình. Cuối cùng, với một câu lệnh duy nhất, bạn sẽ thiết lập được 1 hệ thống hoàn chỉnh mà không cần phải chạy từng dòng lệnh mất thời gian.
1. Cài đặt trên máy tính Intel / AMD
Tải Docker Compose phiên bản mới nhất về máy
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Code language: Bash (bash)
Thiết lập quyền thực thi cho docker-compose và tạo symlink
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Code language: Bash (bash)
Kiểm tra lại docker-compose đã cài đặt thành công chưa bằng lệnh
docker-compose --version
2. Cài đặt trên ARM (Rapsberry Pi)
Với các máy tính sử dụng CPU nền tảng ARM như Raspberry Pi hay Oracle Cloud Ampere, bạn cần phải cài đặt Docker-Compose thông qua Python như dưới đây
# Install required packages
sudo apt update
sudo apt install -y python3-pip libffi-dev
# Install Docker Compose from pip (using Python3)
# This might take a while
sudo pip install docker-compose
Code language: Shell Session (shell)
Kiểm tra lại docker-compose đã cài đặt thành công chưa bằng lệnh
docker-compose --version
IV. Thiết lập WordPress với Docker Compose
Mình sẽ cho chạy 1 site WordPress trên máy với Docker Compose để thử nghiệm Docker Compose.
Đầu tiên, tạo thư mục riêng cho dự án
mkdir wordpress
cd wordpress
Code language: Bash (bash)
Tiếp theo tạo file docker-compose.yml
để cấu hình các container cần thiết để chạy WordPress
sudo nano docker-compose.yml
Code language: CSS (css)
Điền thông tin này vào và lưu lại
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
Code language: YAML (yaml)
Khởi tạo dự án
sudo docker-compose up -d
Code language: Nginx (nginx)
Đợi vài phút cho Docker xử lý các thao tác: tải container wordpress, mysql về máy và khởi tạo dự án.
Status: Downloaded newer image for wordpress:latest
Creating wordpress_db_1 ... done
Creating wordpress_wordpress_1 ... done
Code language: Bash (bash)
Khi thấy thông báo này nghĩa là WordPress đã sẵn sàng. Truy cập theo địa chỉ sau
http://<IP-Adress>:8000
Code language: JavaScript (javascript)
Port 8000 là port bạn khai báo trong file docker-compose.yml. Nếu server chưa dùng đến cổng 80, bạn có thể đổi chỗ dòng ports thành
ports:
- "80:80"
Code language: JavaScript (javascript)
Cho chạy lại docker-compose và truy cập trực tiếp WordPress theo địa chỉ IP
http://<IP-Adress>/
Code language: JavaScript (javascript)
Nếu không cần dùng WordPress nữa, bạn có thể tắt ứng dụng đi bằng lệnh
sudo docker-compose down
Code language: Nginx (nginx)
Nếu thấy sử dụng lệnh CLI khó nhớ, các bạn có thể cài đặt thêm Portainer để quản lý Docker.
Bác ơi em cài đến đoạn này thì nó cứ báo lỗi 157 gì đó bác giúp em với ạ
# Install required packages
sudo apt update
sudo apt install -y python3-pip libffi-dev
# Install Docker Compose from pip (using Python3)
# This might take a while
sudo pip install docker-compose
Bạn cài trên Docker trên nền tảng nào và chi tiết lỗi là gì. Phải ghi rõ ra thì mới biết để hỗ trợ được.
có cách nào điều chỉnh lượng tài nguyên mà docker dùng không ạ ? mình muốn container của mình dùng nhiều nhân và nhiều ram để chạy cho nhanh ! có cách nào ko ạ mình đang dùng ubuntu 20.04 LTS
Mặc định Docker không bị giới hạn tài nguyên CPU và RAM bạn nhé. Docker Container sẽ dùng toàn bộ CPU và RAM của Host. Bạn chỉ có thể điều chỉnh giới hạn RAM và CPU của Container nếu cần: https://phoenixnap.com/kb/docker-memory-and-cpu-limit
Cảm ơn bạn vì bài viết rất hay. Bạn có thể làm riêng 1 bài hướng dẫn đóng gói 1 site wordpress có sẵn (đủ hết file source + db) kèm PHPmyadmin để chạy trong 1 docker được không. Mình đang mắc ở chỗ này.
Cảm ơn bạn nhiều.
Bạn có thể xem qua hướng dẫn ở đây: https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-and-phpmyadmin-with-docker-compose-on-ubuntu-14-04
cảm ơn bạn.
Đã có hướng dẫn cách đóng gói website WordPress cho chạy trên Docker đây bạn: https://thuanbui.me/dong-goi-website-wordpress-chuyen-sang-chay-tren-nen-docker-openlitespeed/
Cảm ơn bạn rất nhiều <3 <3
Mình đã tạo thêm một tài khoản mới vào VPS, thêm các quyền hạn như trong bài này
https://thuanbui.me/cau-hinh-vps-mien-phi-oracle-cloud/
Mình cài đặt docker-compose bằng lệnh
sudo pip install docker-compose
Tuy nhiên nhận được thông báo kiểu “WARNING: Running pip as the ‘root’ user can result in broken permissions and conflicting”. Có google qua thì thấy mọi người khuyên nên dùng một tài khoản user khác cho Docker.
Mình thử check lệnh docker-compose –version thì có thể thấy được version nhưng lại không thấy thông tin bản build (buid unknow..)
Thêm nữa là với cảnh báo trên, mình không thể gỡ được docker-compose bằng pip uninstall.
Mình luôn nhận được thông báo skip docker-compose
Mình có nên dùng một tài khoản khác (không có quyền admin ) để dùng docker không ? Nếu có thể dùng tk đó thì các dịch vụ có chạy bình thường không ?
Mình thường xuyên dùng tài khoản root để chạy docker, và chưa gặp vấn đề gì cả. Bạn có thể thử cài lại bằng 2 dòng lệnh sau cho nhanh gọn
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Câu lệnh trên để cài docker đúng không ạ ?
Ý mình là mình gặp vấn đề với docker-compose
Phiên bản Docker mới nhất đã đi kèm Compose, nên chỉ cần cài bằng lệnh đó là bạn đã sẽ có Docker lẫn Docker Compose.
Cho mình hỏi, nếu mình chỉnh DNS trong VM, ví dụ về google chẳng hạn, có vi phạm chính sách Free OCI không hả bác./
Mình thử google mà không ra ?
Thay đổi DNS không vi phạm gì hết bạn nhé. Nếu bạn đang dùng Free VPS của Oracle Cloud thì khuyến khích chỉ dùng chơi, không nên cho dữ liệu quan trọng lên VPS vì Oracle thường xuyên khóa tài khoản Free mà không cần lý do. Nhiều người đã dính rồi.
Cảm ơn bác
Mình cũng chơi chơi thôi chứ cũng mua server cá nhân riêng rồi. Đang lò mò cài đặt theo như trên blog của bác.
Cảm ơn chia sẻ của anh!!!
Em đã cài được proxmox, cài thêm các LXC như docker, plex, homebridge…
Cho em hỏi một chút làm sao để thiết lập được SSH trực tiếp từ ngoài internet vào thẳng docker mà không thông qua việc SSH vào proxmox rồi attach sang địa chỉ của docker, vì em muốn share cho bạn sử dụng docker cùng nhưng không muốn đưa toàn bộ pass của homelab cho bạn ấy
Thao tác có gì sai rồi em ơi. Sao lại SSH vào Proxmox rồi attach qua LXC? Muốn truy cập vào LXC thì cấu hình SSH Server cho nó rồi SSH từ ngoài trực tiếp vào LXC luôn. Muốn share cho bạn thì tạo cái Wireguard VPN, kêu nó truy cập vào VPN rồi sau đó SSH vào IP nội bộ của LXC / VM đang chạy Docker
Cảm ơn anh đã phản hồi!!!
Hiện tại em đang chạy cả SSH của NAS (cổng 1111) và SSH của proxmox (cổng 22) trên IP public đó. Cho em hỏi:
1. có thể đổi được cổng SSH của proxmox không anh, em chưa tìm thấy phương án đổi cổng
2. IP private proxmox: 192.168.1.68, IP private của docker: 192.168.1.203, vậy muốn truy cập SSH trực tiếp vào docker LXC thì làm thế nào ạ.
Hiện tại chu trình sử dụng của em là:
từ internet > SSH tới địa chỉ IP public của promox qua cổng 22 > xong gõ lệnh “pct enter 103” (103 là ID của docker) > thì mới vào được docker.
Mong anh chỉ giáo, em cảm ơn
Google ra hết nhé.
1. Google “change ssh port linux”
2. Truy cập SSH vào LXC y hệt như truy cập vào Proxmox, thay IP của Proxmox thành IP của LXC là xong. https://bobcares.com/blog/ssh-to-lxc-containers/
Cảm ơn anh, em đã làm được rồi!!!
Các vấn đề được a giải đáp luôn mạch lạc và rõ ràng.
Trong cái /etc/ssh có tới 2 file config ssh là ssh_config và sshd_config, e chỉ chỉnh mỗi file đầu, mà file sau mới là file đúng