前端搶飯碗系列之Docker容器編排

語言: CN / TW / HK

theme: cyanosis highlight: vs2015


本文是Docker的第三篇文章,我們將之前Docker中遺漏的一些問題進行深入的探討,比如設定容器的環境變數、映象的匯入匯出等一些常用的功能;然後我們會搭建一個私有的Registry倉庫,上傳和拉取我們自己的映象;以及最重要的部分,容器的編排,這次我們不再是單打獨鬥地操作一個容器了,我要一次打十個容器!開玩笑開玩笑,筆者又不是葉問。最後筆者會分享一些常用的、有趣又實用的映象,比如私有網盤、爬蟲、圖床、私有筆記、私有媒體庫以及下載工具等等,可以提升我們的日常工作效率,記得看完哦;本文依舊乾貨滿滿,新來的小夥伴記得點贊關注哦。

本文首發於公眾號【前端壹讀】,更多精彩內容敬請關注公眾號最新訊息。

容器的環境變數

我們在啟動docker容器的時候,經常需要向容器傳遞一些引數,以便容器進行一些特殊的配置,比如給mysql傳入MYSQL_ROOT_PASSWORD的root使用者密碼,或者我們想在自己的容器中傳入一些資料庫的配置等等。

第一種方式也最簡單的,也是最常見的,在run容器時使用--env,也就是我們在各個文件中經常見到的簡寫-e

bash $ docker run -itd -e MYSQL_USER=root -e MYSQL_PASS=pass xxx:latest

我們在js程式碼中可以通過環境變數process.env來獲取

javascript const { MYSQL_USER, MYSQL_PASS } = process.env;

在python程式碼中呼叫os.getenv獲取:

python MYSQL_USER = os.getenv("MYSQL_USER", "") MYSQL_PASS = os.getenv("MYSQL_PASS", "")

第二種方式,也是我們在Docker進階部署中介紹的,通過Dockerfile檔案的ENV指令

file ENV MYSQL_USER root ENV MYSQL_PASS pass

第三種方式,run容器時,通過--env-file指令載入env檔案,首先我們把配置資訊放在檔案env.list中:

bash $ cat env.list MYSQL_USER=root3 MYSQL_PASS=pass3

啟動容器時傳入檔案,這樣我們就不用傳入一大堆的-e命令了:

bash $ docker run -itd --env-file env.list xxx:latest

經過測試,三種方式的優先順序如下:

-e指令 大於> --env-file 大於> ENV指令

我們檢視容器的環境變數也很簡單,通過inspect命令,也可以加上grep過濾想要的欄位:

bash $ docker inspect XXX $ docker inspect XXX | grep MYSQL_USER

也可以解析一下返回內容:

bash $ docker inspect -f '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' XXX

映象與容器的匯入匯出

有時候我們部署docker容器會遇到問題,比如伺服器在內網,不能連線外網的情況(一些具有較高保密性的企業),或者網路下載慢,不通暢;我們就可以編譯、匯出映象後在內網伺服器匯入,就可以實現內網部署。

映象save和load

映象的匯入我們通常使用docker save`docker load命令,save命令將映象打包成tar檔案:

```bash $ docker save img:latest > img.tar

或者

