發(fā)表日期:2022年3月11日 · 更新于 2022年3月12日
[TOC]
適用范圍
??本教程基于在Ubuntu Server 20.04 LTS上使用Docker部署Firefly III v5.6.16的實踐,在其他平臺或其他Linux未做測試。官方文檔中還有使用Composer安裝的教程,但筆者使用該方法未成功。本文中的MySQL也在Docker容器中運行,如需連接到宿主機的數(shù)據(jù)庫或其他遠(yuǎn)程數(shù)據(jù)庫,請查閱Docker官方文檔自行配置。
先決條件
??本教程默認(rèn)讀者具有一定Linux和Docker基礎(chǔ),例如Linux用戶管理、Linux文件管理、Linux權(quán)限管理、數(shù)據(jù)庫命令行操作、Docker容器等。
??開始之前,請使用一個非root用戶登錄到Linux,并且由該用戶執(zhí)行本文正文所有的操作,如果你還沒有普通用戶,可使用root用戶創(chuàng)建普通用戶,創(chuàng)建普通用戶命令如下:
# 新建小明用戶,-m選項表示自動創(chuàng)建用戶的主目錄
useradd -m Xiaoming
# 設(shè)置小明的密碼
passwd Xiaoming
# 授予小明sudo權(quán)限
usermod -a -G sudo Xiaoming
正文
Firefly III簡介
??Firefly III是一個個人財務(wù)的管理器。它是自我托管和開源的。這意味著它是免費的,沒有廣告,沒有跟蹤。它可以幫助你跟蹤支出、收入、預(yù)算和兩者之間的一切。它支持信用卡、共享家庭賬戶和儲蓄賬戶。它還有許多整潔的財務(wù)報告可用。通過記錄你的支出和收入,你可以做出相應(yīng)的預(yù)算并節(jié)省資金?;ɡ锖诘摹?/p>
先安裝docker引擎
?為什么先安裝Docker Engine?參見本文的“適用范圍”。
本節(jié)參考自Install Docker Engine on Ubuntu | Docker Documentation
步驟(共4個):
-
卸載舊的
Docker如果安裝了舊版本的
Docker,請卸載它們,在終端執(zhí)行:sudo apt-get remove docker docker-engine docker.io containerd runc此命令如果報告未安裝這些包,則沒關(guān)系。
-
通過設(shè)置
Docker存儲庫并從中進(jìn)行安裝,以便安裝和升級(官方推薦的方法)2.1. 設(shè)置存儲庫,終端執(zhí)行以下兩條命令。
# 第一條,更新包索引 sudo apt-get update # 第二條,設(shè)置Docker存儲庫 sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release圖1-設(shè)置Docker存儲庫2.2. 添加 Docker 的官方 GPG 密鑰,終端執(zhí)行:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg2.3. 在終端使用以下命令設(shè)置穩(wěn)定存儲庫:
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 -
安裝Docker引擎,終端執(zhí)行以下兩條命令:
# 第一條 sudo apt-get update # 第二條 sudo apt-get install docker-ce docker-ce-cli containerd.io -
安裝后的配置,以非root用戶身份管理Docker,終端執(zhí)行:
# 在此之前,請不要使用sudo來執(zhí)行docker命令 # 將用戶添加到組,$USER指向當(dāng)前用戶 sudo usermod -aG docker $USER # 激活對組的更改,完成這兩個命令后請注銷登錄,再重新登錄使之生效 newgrp docker # 開機啟動docker sudo systemctl enable docker.service sudo systemctl enable containerd.service如果要更新Docker引擎,請參考官方文檔。
使用Docker部署MySQL服務(wù)器
??本節(jié)參考Basic Steps for MySQL Server Deployment with Docker以及Mysql - Official Image | Docker Hub
步驟(共3個):
-
拉取鏡像,其中
latest標(biāo)簽是用來指定最新版本的(目前是8.0.28),執(zhí)行:docker pull mysql/mysql-server:latest要顯示已下載的鏡像,請在終端執(zhí)行:
docker images圖2-顯示已下載的鏡像上圖可以看到,拉取的MySQL鏡像名為
mysql/mysql-server。 -
從鏡像啟動MySQL容器并初始化該容器
創(chuàng)建卷給MySQL容器使用,終端執(zhí)行:
docker volume create mysql-data要啟動新的Docker容器,可在終端執(zhí)行(方法1):
docker run --name=給容器起個名 -v mysql-data:/var/lib/mysql --restart on-failure -d 鏡像名:標(biāo)簽例如:
docker run --name=mysql666 -v mysql-data:/var/lib/mysql --restart on-failure -d mysql/mysql-server:latest
??如果你不小心敲錯命令了,停止該容器并刪除該容器,然后重新創(chuàng)建新的容器。
終端使用docker ps命令,顯示在正在運行的容器列表:

