這都2019年底了,你還不會 docker嗎? 你 low 爆了,咱們做爲一枚前端,不能說是要精通使用 docker 完成各類事情,但我以爲必需要學會使用 docker 幹下面幾件事:html
Docker 可理解爲跑在宿主機上的很是精簡、小巧、高度濃縮的虛擬機。 它能夠將容器裏的進程安穩的在宿主機上運行,以前我也有寫過一些關於docker的文章,在這我就不作過多的介紹了,若有須要請自行查看我以前的文章便可,接下來咱們經過項目來了解並使用 docker前端
在這裏我使用 egg.js
來爲你們實操一下項目的部署流程。有人會問 egg.js
是什麼? 我只能回答這是一款專業級的 node
框架。做爲一個有夢想的前端,咱們有必要去學習一種後端語言,而做爲前端 node
的學習成本相對來講比較低的。 egg.js
這個框架在 node 現有框架中也是比較優秀的,若有須要,你們能夠自行學習,咱們今天的學習主要仍是項目的部署流程,在這我就不給你們作過多的介紹。若有須要,請查閱 官方文檔node
docker 與 docker-compose 的安裝我就不給你們介紹了。在以前的文章中是有的,也比較詳細,做爲一位開發人員,我認爲這點事情難不倒你們mysql
$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i
複製代碼
咱們須要在項目根目錄建立咱們所須要的文件nginx
$ touch Dockerfile
$ touch docker-compose.yml
$ setup.sh
複製代碼
egg-project
├── package.json
├── setup.sh (新建)
├── Dockerfile (新建)
├── docker-compose.yml (新建)
├── app
| ├── router.js
│ ├── controller
│ | └── home.js
│ ├── service (可選)
│ | └── user.js
│ ├── middleware (可選)
│ | └── response_time.js
│ ├── schedule (可選)
│ | └── my_task.js
...
複製代碼
在開始以前咱們要學習下經常使用的一些指令,看下方:redis
在安裝jenkins我選擇了使用docker-compose
docker-compose 是一個用來把 docker 自動化的東西
有了 docker-compose 你能夠把全部繁複的 docker 操做全都一條命令,自動化的完成。sql
/home/jenkins
- docker-compose.yml
- jenkins-home
複製代碼
version: '3' # 指定 docker-compose.yml 文件的寫法格式
services: # 多個容器集合
docker_jenkins:
user: root # 爲了不一些權限問題 在這我使用了root
restart: always # 重啓方式
image: jenkins/jenkins:lts # 指定服務所使用的鏡像 在這裏我選擇了 LTS (長期支持)
container_name: jenkins # 容器名稱
ports: # 對外暴露的端口定義
- '8080:8080'
- '50000:50000'
volumes: # 卷掛載路徑
- /home/jenkins/jenkins_home/:/var/jenkins_home # 這是咱們一開始建立的目錄掛載到容器內的jenkins_home目錄
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker # 這是爲了咱們能夠在容器內使用docker命令
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose # 一樣的這是爲了使用docker-compose命令
複製代碼
咱們須要進入到 jenkins 目錄下執行:docker
$ docker-compose up -d
複製代碼
不出意外你如今能夠打開你的服務器地址 http://xxxxxxx:端口號 就能看到這個界面:shell
打開你所建立的jenkins目錄進入到jenkins-home
/home/jenkins/jenkins-home數據庫
進入 secrets 目錄
$ cat initialAdminPassword
複製代碼
而後把裏面的文本複製出來填到管理員密碼中
接下來須要安裝兩個插件
NodeJS Plugin
Publish Over SSH
複製代碼
而後咱們滑到最下方
咱們在開始階段的時候學過一些經常使用指令,你們應該一眼就能夠看得懂這些命令。 加油!!
FROM node:10.0-alpine # 鏡像版本
# 設置時區
RUN apk --update add tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && apk del tzdata
# 建立app目錄
RUN mkdir -p /usr/src/node-app/egg-santak
# 設置工做目錄
WORKDIR /usr/src/node-app/egg-santak
# 拷貝package.json文件到工做目錄
# !!重要:package.json須要單獨添加。
# Docker在構建鏡像的時候,是一層一層構建的,僅當這一層有變化時,從新構建對應的層。
# 若是package.json和源代碼一塊兒添加到鏡像,則每次修改源碼都須要從新安裝npm模塊,這樣木有必要。
# 因此,正確的順序是: 添加package.json;安裝npm模塊;添加源代碼。
COPY package.json /usr/src/node-app/egg-santak/package.json
# 安裝npm依賴(使用淘寶的鏡像源)
# 若是使用的境外服務器,無需使用淘寶的鏡像源,即改成`RUN npm i`。
RUN npm i --registry=https://registry.npm.taobao.org
# 拷貝全部源代碼到工做目錄
COPY . /usr/src/node-app/egg-santak
# 暴露容器端口
EXPOSE 7001
# 啓動node應用
CMD npm start 複製代碼
# nginx
$ mkdir -p nginx/conf.d nginx/logs
# mysql
$ mkdir mysql
# redis
$ mkdir redis
複製代碼
而後進入 nginx/conf.d
文件夾中 建立一個後綴爲 conf
的文件
$ cd nginx/conf.d
$ touch default.conf
$ vim default.conf
複製代碼
寫入如下內容:
server {
listen 80;
listen [::]:80;
server_tokens off;
root /var/www/html;
index index.html index.htm;
# 修改成本身的域名
server_name api.lovelp.xin;
# 訪問 / 路徑時執行反向代理
location / {
# 這裏 nodejs 是 node 容器名
proxy_pass http://nodejs:7001;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
# 後端的Web服務器能夠經過 X-Forwarded-For 獲取用戶真實 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 容許客戶端請求的最大單文件字節數
client_max_body_size 15M;
# 緩衝區代理緩衝用戶端請求的最大字節數
client_body_buffer_size 128k;
}
}
複製代碼
version: '3'
services:
santak_redis:
image: redis:3 # 指定服務鏡像
container_name: santak_redis # 容器名稱
restart: always # 重啓方式
hostname: redis
command: redis-server /usr/local/etc/redis/redis.conf --requirepass 123456 --appendonly yes
volumes: # 掛載數據卷
- /root/redis/redis.conf:/usr/local/etc/redis/redis.conf
ports: # 映射端口
- "6379:6379"
networks: # 加入指定網絡
- app-network
santak_nginx:
image: nginx:stable-alpine # 指定服務鏡像
container_name: santak_nginx # 容器名稱
restart: always # 重啓方式
ports: # 映射端口
- "80:80"
volumes: # 掛載數據卷
- /etc/localtime:/etc/localtime
- /root/nginx/conf.d:/etc/nginx/conf.d
- /root/nginx/logs:/var/log/nginx
depends_on: # 啓動順序
- nodejs
networks: # 加入指定網絡
- app-network
santak_mysql:
image: mysql:5.7
container_name: santak_mysql
restart: always
ports: # 映射端口
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=lovelp # 建立lovelp用戶
- MYSQL_PASSWORD=mm123321 # 設置lovelp用戶的密碼
- MYSQL_DATABASE=santak # 建立初始數據庫
- TZ=Asia/Shanghai # 設置時區
volumes: # 掛載數據卷
- /root/mysql:/var/lib/mysql # 爲了數據持久化
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
networks: # 加入指定網絡
- app-network
nodejs:
build: # 這裏指的是咱們剛剛擼的 Dockerfile 文件
context: .
dockerfile: Dockerfile
image: nodejs # 鏡像名稱
container_name: nodejs # 容器名稱
restart: always # 重啓方式
depends_on: # 啓動順序
- santak_redis
- santak_mysql
links: # 容器鏈接
- santak_redis:santak_redis
- santak_mysql:santak_mysql
networks: # 加入指定網絡
- app-network
volumes:
certbot-etc:
certbot-var:
networks: # 實現通訊
app-network:
driver: bridge
複製代碼
#!/usr/bin/env bash
#image_version=`date +%Y%m%d%H%M`;
# 關閉容器
docker-compose stop || true;
# 刪除容器
docker-compose down || true;
# 構建鏡像
docker-compose build;
# 啓動並後臺運行
docker-compose up -d;
# 查看日誌
docker logs nodejs;
# 對空間進行自動清理
docker system prune -a -f
複製代碼
最後咱們就能夠愉快的 Build Now
了
在這裏我選擇的是手動構建。其實jenkins有不少可配置項,好比自動化構建啥的,興趣使然,你們自行摸索,謝謝你們
若有不明白的地方,請你們下方留言,我看到後會及時回覆的。若是你認爲寫的還算是能夠,請留個贊表示下支持,謝謝!!