$ docker save -o img.tar img:latest ```

匯出映象儘量使用映象名:標籤的形式,使用映象id容易出現匯入後鏡像名出現<none>的情況。

我們還可以將多個映象打包到一個檔案進行匯出:

bash $ docker save img1:latest img2:latest > img.tar

使用load命令就可以將匯出的映象包載入進來:

bash $ docker load < img.tar

save和load的應用場景,就是我們上面說的內網部署的情況;同時如果我們的應用還是使用docker compose編排的多個映象組合,就可以使用save將用到的多個映象打包,然後拷貝到客戶伺服器上使用load載入。

容器export和import

首先我們檢視本機的所有容器,使用export命令將容器ID匯出成檔案:

bash $ docker export 3e877a80b319 > server.tar

匯出到檔案後,我們在本地目錄可以看到該tar包檔案,我們再使用import命令將映象檔案匯入進來:

bash $ docker import server.tar my-server:latest

匯入後的容器檔案會成為一個映象,我們可以為它指定新的名稱,如果存在同名映象,原有的名稱會被剝奪,賦給新的映象。

export和import的應用場景主是要用來製作基礎映象,比如我們從一個ubuntu映象啟動一個容器,然後安裝一些軟體和進行一些設定後,使用docker export儲存為一個基礎映象。然後把這個映象分發給其他人使用,比如作為基礎的開發環境。

總結一下docker save和docker export的區別:

  • docker save儲存的是映象(image),docker export儲存的是容器(container);
  • docker load用來載入映象包,docker import用來載入容器包,但兩者都會恢復為映象;
  • docker load不能對載入的映象重新命名,而docker import可以為映象指定新名稱。

私有倉庫

在Docker中,我們執行pull XXX某個映象的時候,實際上它是從registry.hub.docker.com官方的映象倉庫去拉取的;在實際工作中,我們不會把企業的專案push到公有倉庫中管理;所以為了更好的管理,Docker不僅提供了公有倉庫,也允許我們搭建私有倉庫。

Docker Registry是一個無狀態,高度可擴充套件的伺服器端應用程式,它儲存並允許您分發Docker映像;我們通過run命令啟動:

bash $ docker run -d -p 5000:5000 -v $PWD:/var/lib/registry --restart=always --name registry registry:2

Registry服務預設將上傳的映象儲存在容器的/var/lib/registry,我們可以將伺服器本地的資料夾掛載到該目錄,即可實現儲存映象;通過以下curl我們可以檢視伺服器是否啟動,以及伺服器上的映象。

```bash $ curl http://192.168.0.1:5000/v2/_catalog

返回資料:{"repositories":[]}

```

正常情況下,伺服器推送映象到倉庫預設使用的是https,但是我們在企業內部使用,這裡就不加https;需要在客戶端配置可信的倉庫地址為http,否則push時會報如下錯誤:

bash The push refers to repository [192.168.0.1:5000/server] Get "https://192.168.0.1:5000/v2/": http: server gave HTTP response to HTTPS client

在windows的Docker客戶端,我們可以直接修改Desktop的配置,在Setting中選擇Docker Engine,新增insecure-registries欄位,完成後點選Apply & Restart重啟即可:

新增http倉庫地址

在linux客戶端,我們修改/etc/docker/daemon.json檔案,我們同樣也是加入insecure-registries,然後執行命令sudo service docker restart重啟docker:

json { "insecure-registries": [ "192.168.0.1:5000" ], }

修改該檔案必須符合JSON檔案規範,否則會啟動失敗

Registry服務啟動後,我們來看下如何推送映象到倉庫中;我們從Docker Hub下載一個ubuntu:18.04映象,然後將它推送到私有倉庫;首先給這個映象重新打上伺服器的標籤:

bash $ docker tag ubuntu:18.04 192.168.0.1:5000/my-ubuntu:latest

使用push命令推送映象:

bash $ docker push 192.168.0.1:5000/my-ubuntu:latest

我們可以在另外一臺機器上拉取這個映象,也可以將本地的192.168.0.1:5000/my-ubuntu:latestubuntu:18.04映象刪除後,再次拉取:

bash $ docker pull 192.168.0.1:5000/my-ubuntu:latest

再次curl檢視伺服器,我們就能看到該映象已經在伺服器生效了

```bash $ curl http://192.168.0.1:5000/v2/_catalog

返回資料:{"repositories":["my-ubuntu"]}

```

開啟認證

我們上面倉庫搭建後,所有客戶端都可以push、pull,這是我們不希望看到的,我們想要認證的使用者才能夠訪問;將原有容器刪除,建立一個儲存賬號密碼的檔案:

bash $ mkdir -p ~/auth && cd ~/auth $ docker run --rm --entrypoint htpasswd httpd:alpine -Bbn username password > ./htpasswd

將上面的username和password替換成自己的賬號密碼,執行容器時我們繫結auth資料夾:

bash $ docker run -d -p 5000:5000 -v $PWD:/var/lib/registry \ -v ~/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ --restart always --name registry registry:2

伺服器開啟認證後客戶端再pull、push會提示no basic auth credentials,我們需要先進行登入操作:

```bash

登入

