發(fā)表日期:2022年3月11日 · 更新于 2022年3月12日
[TOC]
適用范圍
??本教程基于在Ubuntu Server 20.04 LTS
上使用Docker部署Firefly III
v5.6.16
的實(shí)踐芭概,在其他平臺(tái)或其他Linux
未做測(cè)試穿挨。官方文檔中還有使用Composer
安裝的教程,但筆者使用該方法未成功。本文中的MySQL
也在Docker容器
中運(yùn)行品追,如需連接到宿主機(jī)的數(shù)據(jù)庫(kù)或其他遠(yuǎn)程數(shù)據(jù)庫(kù)筐摘,請(qǐng)查閱Docker官方文檔自行配置。
先決條件
??本教程默認(rèn)讀者具有一定Linux
和Docker
基礎(chǔ)岔乔,例如Linux用戶管理酥筝、Linux文件管理、Linux權(quán)限管理雏门、數(shù)據(jù)庫(kù)命令行操作嘿歌、Docker容器等。
??開(kāi)始之前茁影,請(qǐng)使用一個(gè)非root用戶登錄到Linux搅幅,并且由該用戶執(zhí)行本文正文所有的操作,如果你還沒(méi)有普通用戶呼胚,可使用root用戶創(chuàng)建普通用戶茄唐,創(chuàng)建普通用戶命令如下:
# 新建小明用戶,-m選項(xiàng)表示自動(dòng)創(chuàng)建用戶的主目錄
useradd -m Xiaoming
# 設(shè)置小明的密碼
passwd Xiaoming
# 授予小明sudo權(quán)限
usermod -a -G sudo Xiaoming
正文
Firefly III簡(jiǎn)介
??Firefly III是一個(gè)個(gè)人財(cái)務(wù)的管理器。它是自我托管和開(kāi)源的沪编。這意味著它是免費(fèi)的呼盆,沒(méi)有廣告,沒(méi)有跟蹤蚁廓。它可以幫助你跟蹤支出访圃、收入、預(yù)算和兩者之間的一切相嵌。它支持信用卡腿时、共享家庭賬戶和儲(chǔ)蓄賬戶。它還有許多整潔的財(cái)務(wù)報(bào)告可用饭宾。通過(guò)記錄你的支出和收入批糟,你可以做出相應(yīng)的預(yù)算并節(jié)省資金】疵花里胡哨的徽鼎。
先安裝docker引擎
?為什么先安裝Docker Engine?參見(jiàn)本文的“適用范圍”弹惦。
本節(jié)參考自Install Docker Engine on Ubuntu | Docker Documentation
步驟(共4個(gè)):
-
卸載舊的
Docker
如果安裝了舊版本的
Docker
否淤,請(qǐng)卸載它們,在終端執(zhí)行:sudo apt-get remove docker docker-engine docker.io containerd runc
此命令如果報(bào)告未安裝這些包棠隐,則沒(méi)關(guān)系石抡。
-
通過(guò)設(shè)置
Docker存儲(chǔ)庫(kù)
并從中進(jìn)行安裝,以便安裝和升級(jí)(官方推薦的方法)2.1. 設(shè)置存儲(chǔ)庫(kù)助泽,終端執(zhí)行以下兩條命令汁雷。
# 第一條,更新包索引 sudo apt-get update # 第二條报咳,設(shè)置Docker存儲(chǔ)庫(kù) sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
圖1-設(shè)置Docker存儲(chǔ)庫(kù)2.2. 添加 Docker 的官方 GPG 密鑰侠讯,終端執(zhí)行:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
2.3. 在終端使用以下命令設(shè)置穩(wěn)定存儲(chǔ)庫(kù):
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í)行:
# 在此之前,請(qǐng)不要使用sudo來(lái)執(zhí)行docker命令 # 將用戶添加到組岩臣,$USER指向當(dāng)前用戶 sudo usermod -aG docker $USER # 激活對(duì)組的更改溜嗜,完成這兩個(gè)命令后請(qǐng)注銷登錄,再重新登錄使之生效 newgrp docker # 開(kāi)機(jī)啟動(dòng)docker sudo systemctl enable docker.service sudo systemctl enable containerd.service
如果要更新Docker引擎架谎,請(qǐng)參考官方文檔炸宵。
使用Docker部署MySQL服務(wù)器
??本節(jié)參考Basic Steps for MySQL Server Deployment with Docker以及Mysql - Official Image | Docker Hub
步驟(共3個(gè)):
-
拉取鏡像,其中
latest
標(biāo)簽是用來(lái)指定最新版本的(目前是8.0.28)谷扣,執(zhí)行:docker pull mysql/mysql-server:latest
要顯示已下載的鏡像土全,請(qǐng)?jiān)诮K端執(zhí)行:
docker images
圖2-顯示已下載的鏡像上圖可以看到捎琐,拉取的MySQL鏡像名為
mysql/mysql-server
。 -
從鏡像啟動(dòng)MySQL容器并初始化該容器
創(chuàng)建卷給MySQL容器使用裹匙,終端執(zhí)行:
docker volume create mysql-data
要啟動(dòng)新的Docker容器瑞凑,可在終端執(zhí)行(方法1):
docker run --name=給容器起個(gè)名 -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
??如果你不小心敲錯(cuò)命令了,停止該容器并刪除該容器概页,然后重新創(chuàng)建新的容器籽御。
終端使用docker ps
命令,顯示在正在運(yùn)行的容器列表:
停止指定容器:docker stop mysql666
惰匙;刪除指定容器:docker rm mysql666
??除了上面的方法啟動(dòng)容器技掏,你也可以在啟動(dòng)新的容器的適合指定數(shù)據(jù)庫(kù)root用戶的密碼(方法2),命令格式如下:
docker run --name 給容器起個(gè)名 -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中,啟動(dòng)后 容器初始化可能需要一些時(shí)間秃臣,在docker ps
命令的輸出中涧衙,容器的STATUS
為含有healthy
時(shí)哪工,表明服務(wù)器準(zhǔn)備就緒可供使用(上面圖3)奥此,初始化過(guò)程中MySQL為root
用戶生成的隨機(jī)密碼,等它初始化完成后雁比,使用以下命令查看生成的密碼:
docker logs mysql666 2>&1 | grep GENERATED
在將mysql
客戶端連接到服務(wù)器(見(jiàn)下面)后稚虎,必須通過(guò)發(fā)出以下語(yǔ)句來(lái)重置服務(wù)器root
密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY '您的新密碼';
?附:可以使用 docker exec -it
命令在容器內(nèi)啟動(dòng) bash
shell,例如
docker exec -it mysql666 bash
?附:刪除容器命令docker rm 容器名
(要先停止它再刪除)偎捎,如果希望同時(shí)刪除服務(wù)器數(shù)據(jù)目錄的數(shù)據(jù)卷
蠢终,請(qǐng)將-v
選項(xiàng)添加到docker rm
命令中。
-
啟動(dòng)
MySQL
客戶端并將其連接到MySQL
服務(wù)器茴她,執(zhí)行后它會(huì)提示輸入密碼寻拂,輸入上述生成的那個(gè)即可。docker exec -it mysql666 mysql -uroot -p
圖5-連接到MySQL服務(wù)器輸入密碼連接后丈牢,馬上更改
root
用戶初始密碼:ALTER USER 'root'@'localhost' IDENTIFIED BY 'pqyry;Bl8C7A32B~kHUD';
圖6-上更改數(shù)據(jù)庫(kù)root用戶初始密碼"Query OK"表明更改成功祭钉。
Firefly III
不建議使用數(shù)據(jù)庫(kù)的root
用戶連接,下面將創(chuàng)建新的MySQL
用戶己沛、新的數(shù)據(jù)庫(kù)慌核,給Firefly III
使用:-- 創(chuàng)建數(shù)據(jù)庫(kù)firefly CREATE DATABASE IF NOT EXISTS firefly DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- 創(chuàng)建數(shù)據(jù)庫(kù)用戶fireflyuser,密碼為xW9CoF8A666 CREATE USER 'fireflyuser'@'%' IDENTIFIED BY 'xW9CoF8A666'; -- 授權(quán) grant all on firefly.* to "fireflyuser"@"%";
圖7-創(chuàng)建數(shù)據(jù)庫(kù)和用戶
然后exit
返回終端申尼,測(cè)試fireflyuser
能不能連接:docker exec -it mysql666 mysql -ufireflyuser -p
圖8-測(cè)試fireflyuser能不能連接到此數(shù)據(jù)庫(kù)準(zhǔn)備工作結(jié)束垮卓,接下來(lái)安裝
Firefly III
。
使用Docker部署Firefly III
??本節(jié)參考Firefly III 官方文檔 (firefly-iii.org)
步驟(共4個(gè)):
-
創(chuàng)建用于持久存儲(chǔ)上傳的文件和導(dǎo)出的數(shù)據(jù)的
卷
师幕。docker volume create firefly_iii_upload
-
使用命令
docker ps
查看MySQL
容器的id
粟按。
圖9-查看MySQL容器的id查看
MySQL
容器的IP
docker inspect MySQL容器的id | grep IPAddress
將此ip記住或復(fù)制下來(lái)備用,我這里是
172.17.0.2
。在終端執(zhí)行以下命令钾怔,生成一串32個(gè)字符的隨機(jī)字符串備用碱呼。
head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo
每次執(zhí)行都不一樣,我這里是
AgXj2E9M0PGhRqhzoMtycqDRkNwIRHjO
宗侦。 -
啟動(dòng)
Firefly III
容器下面命令將拉取
Firefly III
最新版鏡像并啟動(dòng)Firefly III
容器愚臀,請(qǐng)小心填寫(xiě)所需值,如不小心填錯(cuò)后執(zhí)行矾利,請(qǐng)停止并刪除錯(cuò)誤的容器姑裂,然后重試。# docker pull fireflyiii/core:latest docker run -d \ -v firefly_iii_upload:/var/www/html/storage/upload \ -p 80:8080 \ -e APP_KEY=你的32位隨機(jī)字符串 \ -e DB_HOST=MySQL容器的IP \ -e DB_PORT=3306 \ -e DB_CONNECTION=mysql \ -e DB_DATABASE=firefly所使用的數(shù)據(jù)庫(kù)名 \ -e DB_USERNAME=firefly所使用的數(shù)據(jù)庫(kù)用戶 \ -e DB_PASSWORD=該數(shù)據(jù)庫(kù)用戶的密碼 \ 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
以查看正在運(yùn)行的容器男旗。
圖10-查看正在運(yùn)行的容器
-
初始化
Firefly III
的數(shù)據(jù)庫(kù)進(jìn)入容器的
shell
舶斧,并切換到Firefly III
所在目錄。命令格式:
docker exec -it 容器名 bash
察皇。例如我的:
docker exec -it zen_noether bash
圖11-進(jìn)入容器的shell
??可以看到茴厉,進(jìn)入后就是Firefly III
項(xiàng)目根目錄,在容器里的shell
中執(zhí)行以下3條命令初始化數(shù)據(jù)庫(kù):
php artisan migrate:refresh --seed
php artisan firefly-iii:upgrade-database
php artisan passport:install
部分截圖:
執(zhí)行exit
返回終端什荣。
此時(shí)可以訪問(wèn)服務(wù)器地址查看
http://服務(wù)器IP/
或
http://服務(wù)器IP/firefly-iii/
如圖
結(jié)語(yǔ)
??筆者剛接觸Docker
矾缓,并不很了解Docker
。但了解到Docker容器
的啟動(dòng)順序很重要:默認(rèn)情況下Docker
會(huì)為每個(gè)容器分配一個(gè)172.17.0.x的IP地址(內(nèi)網(wǎng))稻爬,先啟動(dòng)的容器先分配地址嗜闻,因此容器啟動(dòng)順序?qū)⒂绊懫銲P地址。
??而本文中Firefly III
的啟動(dòng)命令包含了數(shù)據(jù)庫(kù)主機(jī)地址(DB_HOST)桅锄,這個(gè)寫(xiě)死的琉雳,讀者可以嘗試更改Firefly III
配置,使其連接宿主機(jī)的數(shù)據(jù)庫(kù)或遠(yuǎn)程的數(shù)據(jù)庫(kù)友瘤,而不必安裝MySQL容器
翠肘,筆者也將學(xué)習(xí)Docker Networking
的知識(shí),以便進(jìn)行這方面的嘗試辫秧。
?? Firefly III
教程的安裝部分到這里便告一段落了束倍,Firefly III
的教程的使用部分正在編寫(xiě),敬請(qǐng)期待茶没。
最后肌幽,原創(chuàng)不易,請(qǐng)規(guī)范轉(zhuǎn)載抓半。