在日常工作與生活中,對於那些重複、冗雜的任務,我們常常會找尋規律,製作模板。例如excel算賬,有了表格模板,只需要填入數據,即可幫助我們計算;但是在NAS使用中,我發現本來很簡潔優雅的Docker,被一些教程弄得囉嗦無比。一個簡單的軟件安裝,弄一大堆圖文步驟,很多同伴們看了教程就頭痛,只想找個現成的套件安裝。實際上docker優點就在於簡易分發和快速部署,往往docker-hub上作者早就寫好了一鍵命令安裝,卻很多人不去看,以至於把簡單的事情搞複雜了。
當然一個個安裝軟件,其實也不算高效,而Docker Compose 則讓你先寫好模板,然後批量運行多個Docker程序組的利器,有了它,你就能提前設定好參數,輕鬆把所有要用的軟件裝齊,並指定不同容器間的依賴關係。相信用過unraid系統的同志,可能對裏面的APPS商店有些印象,其實就是一個docker的模板庫。威聯通也有類似的功能,但是並沒有形成一套完善的商店生態?可能因為它有自己的應用商店,不想為docker添磚加瓦了。不過還好,威聯通改良了Docker Compose的使用體驗,讓你也能通過預製模板部署應用。
一、我該怎麼做?你只需做兩件事:1、編輯docker-compose.yml配置 ;2、運行docker-compose up。
別擔心,你不需要像linux用户那樣用ssh連接、sftp上傳文件,也不用在終端中敲擊命令,我發現威聯通已把Docker Compose放到了網頁界面,你只需複製粘貼,然後在線點一下“創建”,即可一鍵完成部署。下面看圖:
好了,按照上面兩圖的步驟,你就能等待docker應用自行部署了,非常簡單吧!部署完成的應用會顯示為三個方塊相疊的圖標,狀態為“APP”,如果有啥需要修改的地方,請點擊右邊倒數第二個按鈕,重新修改yaml配置。
那麼最重要的“yaml配置”怎麼得到?下面我來簡單介紹一下。
二、如何得到yaml配置1、打開docker-hub網站網址:https://hub.docker.com/ ,這裏匯聚了全球各種docker鏡像,網上很多著名開源項目都在此發佈鏡像以供安裝。我們在左上角輸入需要的軟件名,例如wordpress、jellyfin,按下回車鍵搜索。
2、查找yaml配置點開需要的鏡像後,往下翻網頁,一般中後部分會有一段docker-compose的代碼,這就是我們需要複製的yaml,有的官方介紹裏沒有這個,可以找找第三方(例如linuxserver)製作的docker介紹。
這些配置文件很好懂吧,一眼就能看出我們需要的修改的東西,我也沒學過docker-compose,是個純新手,但是一看它就明白了。
注:許多大型項目都會給出Docker Compose的配置,但是個人開發者往往還是喜歡用命令行。如果你在項目頁面只看到了docker run開頭的代碼,請參考我以前的一篇文章:
3、語法簡介dockers compose 需要一個定義docker服務、 網絡和數據卷的 YAML 語法文件 ,開頭用version: 'X.X' 定義語法版本。
image: 是我們需要拉取的docker鏡像,這次用過下次部署時就不需要重新下載了,很節約時間。
container_name:是容器名,為容器指定一個名稱,而不是使用默認的名稱。
environment:是環境變量,非常重要,一般我們設置權限、時區、數據庫、用户密碼都是依靠環境變量。 有了它,你就能解放自己的鼠標,不用每次部署後一個個點擊和輸入,而是靠docker-compose自動設置。
volumes:是數據文件存放位置,冒號前為本地路徑,冒號後為容器內路徑。 本地路徑可以用一個名字代替,在威聯通Container Station中的存儲空間裏可以看到它,也可以寫成絕對路徑,例如/share/Container/XXX。
ports:是網絡端口,冒號前是我們web訪問的實際端口,冒號後是容器內的端口。
devices:主要是掛載硬件設備,例如jellyfin硬件轉碼就會用到/dev/dri:/dev/dri。
depends_on:解決啓動順序的問題,一般容器啓動的順序是有要求的,如果直接從上到下啓動,必然會因為容器依賴問題而啓動失敗,使用depends_on命令可以讓數據庫等重要容器先運行,免得運行時出錯。
extra_hosts:就是往 /etc/hosts 文件中添加一些記錄,可以指定主機名對應的ip,也可以更改網站對應的ip,例如我們刮削電影時,往往會被dns污染,導致刮削失敗,這時可以直接更改host解決。
三、實戰演練1、多個依賴項(seafile)。
當我們使用私有網盤時,例如kodbox,seafile時,如果想提高性能,得先設置用户名和密碼,數據庫(mysql地址、密碼),緩存服務這些東西,如果依次安裝數據庫、緩存,然後又在網盤程序中設置數據、緩存,是不是感覺好麻煩?能不能直接先設置好這些東西,安裝後直接用呢?當然可以,下面配置參考了seafile官方文檔和威聯通上實際情況編寫:
version: '2.0'
services:
db:
image: mariadb
container_name: seafile-mysql
environment:
- MYSQL_ROOT_PASSWORD=db_dev # Requested, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
volumes:
- /share/Container/seafile/db:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
networks:
- seafile-net
memcached:
image: memcached
container_name: seafile-memcached
entrypoint: memcached -m 256
networks:
- seafile-net
seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "12401:80"
# - "12402:443" # If https is enabled, cancel the comment.
volumes:
- /share/Container/seafile/data:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=db_dev # Requested, the value shuold be root's password of MySQL service.
- TIME_ZONE=Asia/Shanghai # Optional, default is UTC. Should be uncomment and set to your local time zone.
- [email protected] # Specifies Seafile admin user, default is '[email protected]'.
- SEAFILE_ADMIN_PASSWORD=asecret # Specifies Seafile admin password, default is 'asecret'.
- SEAFILE_SERVER_LETSENCRYPT=false # Whether use letsencrypt to generate cert.
- SEAFILE_SERVER_HOSTNAME=127.0.0.1 # Specifies your host name.
depends_on:
- db
- memcached
networks:
- seafile-net
networks:
seafile-net:
我們把上面的配置文件粘貼進去,點擊創建,過一會兒seafile就安裝好了。數據庫和緩存服務也不需要你去單獨設置,甚至用户名密碼也提前設置好了:用户 [email protected] 密碼asecret,你也可以先改好配置文件再粘貼。
2、影音一條龍我們在建立自己的影音庫時,一般需要3類軟件:管理、刮削、展示,由於威聯通自帶的文件瀏覽器有些電影格式打不開,我一般使用 filebrowser(荒野無燈大佬的鏡像,支持硬解轉碼)瀏覽管理電影,tinymediamanager刮削電影,jellyfin展示電影海報牆以及轉碼播放。以前我是一個個安裝的,而且安裝好後,修改掛載路徑和參數很麻煩,但是通過docker compse,不僅一次性裝好這三個軟件,更重要的是直接解決了硬解轉碼(我掛載了dri,並以管理員身份運行jellyfin),和刮削失敗的問題(我為tinymediamanager添加了兩條host記錄,不翻牆也能連上tmdb服務器了),如果有啥要改動的地方,也能在網頁端一鍵修改。yaml配置如下:
version: '3'
services:
jellyfin:
image: linuxserver/jellyfin
container_name: jellyfin
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /share/Container/jellyfin:/config
- /share:/media
ports:
- 12501:8096
- 12502:8920
devices:
- /dev/dri:/dev/dri
extra_hosts:
- "api.themoviedb.org:13.249.146.88"
- "image.themoviedb.org:104.16.61.155"
restart: always
filebrowser:
image: 80x86/filebrowser:amd64
container_name: filebrowser
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /share:/myfiles
ports:
- 12503:8082
devices:
- /dev/dri:/dev/dri
restart: always
tinymediamanager:
image: romancin/tinymediamanager:latest
container_name: tinymediamanager
environment:
- GROUP_ID=0
- USER_ID=0
- TZ=Asia/Shanghai
- ENABLE_CJK_FONT=1
volumes:
- /share/Container/tinymediamanager/config:/config
- /share:/media
ports:
- 12504:5800
- 12505:5900
extra_hosts:
- "api.themoviedb.org:13.249.146.88"
- "image.themoviedb.org:104.16.61.155"
restart: always
也是一樣的方法,先粘貼yaml配置,然後點擊“創建”,過一會兒3個軟件都裝好了,是不是很快!
一直以來,NAS系統都在擴展自己的領域邊界,一方面建立應用商店,打造自己的生態;一方面也在引入企業級功能,並將其包裝到直觀的web界面中,最著名的例子就是Docker。商店做得最好的無疑是羣暉,各種第三方套件都有,而將docker包裝得較好的是unraid(每個容器都能按模板輕鬆設置,安裝好後還有圖標顯示)。
威聯通則是多頭押注,1、有官方應用商店,但一些套件介紹不去漢化,一些常用套件缺失,得靠第三方qnapclub。2、有docker+lxc環境,但功能似乎有待改進,例如安裝好後不能修改掛載路徑。3、有Docker Compose可導入模板,但是自帶的模板只有幾個,似乎並不打算多做點模板。
我希望明年再次打開Container Station時,裏面能提供各色docker模板一鍵安裝,而不是現在這樣藏在角落裏,等用户慢慢去探索用法。其實只要官方持續更新預製的compose,並像unraid那樣附帶圖標,社區用户也能提供自制模板,那麼威聯通的docker就能變得簡單易用,成為系統一大特色。