$ docker login 192.168.0.1:5000

退出登入

$ docker logout 192.168.0.1:5000

windows客戶端執行新增winpty

$ winpty docker login 192.168.0.1:5000 ```

Compose

Docker Compose是Docker官方的開源專案,負責實現對Docker容器叢集的快速編排。在前兩篇Docker中,我們都是介紹了單個容器的構建和使用方式;在日常開發中我們經常會遇到需要多個容器相互配合使用的情況,比如除了web專案本身,還要資料庫支援,nginx負載均衡等等;如果所有容器都通過命令列的方式構建、啟動、刪除等操作會十分繁瑣;就好像你每天下班回到家裡,都需要進行開燈、關閉窗簾、開啟電視、煮飯等等一系列簡單且重複的操作。

Compose的出現就解決了這個問題,它通過定義一個模板檔案docker-compose.yml來管理一組相關聯的容器,所有容器的配置、環境等都記錄到檔案中,通過一個命令就可以控制所有的容器;Compose就像智慧家居的管家,我們只需要將開燈、關閉窗簾、開啟電視、煮飯等操作在App中進行定義,我們下班回到家裡只要對著它發出指令:回家啦!,它就會自動幫你把所有的事情做了。

回家啦

安裝解除安裝

Docker Compose支援Windows、macOS和Linux平臺,在Windows和macOS平臺我們直接下載安裝包安裝後自帶Compose,直接可以使用,我們通過version檢視安裝情況:

bash $ docker-compose --version docker-compose version 1.29.2, build 5becea4c

Linux的安裝也很簡單,直接從官網下載編譯好的二進位制檔案並賦予執行許可權即可:

``bash $ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-uname -s-uname -m` > /usr/local/bin/docker-compose

國內使用者可以使用以下方式加快下載

$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose ```

nodejs和redis使用

常見的專案就是web網站,包括web應用和資料庫(mysql、mongodb或redis),我們嘗試一個能夠簡單記錄頁面訪問次數的web應用。新建一個express專案,編寫app.js檔案:

javascript const express = require("express"); const { createClient } = require("redis"); const app = express(); const client = createClient({ url: "redis://redis:6379", }); app.get("/", async (req, res) => { let counter = await client.incr("counter"); res.send(`Hello World! 該頁面已被訪問 ${counter} 次`); }); app.listen(8000, async () => { await client.connect(); });

這裡我們連線redis的時候使用了容器名稱,而不是ip,下面我們會使用容器名稱和靜態兩種連線方式。再編寫我們的Dockerfile,構建映象:

FROM node:14.19-alpine WORKDIR /app COPY package*.json ./ RUN npm install --registry https://registry.npm.taobao.org COPY . . EXPOSE 8000 CMD npm run start

編寫docker-compose.yml檔案,這是Compose的模板檔案,我們用到2個服務:

yaml version: '3' services: web: build: ./ depends_on: - redis ports: - "8000:8000" restart: always redis: image: "redis:alpine" restart: always

在專案中允許docker-compose up -d就在後臺啟動了Compose專案,訪問8000埠,每次重新整理頁面,計數就會加1。

命令說明

ps

ps命令,列出所有的容器,以及執行狀態和所有埠:

```bash $ docker-compose ps Name Command State Ports


demo_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp demo_web_1 docker-entrypoint.sh /bin/ ... Up 0.0.0.0:8080->8080/tcp ```

如果要檢視某個服務的資訊,ps命令帶上某個服務的名稱:

bash $ docker-compose ps [service name]

logs

logs命令檢視服務容器的輸出。

```bash $ docker-compose logs

