Tạo docker image Caddy Alpine
cuong@techmaster.vn
https://github.com/TechMaster/CaddyAlpine
Muốn thử ngay
git clone https://github.com/TechMaster/CaddyAlpine.git
cd CaddyAlpine
docker build sau đó khởi động caddy phục vụ web site tối giản ở http://locahost
./rebuild
./website
tạo container phục vụ web site tĩnh lưu ở host
./hostmd
tạo container phục vụ web site gồm các file Markdown
Caddy
- Viết bằng Go
- Rất dễ cấu hình, Caddyfile
- Host trang cá nhân, thử nghiệm
- Tốc độ 80% nginx, tiếp tục cải thiện
- Hỗ trợ HTTP/2
- Hỗ trợ multicore (nhờ Go)
- Có nhiều plugins, dễ dùng
Nginx
- Viết bằng C
- Cấu hình nhiều file *.conf
- Thích hợp môi trường sản xuất
- Vô địch tốc độ, bảo mật
- Hỗ trợ HTTP/2 một phần
- Có nhiều plugins, cấu hình khó
https://ferdinand-muetsch.de/caddy-a-modern-web-server-vs-nginx.html
Tái sử dụng -> cải tiến
- Trước khi viết Dockerfile hãy tìm trên Docker Hub xem có image phù hợp yêu cầu chưa. Có rồi đừng mất công viết lại
- Chưa vừa ý hãy học tập từ Dockerfile sẵn có, rồi cải tiến
docker run --name yobacaddy -d -p 80:2015 yobasystems/alpine-caddy
Tạo container dùng alpine-caddy của Yoba
web server chạy OK !
Cải tiến những điểm gì ?
- Giảm kích thước Docker image
- Giảm thời gian build image: docker build
- Giảm thời gian tạo mới container: docker run
- Tăng khả năng tái sử dụng image. Dùng để tạo ra các image khác nhau
- Tăng cường bảo mật
FROM yobasystems/alpine:amd64
LABEL maintainer "Dominic Taylor <dominic@yobasystems.co.uk>" architecture="AMD64/x86_64"
ARG plugins=http.git
RUN apk add --update openssh-client git tar curl
RUN curl --silent --show-error --fail --location \
--header "Accept: application/tar+gzip, application/x-gzip, application/octet-stream" -o - \
"https://caddyserver.com/download/linux/amd64?plugins=${plugins}" \
| tar --no-same-owner -C /usr/bin/ -xz caddy && \
chmod 0755 /usr/bin/caddy && \
addgroup -S caddy && \
adduser -D -S -H -s /sbin/nologin -G caddy caddy && \
/usr/bin/caddy -version
EXPOSE 80 443 2015
VOLUME /srv
WORKDIR /srv
ADD files/Caddyfile /etc/Caddyfile
ADD files/index.html /srv/index.html
RUN chown -R caddy:caddy /srv
USER caddy
ENTRYPOINT ["/usr/bin/caddy"]
CMD ["--conf", "/etc/Caddyfile"]
Đây là Dockerfile tại
https://github.com/yobasystems/alpine-caddy
Những điểm chưa hài lòng với Yobasystems/alpine-caddy
-
Cài thêm nhiều gói không cần thiết -> image size tăng
-
Lệnh cài đặt phức tạp không tự nhận biết kiến trúc CPU container đang chạy
docker exec -it yobacaddy /bin/sh
/srv $ whoami
caddy
/srv $ touch about.html
touch: about.html: Permission denied
/srv $ ls -all .
total 12
drwxr-xr-x 2 root root 4096 Dec 28 04:14 .
drwxr-xr-x 1 root root 4096 Dec 28 04:14 ..
-rw-r--r-- 1 root root 460 Dec 24 06:17 index.html
RUN chown -R caddy:caddy /srv
Yoba Dockerfile đổi chủ (owner) cho thư mục /srv từ root sang caddy
Khi vào container, user caddy vẫn không có quyền với thư mục /srv
FROM alpine:latest
MAINTAINER "Trinh Minh Cuong <cuong@techmaster.vn>"
RUN apk add --no-cache curl bash libcap \
&& curl https://getcaddy.com | bash -s personal \
&& chmod 0755 /usr/local/bin/caddy \
&& addgroup -S caddy \
&& adduser -D -S -H -s /sbin/nologin -G caddy caddy \
&& setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/caddy \
&& apk del curl bash libcap
EXPOSE 80 443 2015
#VOLUME /srv Phải bỏ lệnh này vì nó vô hiệu hoá RUN chown -R caddy:caddy /srv
WORKDIR /srv
COPY files/Caddyfile /etc/Caddyfile
COPY files/index.html /srv/index.html
RUN chown -R caddy:caddy /srv
USER caddy
ENTRYPOINT ["/usr/local/bin/caddy"]
CMD ["--conf", "/etc/Caddyfile"]
Dockerfile cải tiến
-
Cài curl, bash, libcap
-
Dùng curl tải file bash script cài đặt Caddy
-
Dọn dẹp sau cài đặt
- Tạo group và user caddy
- Cho phép file binary /usr/local/bin/caddy được chạy bởi non-root user
- Biến caddy thành chủ thư mục /srv
- Mở cổng 80, 443, 2015
- Đặt thư mục /srv là thư mục mặc định khi container chạy
- Chọn user caddy là user chạy docker container
- Copy index.html vào /srv, file cấu hình Caddyfile vào /etc
- Khởi động
Cài đặt Caddy
- curl: tải file cài đặt Caddy
- bash: thực thi bashscript cài đặt Caddy
curl https://getcaddy.com | bash -s personal
apk --no-cache add curl bash libcap
root hay non-root bên trong container
Mặc định Alpine container khởi động bằng user root
Quyền lực vô biên nhưng có nhiều rủi ro bảo mật:
root trong container cài - xoá phần mềm, kết nối ra ngoài
chmod 0755 /usr/local/bin/caddy
addgroup -S caddy
adduser -D -S -H -s /sbin/nologin -G caddy caddy
Cho phép mọi user khác đọc, thực thi
Tạo group caddy
Tạo caddy rồi cho vào group caddy
Giới hạn quyền non-root user đúng tài nguyên và thư mục cần thiết
Linux mặc định chỉ cho root chạy ứng dụng lắng nghe ở cổng thấp
Để ứng dụng chạy bởi non-root gắn được vào cổng thấp như 21, 23, 25, 80
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/caddy
setcap nằm trong gói libcap
VOLUME vô hiệu hoá lệnh phân quyền thư mục /srv cho user caddy
VOLUME /srv
RUN chown -R caddy:caddy /srv
Học được gì từ Caddy Alpine
- WORKDIR: thư mục làm việc mặc định
- EXPOSE : mở cổng từ container
- USER: chọn user khác root
- Tạo user, group trong Alpine, phân quyền thư mục
- Cho phép non-root user chạy ứng dụng ở cổng 80
Để tăng tốc build docker build
- Xếp những lệnh tạo layer ít thay đổi lên trên cùng
- Đừng cài gói phần mềm không cần thiết
- Chuyển những lệnh cần tinh chỉnh nhiều xuống cuối Dockerfile
- Không dùng quá lần apk add --no-cache
Viết script để tự động hoá việc build image và kiểm thử
Tôi viết script cho Fish Shell thực thi. Nếu bạn chỉ có Bash thì hãy đổi lại dòng đầu tiên thành
#!/bin/bash
#!/usr/local/bin/fish
docker stop caddy
docker rm caddy
docker build -t caddyalpine .
docker run --name caddy -p 80:80 -d caddyalpine
curl http://localhost
Build docker image sau đó dùng curl để kiểm tra web site có hoạt động không?
#!/usr/local/bin/fish
docker stop caddy
docker rm caddy
docker run --name caddy -v $PWD/DockerFarm:/srv/ -p 80:80 -d caddyalpine
curl http://localhost
Host web site tĩnh ở thư mục DockerFarm
chạy curl để kiểm tra
$PWD trả về đường dẫn thư mục hiện thời
#!/usr/local/bin/fish
docker stop caddy
docker rm caddy
docker run --name caddy -v $PWD/md/:/srv -p 80:80 -d caddyalpine --conf /srv/Caddyfile
curl http://localhost
Host web site chứa file Markdown
Để host được markdown, phải dùng Caddyfile lưu ở thư mục book map vào container là /srv
Caddyfile
:80
browse
markdown /
log stdout
errors stdout
:80
markdown / {
template blog templates/blog.html
template index templates/index.html
}
log stdout
errors stdout
phục vụ thư mục nếu không có file index.html
render file Markdown ra HTML
CaddyAlpine
By Trinh Minh Cuong
CaddyAlpine
Hướng dẫn từng bước tạo Dockerfile cho Caddy web server trên Alpine
- 1,266