停止指定容器:docker stop mysql666;刪除指定容器:docker rm mysql666
??除了上面的方法啟動容器,你也可以在啟動新的容器的適合指定數(shù)據(jù)庫root用戶的密碼(方法2),命令格式如下:
docker run --name 給容器起個名 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=你的密碼 -d 鏡像名:標(biāo)簽
例如:
docker run --name mysql666 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=.22pT*Z\&cO1 -d mysql/mysql-server:latest
要監(jiān)視容器的日志輸出,可執(zhí)行命令docker logs mysql666。
??在方法1中,啟動后 容器初始化可能需要一些時間,在docker ps命令的輸出中,容器的STATUS為含有healthy時,表明服務(wù)器準(zhǔn)備就緒可供使用(上面圖3),初始化過程中MySQL為root用戶生成的隨機密碼,等它初始化完成后,使用以下命令查看生成的密碼:
docker logs mysql666 2>&1 | grep GENERATED

在將mysql客戶端連接到服務(wù)器(見下面)后,必須通過發(fā)出以下語句來重置服務(wù)器root密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY '您的新密碼';
?附:可以使用 docker exec -it 命令在容器內(nèi)啟動 bash shell,例如
docker exec -it mysql666 bash
?附:刪除容器命令docker rm 容器名(要先停止它再刪除),如果希望同時刪除服務(wù)器數(shù)據(jù)目錄的數(shù)據(jù)卷,請將-v選項添加到docker rm命令中。
-
啟動
MySQL客戶端并將其連接到MySQL服務(wù)器,執(zhí)行后它會提示輸入密碼,輸入上述生成的那個即可。docker exec -it mysql666 mysql -uroot -p圖5-連接到MySQL服務(wù)器輸入密碼連接后,馬上更改
root用戶初始密碼:ALTER USER 'root'@'localhost' IDENTIFIED BY 'pqyry;Bl8C7A32B~kHUD';圖6-上更改數(shù)據(jù)庫root用戶初始密碼"Query OK"表明更改成功。
Firefly III不建議使用數(shù)據(jù)庫的root用戶連接,下面將創(chuàng)建新的MySQL用戶、新的數(shù)據(jù)庫,給Firefly III使用:-- 創(chuàng)建數(shù)據(jù)庫firefly CREATE DATABASE IF NOT EXISTS firefly DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- 創(chuàng)建數(shù)據(jù)庫用戶fireflyuser,密碼為xW9CoF8A666 CREATE USER 'fireflyuser'@'%' IDENTIFIED BY 'xW9CoF8A666'; -- 授權(quán) grant all on firefly.* to "fireflyuser"@"%";圖7-創(chuàng)建數(shù)據(jù)庫和用戶
然后exit返回終端,測試fireflyuser能不能連接:docker exec -it mysql666 mysql -ufireflyuser -p圖8-測試fireflyuser能不能連接到此數(shù)據(jù)庫準(zhǔn)備工作結(jié)束,接下來安裝
Firefly III。
使用Docker部署Firefly III
??本節(jié)參考Firefly III 官方文檔 (firefly-iii.org)
步驟(共4個):
-
創(chuàng)建用于持久存儲上傳的文件和導(dǎo)出的數(shù)據(jù)的
卷。docker volume create firefly_iii_upload -
使用命令
docker ps查看MySQL容器的id。
圖9-查看MySQL容器的id查看
MySQL容器的IPdocker inspect MySQL容器的id | grep IPAddress將此ip記住或復(fù)制下來備用,我這里是
172.17.0.2。在終端執(zhí)行以下命令,生成一串32個字符的隨機字符串備用。
head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo每次執(zhí)行都不一樣,我這里是
AgXj2E9M0PGhRqhzoMtycqDRkNwIRHjO。 -
啟動
Firefly III容器下面命令將拉取
Firefly III最新版鏡像并啟動Firefly III容器,請小心填寫所需值,如不小心填錯后執(zhí)行,請停止并刪除錯誤的容器,然后重試。# docker pull fireflyiii/core:latest docker run -d \ -v firefly_iii_upload:/var/www/html/storage/upload \ -p 80:8080 \ -e APP_KEY=你的32位隨機字符串 \ -e DB_HOST=MySQL容器的IP \ -e DB_PORT=3306 \ -e DB_CONNECTION=mysql \ -e DB_DATABASE=firefly所使用的數(shù)據(jù)庫名 \ -e DB_USERNAME=firefly所使用的數(shù)據(jù)庫用戶 \ -e DB_PASSWORD=該數(shù)據(jù)庫用戶的密碼 \ fireflyiii/core:latest例如我的:
docker run -d \ -v firefly_iii_upload:/var/www/html/storage/upload \ -p 80:8080 \ -e APP_KEY=AgXj2E9M0PGhRqhzoMtycqDRkNwIRHjO \ -e DB_HOST=172.17.0.2 \ -e DB_PORT=3306 \ -e DB_CONNECTION=mysql \ -e DB_DATABASE=firefly \ -e DB_USERNAME=fireflyuser \ -e DB_PASSWORD=xW9CoF8A666 \ fireflyiii/core:latest執(zhí)行
docker ps以查看正在運行的容器。
圖10-查看正在運行的容器
-
初始化
Firefly III的數(shù)據(jù)庫進(jìn)入容器的
shell,并切換到Firefly III所在目錄。命令格式:
docker exec -it 容器名 bash。例如我的:
docker exec -it zen_noether bash圖11-進(jìn)入容器的shell
??可以看到,進(jìn)入后就是Firefly III項目根目錄,在容器里的shell中執(zhí)行以下3條命令初始化數(shù)據(jù)庫:
php artisan migrate:refresh --seed
php artisan firefly-iii:upgrade-database
php artisan passport:install
部分截圖:

執(zhí)行exit返回終端。
此時可以訪問服務(wù)器地址查看
http://服務(wù)器IP/
或
http://服務(wù)器IP/firefly-iii/
如圖

結(jié)語
??筆者剛接觸Docker,并不很了解Docker。但了解到Docker容器的啟動順序很重要:默認(rèn)情況下Docker會為每個容器分配一個172.17.0.x的IP地址(內(nèi)網(wǎng)),先啟動的容器先分配地址,因此容器啟動順序?qū)⒂绊懫銲P地址。
??而本文中Firefly III的啟動命令包含了數(shù)據(jù)庫主機地址(DB_HOST),這個寫死的,讀者可以嘗試更改Firefly III配置,使其連接宿主機的數(shù)據(jù)庫或遠(yuǎn)程的數(shù)據(jù)庫,而不必安裝MySQL容器,筆者也將學(xué)習(xí)Docker Networking的知識,以便進(jìn)行這方面的嘗試。
?? Firefly III教程的安裝部分到這里便告一段落了,Firefly III的教程的使用部分正在編寫,敬請期待。
最后,原創(chuàng)不易,請規(guī)范轉(zhuǎn)載。








