前段時間作了個node
全棧項目,服務端技術棧是 nginx
+ koa
+ postgresql
。其中在centos
上搭建環境和部署都挺費周折,部署測試服務器,接着上線的時候又部署生產環境服務器。這中間就有不少既無聊又費精力,吃力不討好的"體力活"。因此就開始思考怎麼自動化這部分搭建部署的工做,也就引出了Docker
。node
Docker
是比虛擬機還要輕量級的虛擬化技術,它虛擬化的實體就叫作容器。容器自己就是一個隔離了做用域的sandbox
,同時它只包含了基礎庫和自己承載的服務,很是精簡。容器運行起來後就只是宿主機中的一個進程而已,佔用的資源是很是小的,這就爲操做系統上運行容器集羣創造了條件,可操做性和靈活性極佳。nginx
鏡像和容器又是什麼關係呢?能夠把鏡像當作是類(class
),容器當作對象(object
),容器是由鏡像實例化產生出來的,固然一個鏡像能夠生成多個容器。web
若是不在服務器,咱們在客戶端要怎麼使用 Docker
呢?在 Windows
和 OSX
上可使用 Docker Desktop
,再加上 Kitematic
,這兩個都是桌面管理工具,常規的操做方面很是便利。Docker Desktop
和 Kitematic
只是可視化了部分操做,命令行仍是必備的,由於不少操做也只能命令行才行。redis
關於鏡像標籤,好比nginx:1.19.0-alpine
,1.19.0是 nginx
的版本號,alpine
是os的代號。sql
Jessie: debian 8docker
Stretch: debian 9數據庫
Buster: debian 10npm
Alpine: Alpine,推薦使用,由於體積很是小json
Alpine
是體積最小的一個版本,有些甚至是其餘版本的四分之一。這意味着構建鏡像更快,運行效率更高,由於加載的組件更加少,無形中也意味着漏洞更少更安全。centos
docker pull nginx:1.19.0-alpine
--name web:指定容器名稱爲web
-p 8080:80: 容器nginx監聽端口爲80,映射到本地端口8080
-v xxxx:xxxx:這裏是用本地配置文件映射到容器nginx配置文件
-d:後臺運行
nginx:1.19.0-alpine:使用的鏡像
docker run --name web -p 8080:80 -v /usr/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx:1.19.0-alpine
docker images #顯示鏡像 docker rmi xxx #刪除鏡像 docker ps #顯示運行的容器 docker rm xxx #刪除容器
構建鏡像比較方便的是使用Dockerfile
,它就是鏡像的配置文件,只要有Dockerfile
,隨時能夠構建鏡像。以下就是構建一個很是簡單的nginx
鏡像,from
就是構建時使用的基礎鏡像:
FROM nginx COPY nginx.conf /etc/nginx/nginx.conf
當咱們的項目不只只有單個容器,而是須要運行多個容器,並且容器之間還須要互相通訊的時候,就須要更強大的管理工具了。好比k8s
,但咱們目前的小項目使用官方自帶的Docker-compose
已經足矣。
首先須要docker-compose.yml
配置文件,好比下面就是兩個容器的模板,image
表示使用的鏡像,ports
則表示端口映射,volumes
則是須要映射的數據卷:
version: "3" services: webapp: image: web ports: - "8080:80" volumes: - "/data" redis: image: "redis:alpine"
接着可使用如下命令行進行操做:
docker-compose build [options] [SERVICE...] #構建(從新構建)項目中的服務容器 docker-compose up -d # 運行 compose 項目,後臺執行
docker-compose up
是個很是強大的命令,它將嘗試自動完成包括構建鏡像,(從新)建立服務,啓動服務,並關聯服務相關容器的一系列操做。連接的服務都將會被自動啓動,除非已經處於運行狀態。能夠說,大部分時候均可以直接經過該命令來啓動一個項目。
有了上面的基礎,接着就能夠構建咱們本身的項目了,首先是node
服務的dockerfile
,主要作了以下步驟
npm
包pm2
啓動容器FROM node:14.5.0-alpine3.12 # 工做目錄 WORKDIR /usr/src/app # 複製配置文件 COPY package*.json ./ COPY process.yml ./ RUN npm set registry https://registry.npm.taobao.org/ \ && npm install pm2 -g \ && npm install # 使用pm2管理 CMD ["pm2-runtime", "process.yml", "--only", "app", "--env", "production"] EXPOSE 3010
接着配置 docker-compose.yml
postgres
,其中數據卷 volumes
映射了數據庫目錄和初始化腳步node
服務,其中的build
是映射上面dockerfile
所在的目錄;depends_on
表示依賴的容器、啓動前後,這裏先啓動db再啓動node
;links
表示將db的名稱映射到app容器depend_on
於app容器,同時配置轉發node
的服務version: '3' services: db: image: postgres:12.3-alpine container_name: postgres environment: - TZ=Asia/Shanghai - POSTGRES_PASSWORD=xxxx volumes: - ./postgres/data:/var/lib/postgresql/data - ./postgres/init:/docker-entrypoint-initdb.d ports: - 5432:5432 restart: always #始終重啓,生產環境中推薦配置爲 always expose: - 5432 app: image: koa-pg container_name: koa volumes: - ./dist:/usr/src/app/dist - ./logs:/usr/src/app/logs build: ./ environment: - TZ=Asia/Shanghai restart: always depends_on: - db links: - db expose: - 3010 nginx: image: nginx:1.19.0-alpine container_name: nginx volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - 8080:80 environment: - TZ=Asia/Shanghai restart: always depends_on: - app links: # host名代替ip配置nginx的轉發 - app expose: - 8080
配置完咱們的項目以後,接着就是運行起來
docker-compose up
在咱們的本地開發機是如此,部署到服務器也是如此,你想要部署幾臺服務器就部署幾臺,只要裝了docker
,都是一句命令行就能解決的事情。
要啓動幾個容器,修改下docker-compose.yml
的配置,再次docker-compose up
,so easy !