$ docker-compose logs [service name] ```

start

啟動已經存在的服務容器。

bash $ docker-compose start [service name]

stop

停止已經處於執行狀態的容器,但不刪除它。通過start可以再次啟動這些容器。

bash $ docker-compose stop [service name]

images

列出Compose檔案中包含的映象。

bash $ docker-compose images

scale

彈性設定服務執行的容器個數,通過service=num;需要去掉在yaml檔案指定的埠號,否則會導致端口占用問題

bash $ docker-compose scale web=2 db=3

build

構建(重新構建)專案中的服務容器。

bash $ docker-compose build

或者單獨構建某個服務的容器。

bash $ docker-compose build [service name]

down

此命令將會停止up命令所啟動的容器,並移除網路。

bash $ docker-compose down

up

此命令將自動完成包括構建映象,(重新)建立服務,啟動服務,並關聯服務相關容器的一系列操作;可以直接通過該命令來啟動一個專案。

bash $ docker-compose up

預設情況下,啟動的容器都在前臺執行,使用-d引數,將會在後臺啟動並執行所有的容器,一般在生產環境使用。

bash $ docker-compose up -d

Compose模板檔案

Compose通過配置檔案docker-compose.yml來管理多個Docker容器,模板檔案主要分為3個部分:

  • service(服務):在它下面可以定義應用需要的一些服務,每個服務都有自己的名字、使用的映象、掛載的資料卷、所屬的網路、依賴哪些其他服務等等。
  • volumes(資料卷):定義資料卷,然後掛載到不同的服務使用。
  • networks (應用網路):定義應用名字,使用的網路型別。

下面介紹一些主要指令的使用。

version

yarm檔案一般開頭就是version欄位,version指定了版本資訊,關乎docker的相容性,Compose檔案格式有3個版本,分別為1,2.x和3.x。兩者的版本要求如下表:

| compose檔案格式版本 | docker版本 | | ---------- | -------------- | | 3.4 | 17.09.0+ | | 3.3 | 17.06.0+ | | 3.2 | 17.04.0+ | | 3.1 | 1.13.1+ | | 3.0 | 1.13.0+ | | 2.3 | 17.06.0+ | | 2.2 | 1.13.0+ | | 2.1 | 1.12.0+ | | 2.0 | 1.10.0+ | | 1.0 | 1.9.1.+ |

image

從指定的映象中啟動容器,可以是儲存倉庫、標籤以及映象ID。

build

指定Dockerfile所在資料夾的路徑,可以是絕對路徑,也可以是相對docker-compose.yml檔案的路徑

yaml version: '3' services: web: build: /path/to/build/dir

如果dockerfile檔名不是預設名,需要指定:

yaml version: '3' services: web: build: context: ./ dockerfile: Dockerfile-alternate args: var1: 1 var2: c

使用arg指令指定構建映象時的變數,這裡的var1var2將被髮送到構建環境。

注意:任何environment與args變數同名的env變數(使用塊指定)將覆蓋該變數。

command

覆蓋容器啟動後預設執行的命令。

yaml version: '3' services: web: build: ./ command: echo "hello world"

links

將指定容器連線到當前連線,可以設定別名,避免ip方式導致的容器重啟動態改變的無法連線情況。

yaml version: '3' services: web: build: ./ links: - redis:rd redis: image: "redis:alpine"

我們在web容器中使用rd就能訪問redis,而不用ip。

external_links

連結到docker-compose.yml外部的容器,甚至並非Compose管理的外部容器。

yaml external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql

depends_on

解決容器的依賴、啟動先後的問題。以下例子中會先啟動redis和db再啟動web。

```yaml version: '3'

services: web: build: . depends_on: - db - redis

redis: image: redis

db: image: postgres ```

注意:web服務不會等待redis db「完全啟動」之後才啟動。

networks

預設情況下,Compose會為我們的應用設定一個網路,服務的每個容器都加入預設網路,並且可以被該網路上的其他容器訪問。

Compose建立的網路名稱基於我們所在專案的目錄名稱,比如我們專案在myapp目錄下,那Compose會建立一個myapp_default網路。

有些場景下,預設的網路配置不能滿足我們的需求,我們可以通過networks指令配置網路,通過default對預設的網路進行配置:

```yaml version: '3' services: web: build: .

networks: default: driver: bridge ```

我們還可以自定義網路:

```yaml version: '3' services: web: build: . networks: - front - back redis: image: "redis:alpine" networks: - front db: image: postgres networks: - back

networks: front: driver: bridge back: driver: bridge driver_opts: foo: "1" bar: "2" ```

我們這裡定義了front和back兩個網路,web應用同時在兩個網路中均能訪問redis和db,而redis和db實現了隔離。driver_opts將選項列表指定為鍵值對以傳遞給此網路的驅動程式。

我們有時候不需要建立新的網路,只需要加入已有網路,可以使用external選項,指定一個已經存在的網路名稱:

```yaml version: '3' services: web: build: . networks: - outside

