Quản lý file docker-compose.yml cho nhiều môi trường

From: https://www.docsity.com/en/news/it/funny-aspects-related-developers/

Trong quá trình làm việc Docker của mình thì docker-compose là một phần không thể thiếu được. Compose giúp định nghĩa và chạy một application với nhiều container (multi-container application). Chỉ với 1 file yaml thiết định và docker-compose up mình có thể dễ dàng tạo và chạy toàn bộ các services phục vụ cho việc chạy ứng dụng như Mysql, Fluentd, Redis, Nginx,..

Compose là một công cụ tuyệt với không chỉ dùng cho development, testing, staging environments, mà còn ứng dụng trong CI workflows.

Cũng giống như các công nghệ khác, luôn có rất nhiều điều để tìm hiểu về Docker, thường có 2 cách tiếp cận broad strokes (học rộng) and deep dives (học sâu).

Nhưng cách tiếp cận cá nhân của mình là tìm hiểu 1 lượng kiến thức vừa đủ để tự tin bắt đầu sử dụng một công nghệ, và để môi trường thực tiễn dạy cho mình những gì cần học tiếp theo. Phần lớn của việc sử dụng Docker trong môi trường thực tế.

Hôm nay mình sẽ chia sẻ cách quản lý file docker-compose.yml cho nhiều môi trường khác nhau như thế nào.

Mình dùng docker-compose file cho môi trường làm việc ở local, và môi trường staging, production. Bài toán thường gặp ở đây là mỗi môi trường khác nhau yêu cầu thiết định khác nhau. Ví dụ:

  • Port dùng ở local thường không được dùng ở môi trường production vì lý do security,…
  • Phải chạy nhiều docker-compose trên cùng một server
  • Cần thiết định logging driver cho từng môi trường khác nhau. Ví dụ trên production dùng AWS Cloudwatch logs, …
  • Ở môi trường production thì volume path khác
  • Dùng các cloud storage như RDS trên môi trường production, …

Rất may mắn là Docker-compose hỗ trợ cho các nhu cầu này bằng định nghĩa file docker-compose.yml

Compose supports two methods of sharing common configuration:

– Extending an entire Compose file by using multiple Compose files

– Extending individual services with the extends field (for Compose file versions up to 2.1)

https://docs.docker.com/compose/extends/

Có 2 cách tiếp cận
1) Tạo 1 file gốc docker-compose.yml base và nhiều file docker-compose cho các môi trường khác nhau để override các thiết định của file gốc

2) Định nghĩa file của từng service và tạo nhiều file docker-compose cho các môi trường khác nhau, các file này dùng cấu trúc extends để tùy chỉnh thiết định của từng service cho các môi trường.

Cá nhân mình thích cách 1) hơn vì nó tổng hợp các thiết định của môi trường vào từng file nên quản lý dễ dàng hơn. Chắc có lẽ mình đã quá quen với việc sử dụng .env để tùy biến các môi trường web rồi.

Việc sử dụng nhiều docker-compose file cho phép người dùng có thể override thiết định cho các môi trường staging, production.

Khi cần override thiết định cho môi trường staging thì mình sẽ thêm 1 file docker-compose.staging.yml, và viết các thiết định cần override vào đấy

Mình sẽ chuẩn bị 2 file

docker-compose.yml

# docker-compose.yml
web:
  image: example/my_web_app:latest
  depends_on:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

docker-compose.staging.yml với các thiết định volume, port, biến môi trường

web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  environment:
    DEBUG: 'true'

db:
  command: '-d'
  ports:
    - 5432:5432

cache:
  ports:
    - 6379:6379

Sau đấy chỉ cần chạy lệnh

docker-compose \
    -f docker-compose.yml \
    -f docker-compose.staging.yml \
    up -d

Khi chạy thì compose sẽ tự động override các thiết định trong docker-compose.yml bằng các thiết định trong docker-compose.staging.yml

Thật tuyệt vời đúng không? Bây giờ, các file tùy chỉnh cho môi trường sẽ được quản lý riêng biệt, có thể được lưu trữ trong một repo git khác hoặc được quản lý bởi một nhóm khác. Như thế vừa đảm bảo các thông sensitive, các file docker-compose.staging.yml, docker-compose.production.yml sẽ được team DevOps quản lý riêng biệt với team phát triển.

Happy hacking! Happy Docker life.

Additional, Other Kubernetes related topics is here. https://tuantranf.me/tag/kubernetes/

[TIL] Xử lý lỗi Helm version mismatch

Xử lý lỗi khi bị lệch version Helm ở client và server.

 $ helm upgrade --install --recreate-pods podder-pipeline -f /home/ubuntu/values.yml helm_templates/template --namespace default
 UPGRADE FAILED
 Error: incompatible versions client[v2.16.1] server[v2.14.3]
 Error: UPGRADE FAILED: incompatible versions client[v2.16.1] server[v2.14.3]
 $ helm version
 Client: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
 Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}

Tham khảo:
How to downgrade helm version on server and client – jyotir bhandari – Medium

Xử lý:

 $ curl -L https://git.io/get_helm.sh | bash -s -- --version v2.14.3

Thiết định cho editor Sublime text 2

Sublime text 2 là một editor hiện đang rất hot, được rất nhiều người tin dùng.Với phong cách Simple is the best, Sublime được nhiều người yêu thích vì sự gọn nhẹ, đơn giản và hơn nữa là thư viện các chức năng hỗ trợ đa dạng không thua kém gì các IDE khác.

Cài đặt và thiết định  ban đầu:

Homepage :Sublime Text 2 – Dev Builds
Các thiết định ban đầu:
Sublime text2 > Preference > Settings User (command + ,)
Sẽ hiển thị file Preferences.sublime_settings. Nội dung thiết định cơ bản
{
// Hiển thị in đậm các thư mục
"bold_folder_labels": true,
// Sử dụng theme màu
"color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
// Hiển thị hightlight tab đang edit
"highlight_modified_tabs": true,
"ignored_packages":
[
],
// check spell tiếng Anh
"spell_check": false
}

Quản lý package

Package là gì?

Package là những tiện ích của Sublime như là tiện ích gợi ý từ khoá các ngôn ngữ, quanr lý file. Là các mã nguồn mở được phát triển độc lập với sublime.

Package Control

Package control là tiện ích giúp quản lý các package (cài đặt/thiết định/ gỡ bỏ/update).
Đầu tiên sẽ cài đặt chức năng này trước.
Chọn View > Show Console (Ctrl + shift + @ / Cmd + shift + @ )để hiển thị console của sublime.
sublime3
Nhập lệnh cài đặt như sau
import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
tham khảo Installation – Sublime Package Control – a Sublime Text 2 Package Manager by wbond
Sau khi khởi động lại Sublime, ấn phím tắt Ctrl + Shift + P /Cmd + shift + P để khởi động Command palette của sublime.
sublime5
Tại Command palette PackageControl để hiển thị các lệnh quản lý package.
Package Control: Install Package để cài đặt tiện ích mới.Nhập tên tiện ích vào cửa sổ để tìm và cài đăt tiện ích.
sublime6
Tương tự có thể gỡ bỏ các tiện ích bằng lệnh PackageControl:Remove

Các tiện ích mình dùng để code nodejs + backbonejs

– AndyJS Gợi ý JavaScript jQuery
– Backbone.js Gợi ý Backbone.js
– Git Quản lý Git
– EJS ejs template engine
– Nodejs Hỗ trợ gợi ý Nodejs。
– Sublime Check cú pháp Javascript jsLint
– BracketHighlighter Highlight các dấu ngoặc (),[],{}m tags
– DocBlockr Hỗ trợ viết comment khi code
Ngoài ra, các tiện ích có thể tham khảo thêm ở trang
http://wbond.net/sublime_packages/community

Các chức năng tiện lợi cần nhớ của sublime

  •  Thiết định theme màu, font :Sublime Text2 > Preferences > Color Scheme
  • Command Palette : ctrl / command + shift + P
  • Chia màn hình : ctrl/command + alt + 1〜4 (View > layout)
  • Goto anywhere : ctrl/command + p    @function_name  :line_num, #text