networks: outside: external: name: 'my-existing-network' ```

加入網路時,我們可以指定容器的靜態ip地址,這樣我們在進行資料庫連線時,可以不用容器服務名稱,而直接使用ip地址:

```yaml version: '3' services: web: build: . networks: mynet: ipv4_address: 172.19.0.3

redis: image: "redis:alpine" networks: mynet: ipv4_address: 172.19.0.4

networks: mynet: ipam: driver: default config: - subnet: 172.19.0.0/16 ```

network_mode

設定網路模式。使用和docker run的--network引數一樣的值。

network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"

environment

在容器中設定環境變數,等同於docker run -e VARIABLE=VALUE ...

```yaml version: '3'

services: web: build: . environment: MODE: development SHOW: 'true' # 等同於 environment: - MODE=development - SHOW='true' ```

env_file

從檔案中獲取環境變數,等同於docker run --env-file ...

```yaml env_file: .env

env_file: - ./common.env - ./apps/web.env - /opt/secrets.env ```

環境變數檔案中每一行必須符合格式,支援#開頭的註釋行。

```

common.env: Set development environment

PROG_ENV=development ```

如果有變數名稱與environment指令衝突,以environment指令為準。

volumes

volumes可以設定資料卷所掛載路徑,它有兩種方式,一種方式是設定宿主機路徑(HOST:CONTAINER),通過[SOURCE:]TARGET[:MODE]格式,最後的ro用於只讀,rw用於讀寫(預設):

yaml version: '3' services: web: build: . volumes: - /app/configs # 隨機資料卷 - ./configs:/app/configs:ro - /path/to/logs:/app/logs

另一種方式直接設定資料卷的名稱,需要在檔案中配置資料卷:

```yaml version: '3' services: web: build: ./ volumes: - config_data:/app/configs

volumes: config_data: ```

ports

埠暴露給宿主機,如果僅僅指定容器埠,宿主機將會隨機選擇埠。

yaml ports: - "3000" # 繫結容器的3000埠到主機任意埠 - "8000:8000" - "12222:22"

expose

暴露埠,和ports的區別是,expose不對映到宿主機,只被連線的服務訪問。

yaml expose: - "3000" - "8000"

dns

自定義DNS伺服器。可以是一個值,也可以是一個列表。

```yaml dns: 8.8.8.8

dns: - 8.8.8.8 - 114.114.114.114 ```

restart

指定容器退出後的重啟策略為始終重啟。該命令對保持服務始終執行十分有效,在生產環境中推薦配置為always或者 unless-stopped

yaml version: '3' services: web: build: ./ restart: always

docker映象推薦

下面推薦一些筆者常用的映象。

gitbucket

如果我們自己想要一個私有的git開發倉庫,或者公司小團隊使用,gitbucket是一個不錯的選擇;相比於gitlab動輒就佔用記憶體3G,gitbucket幾百mb的大小已經是很小巧迷你了,再配上直男般的藍黑色,讓人簡直。。。。不過好在一般我們都是敲的git命令,所以不用在意他的介面。

bash $ docker run --name git -itd -v $PWD:/var/gitbucket -p 8080:8080 -p 29418:29418 gitbucket/gitbucket

8080埠是它的介面的地址,29418埠是給git通過SSH去連結倉庫的,建議開啟。

gitbucket

filebrowser

如果你受夠了某網盤幾十KB的小水管速度,那麼filebrowser是你搭建一個輕量級的私有云盤不錯的選擇。另一款網盤工具nextcloud也十分的不錯,功能豐富且強大,帶有app功能,不過需要結合資料庫使用,配置略微繁瑣,喜歡折騰的小夥伴可以自己嘗試。

filebrowser使用了go語言編寫,可以通過瀏覽器對伺服器上的檔案進行管理。可以是修改檔案,或者是新增刪除檔案,甚至可以分享檔案,是一個很棒的檔案管理器,使用非常簡單方便,功能很強大。

使用docker安裝也很方便,我們可以只對映/srv目錄下的檔案:

bash $ docker run -d --restart=always -v $PWD:/srv -p 8080:80 filebrowser/filebrowser

再通過nginx轉發8080埠,這樣我們就能在外網訪問了;nginx配置檔案中還需要修改上傳檔案的大小限制,這裡我們改到2GB,大部分的檔案都能上傳了:

conf http{ client_max_body_size 2000M; client_body_timeout 20m; }

filebrowser

scrapyd

我們身邊有很多的爬蟲應用案例,比如百度、Google、必應等搜尋引擎都有自己的爬蟲,會定時來抓取你的網站;再比如過年回家需要搶火車票,我們經常能夠看到很多的搶票軟體等,也都是爬蟲的應用;不過我們在網路上肆意使用爬蟲的時候也要注意相關法律法規,畢竟俗話說得好:

爬蟲寫得好,牢飯吃得飽

不是說問題不大麼

Scrapy是由Python語言開發的一個快速、高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料,只需要實現少量的程式碼,就能夠快速的抓取。

Scrapy爬蟲流程

Scrapy爬蟲部署需要使用scrapyd和scrapydweb,scrapyd是由scrapy開發者開發的、通過簡單的JSON API來管理多個專案的應用;通過docker我們可以很輕鬆的啟動一個scrapyd伺服器:

bash $ docker run -d -p 6800:6800 germey/scrapyd

它的介面比較簡單,我們需要通過繁瑣的API介面來上傳專案、啟動或者停止專案:

Scrapyd介面

因此Scrapy開發還提供了一個視覺化管理爬蟲的web應用,同時支援Scrapy日誌分析和視覺化。

bash $ docker run --name scrapydweb -e USERNAME admin \ -e PASSWORD admin \ -e SCRAPYD_SERVERS 127.0.0.1:6800 \ -v /etc/timezone:/etc/timezone \ -d scrapydweb:latest

Scrapydweb視覺化介面

我們在web介面上就可以清楚的看到每個伺服器執行爬蟲的狀態和數量,以及定時啟動爬蟲。

Scrapy是一個非常好用的爬蟲框架,如果本文的閱讀量突破一萬,後面筆者可以聊一下它的使用。

chevereto

Chevereto是目前最好的圖床之一了。功能也非常強大。其免費版和收費版的區別,在於收費版多了硬碟擴充套件,社交分享功能和技術支援,免費版的功能也夠用了;Chevereto依賴的環境如下:

  • PHP 5.5+
  • MySQL 5.0+

Chevereto介面

使用docker安裝的話PHP的環境我們就可以省去安裝步驟了,需要安裝一個MySQL的環境,然後通過run命令設定MYSQL的環境變數:

bash $ docker run -it -d --name chevereto --restart=always -p 8080:80 \ -v $PWD:/var/www/html/images \ -e "CHEVERETO_DB_HOST=127.0.0.1" \ -e "CHEVERETO_DB_PORT=3306" \ -e "CHEVERETO_DB_USERNAME=admin" \ -e "CHEVERETO_DB_PASSWORD=admin" \ -e "CHEVERETO_DB_NAME=chevereto" \ -e "CHEVERETO_DB_PREFIX=chv_" nmtan/chevereto

Chevereto執行起來後我們初始化設定管理員賬號密碼,然後在設定中修改介面為中文:

Chevereto修改中文

PHP預設限制上傳大小為2MB,我們需要修改容器中的檔案解除此限制;首先使用cp命令把容器中的.htaccess檔案拷貝出來:

bash $ docker cp XXXX:/var/www/html/.htaccess ./

然後編輯檔案.htaccess,設定最大上傳大小為大一點的數值,比如這裡設為128MB,數值可以根據自己需要調整:

file php_value post_max_size 128M php_value upload_max_filesize 128M

我們把檔案拷貝回容器的原處即可:

bash $ docker cp ./.htaccess XXXX:/var/www/html/

最後一步我們在設定中修改上傳限制,進入Chevereto,單擊使用者名稱彈出下拉選單,選擇【儀表盤】,然後點【設定】,彈出頁面中選擇【圖片上傳】,找到【最大上傳檔案大小】選項,修改不超過128的數值即可:

修改上傳大小

如果沒有修改.htaccess檔案,最後一個步驟的設定調整是不能超過2MB的。

這樣我們的圖床就搭建以及配置完畢了,其他個性化需要可以在設定中自行配置;我們去首頁就能隨意上傳和檢視圖片了;通過nginx代理轉發我們還可以暴露到外網,將你的美照分享給好友(前提是有公網IP或雲伺服器)。

Chevereto首頁

portainer

Portainer是一個視覺化的Docker操作介面,提供狀態顯示面板、應用模板快速部署、容器映象網路資料卷的基本操作(包括上傳下載映象,建立容器等操作)、事件日誌顯示、容器控制檯操作、Swarm叢集和服務等集中管理和操作、登入使用者管理和控制等功能。功能十分全面,基本能滿足中小型單位對容器管理的全部需求。

通過一個run命令我們就可以啟動portainer,/var/run/docker.sock是繫結宿主機的docker檔案,在容器內部直接與docker守護程序通訊進行介面呼叫:

bash $ docker run --name portainer -d -p 9000:9000 --restart=always \ -v $PWD:/data -v /var/run/docker.sock:/var/run/docker.sock \ portainer/portainer-ce

容器啟動後,設定管理員賬號密碼,進入Portainer後臺管理介面,點選Local環境就能夠使用了:

Portainer

容器和映象的管理也很方便,在管理介面直接增刪映象或容器即可;建立容器也直接可視化了,我們開啟【Container】=>【Add container】,然後設定容器執行所需要的引數,我們這裡以mysql為例:

Portainer建立容器

Restart policy建議選擇Always,相當於設定--restart=always,保證了容器在伺服器重啟後總會自動重新啟動。

webssh

Webssh是指通過瀏覽器以網頁的形式通過SSH協議遠端訪問任何開啟了SSH服務的裝置;webssh工作的原理也很簡單,大致如下:

+---------+ http +--------+ ssh +-----------+ | browser | <==========> | webssh | <=======> | ssh server| +---------+ websocket +--------+ ssh +-----------+

在後臺啟動一個webssh的後端伺服器(python程式或其他語言開發的),前端瀏覽器通過websocket和伺服器進行通訊,將一些命令傳送到webssh伺服器,webssh伺服器再將接收命令傳送給需要通訊且開啟了ssh功能的伺服器。

使用Webssh的好處是:在存在堡壘機(即跳板機)的環境下,如果堡壘機本身有開啟web服務的話,那可以在堡壘機上部署webssh,這時不用通過SSH或者RDP訪問堡壘機,直接開啟瀏覽器就能以web形式通過堡壘機來SSH遠端訪問網路裝置,這在一些內網防火牆不允許SSH,但是允許HTTP和HTTPS的環境中很實用。而且免去了安裝putty、secureCRT等SSH client軟體的必要。

通過docker執行webssh伺服器也很簡單:

bash $ docker run -itd --name webssh --restart=always -p 8888:8888 webssh

然後通過瀏覽器訪問webssh伺服器IP+8888埠號就可以進入它的介面了,它的介面也很簡潔,甚至有著一絲絲的簡陋,不過部署到堡壘機能用就行,還要啥腳踏車啊。通過填寫堡壘機的hostname、埠等引數就能連線堡壘機ssh了:

webssh介面

wizserver

為知筆記是一款老牌筆記應用了,支援markdown、網頁筆記、網頁剪藏和分享等多功能,最近推出了docker私有化部署的功能,同時支援5個使用者,適合小團隊使用。

我們新建一個wiznote目錄,用於儲存筆記的內容,然後run啟動服務:

bash $ docker run --name wiz \ --restart=always -itd \ -v $PWD/wiznote:/wiz/storage \ -p 8080:80 \ -p 9269:9269/udp \ wiznote/wizserver

稍等幾分鐘就能看到服務啟動了,在本地開啟localhost:8080開啟主介面,預設管理員賬號:[email protected]和密碼123456。

為知筆記

為知筆記支援多平臺客戶端和移動端客戶端,我們在客戶端介面點選【切換伺服器】,選擇【企業私有伺服器】,輸入伺服器的ip地址及埠號就能登入私有伺服器:

私有伺服器

jellyfin

Jellyfin是一個自由的軟體媒體系統,用於管理媒體和提供媒體服務,展示你自己的電影、電視劇、音樂等多媒體資料,並提供多平臺訪問播放服務。通過docker,我們可以很方便的啟動它的服務;在本地建立media和config資料夾,media資料夾是媒體資料夾,我們可以根據需求繼續建立media/movie、media/music等資料夾存放不同媒體資源:

bash docker run -d --name jellyfin \ -p 8096:8096 \ -v $PWD/media:/media \ -v $PWD/config:/config \ --restart=always \ jellyfin/jellyfin

繫結不同埠說明如下:

| 埠 | 說明 | | ---------- | -------------- | | 8096 | WebUI 訪問埠 | | 7359/udp | (可選)允許本地網路的客戶端發現 Jellyfin | | 1900/udp | (可選)DLNA服務 |

容器建立後,我們開啟localhost:8096就能開啟安裝嚮導頁面,它的介面還是:

jellyfin安裝

選擇一系列的語言、國家(國家選擇People's Republic of China)以及配置賬號密碼後我們就進入它的首頁了;我們選擇【新增媒體庫】,選擇你media資料夾下的子資料夾,就能看到其下面的媒體檔案了:

新增媒體庫

aria2

Aria2是一款開源下載工具,可幫助簡化不同裝置和伺服器之間的下載過程。它支援磁力連結、BT種子、http等型別的檔案下載,與迅雷及QQ旋風相比,Aria2有著優秀的效能及較低的資源佔用,架構本身非常輕巧,通常只需要4兆位元組(HTTP下載)到9兆位元組(用於BitTorrent互動)之間。

另外,aria2由於它的開源特性,因此也用在很多離線下載的場景,比如很多路由器都支援aria2離線下載功能,我們在路由器的外掛市場中安裝aria2後,在路由器掛載u盤,上班的時候想要下載的電影、影片等連結丟給它,回到家就可以直接觀看了;順帶提一下,chrome瀏覽器配合油猴外掛直接愉快的離線下載百度網盤的檔案。

我們通過docker來安裝aria2十分方便,新建一個aria2-downloads資料夾對映下載的目錄,aria2-config資料夾對映配置的目錄。這裡的p3terx/aria2-pro映象就是我們aria2下載的主程式,它是一個命令列的程式,因此搭配p3terx/ariang映象作為它的視覺化管理介面。用到了多個映象,我們就可以通過docker compose來進行構建:

yaml version: "3" services: aria2-pro: container_name: aria2-pro image: p3terx/aria2-pro environment: # uid,這裡預設是nobody - PUID=65534 # gid,這裡預設是nobody - PGID=65534 # 許可權掩碼 - UMASK_SET=022 # rpc金鑰token - RPC_SECRET=123456 # rpc埠 - RPC_PORT=6800 # BT監聽埠 - LISTEN_PORT=6888 # 快取 - DISK_CACHE=64M - IPV6_MODE=false # 自動更新tracker - UPDATE_TRACKERS=true - CUSTOM_TRACKER_URL= - TZ=Asia/Shanghai network_mode: bridge volumes: # 對映配置目錄,預設為當前目錄的aria2-confg - ${PWD}/aria2-config:/config # 對映下載目錄,預設為當前目錄的aria2-downloads - ${PWD}/aria2-downloads:/downloads ports: - 6800:6800 - 6888:6888 - 6888:6888/udp restart: unless-stopped logging: driver: json-file options: max-size: 1m ariang: container_name: ariang image: p3terx/ariang network_mode: bridge ports: # 埠對映,預設6880,後面通過此埠訪問頁面 - 6880:6880 restart: unless-stopped logging: driver: json-file options: max-size: 1m

專案啟動後,我們開啟AriaNg的管理介面,在設定中配置yarml檔案中的RPC埠(預設6800)和RPC金鑰。

aria2配置

配置完成後,點選【新建】,輸入你的下載連結就可以愉快地等待了。

aria2下載

下載速度和你的實際頻寬以及資源情況等都有關係,上圖僅做展示。

如果覺得寫得還不錯,敬請關注我的掘金主頁。更多文章請訪問謝小飛的部落格