docker構建nodejs映象,rancher管理nodejs應用
阿新 • • 發佈:2018-11-03
構建映象
docker常見操作
1 構建映象 一般使用Dockerfile檔案配置構建內容
構建基礎參考:https://www.cnblogs.com/jie-fang/p/7927643.html
下面是一個nodejs執行環境的docker映象
FROM node:6.12.0-alpine
COPY ./ /tg_backend
RUN rm -fr /tg_backend/__files/*;
RUN rm -fr /tg_backend/logs/*;
RUN rm -fr /tg_backend/uploads/*;
RUN rm -fr /tg_backend/.git
# 沒有下面語句可能會保錯,參考https://blog.csdn.net/wang805447391/article/details/77416109
RUN npm config set unsafe-perm true
RUN npm install -g pm2 --registry=https://registry.npm.taobao.org
# 因為在容器裡面啟動是用pm2啟動的,所以需要安裝pm2 以及pm2-docker
RUN npm install -g pm2-docker
#RUN cd /tg_backend ; npm install
EXPOSE 8201
CMD ["/bin/sh","/tg_backend/docker_start.sh"]
基於node6基礎映象,刪除了當前資料夾下一些無效檔案以及資料夾,配置npm ,安裝pm2 pm2-docker 最後向外暴露8201 埠,結尾CMD執行指令碼(每個Dockerfile只能有一個CMD指令生效)
docker_start.sh 檔案
#!/bin/sh
nohup node /app/scripts/task.js > /tmp/task.log 2>&1 &
pm2-docker start /app/app.js -i 0
構建路徑
![這裡寫圖片描述](https://img-blog.csdn.net/20180908124633190?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTAxMjk5ODU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 )
構建檔案就在tg_backend 和 tg_cms裡面 (這是兩個專案,需要構建兩個映象)構建指令碼合併在tg_backend裡面
進入tg_backend
![這裡寫圖片描述](https://img-blog.csdn.net/20180908124854567?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTAxMjk5ODU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
執行tag.sh指令碼,指令碼內容如下
#!/bin/bash
#設定標籤
tag=$1
echo "build backend......."
#清空臨時資料夾
rm -fr /tmp/docker
mkdir -p /tmp/docker
#將當前專案檔案同步複製到臨時構建目錄,可以指定去除某些目錄或檔案
rsync -av /opt/product/tg_backend/ /tmp/docker/tg_backend --exclude __files --exclude .git --exclude uploads --exclude logs
rsync -av /opt/product/tg_cms/ /tmp/docker/tg_cms --exclude __files --exclude .git --exclude uploads --exclude logs
# cp -fr /opt/product/tg_backend /tmp/docker
# rm -fr /tmp/docker/tg_backend/logs/*
# rm -fr /tmp/docker/tg_backend/.git/*
# rm -fr /tmp/docker/tg_backend/__files/*
# rm -fr /tmp/docker/tg_backend/uploads/*
# cp -fr /opt/product/tg_cms /tmp/docker
# rm -fr /tmp/docker/tg_cms/logs/*
# rm -fr /tmp/docker/tg_cms/.git/*
#執行docker構建命令(需要先按照docker)構建過程中執行了Dockerfile 並且設定映象標籤(映象標籤要滿足:xxx:yy格式 並且標籤不要太長)
cmd="docker build -f /tmp/docker/tg_backend/docker/Dockerfile /tmp/docker/tg_backend/ -t tgbackend:yq"${tag}
eval $cmd
echo "build tgbackend success!!!!!"
echo "tag tgbackend......"
#修改剛才構建的映象標籤名為latest表示最新
cmd="docker tag tgbackend:yq"${tag}" tgbackend:latest"
eval $cmd
echo "tag backend end !!!"
echo "build tgcms......"
cmd="docker build -f /tmp/docker/tg_cms/docker/Dockerfile /tmp/docker/tg_cms/ -t tgcms:yq"${tag}
eval $cmd
echo "build tgcms success!!!!!"
echo "tag tgcms......"
cmd="docker tag tgcms:yq"${tag}" tgcms:latest"
eval $cmd
echo "tag tgcms end!!!!!"
#刪除臨時構建目錄
rm -fr /tmp/docker/*
執行tag.sh 如果提示bash: ./a.sh: /bin/bash^M 沒有檔案或路徑,需要執行busybox dos2unix tag.sh 參考 https://blog.csdn.net/youzhouliu/article/details/79051516
整個構建路徑:
./tag.sh ---> Dockerfile ---> docker_start.sh
配置docker
安裝docker
https://blog.csdn.net/bingzhongdehuoyan/article/details/79411479
https://yeasy.gitbooks.io/docker_practice/content/install/ubuntu.html
安裝rancher
https://blog.csdn.net/tianyaleixiaowu/article/details/75116394
開放rancher對外訪問介面(ufw allow 8000以及阿里雲安全配置)
在rancher管理介面 配置使用者,新增主機 ,新增執行docker的物理主機
最後新增應用,選擇docker-compose.yml檔案和rancher-compose.yml
配置rancher-compose.yml rancher管理配置檔案
version: '2'
services:
cms:
scale: 1
start_on_create: true
redis:
scale: 1
start_on_create: true
backend-2:
scale: 1
start_on_create: true
docker-compose.yml應用執行環境配置
tgcms:latest和tgbackend:latest是映象+標籤(應該先在docker裡面構建這些映象)
version: '2'
services:
cms:
image: tgcms:latest
environment:
API_URL: http://39.107.77.94/rest
BASE_URL: http://39.107.77.94
network_mode: bridge
volumes:
- /home/logs/agent/tg_cms/logs:/app/logs
- /svr/agent/tg_cms/tg_cms:/app
- /etc/localtime:/etc/localtime
dns:
- 114.114.114.114
ports:
- 8202:8202/tcp
labels:
io.rancher.scheduler.affinity:host_label: agent=1
backend:
image: tgbackend:latest
environment:
MYSQL_DATABASE: tg
MYSQL_HOST: 39.107.77.94
MYSQL_PASSWORD: tg123456
MYSQL_PORT: '3306'
MYSQL_USER: tg
NODE_ENV: production
REDIS_HOST: 39.107.77.94
REDIS_PORT: '6379'
network_mode: bridge
volumes:
- /home/logs/agent/tg_backend/logs:/app/logs
- /svr/agent/tg_backend/__files:/app/__files
- /svr/agent/tg_backend/tg_backend:/app
- /etc/localtime:/etc/localtime
dns:
- 114.114.114.114
ports:
- 8201:8201/tcp
labels:
io.rancher.scheduler.affinity:host_label: agent=1
然後啟動服務,在yml檔案裡面還可以配置應用需要連結的應用,比如Redis ,MySQL這些(本例直接使用外部資料庫和Redis)
管理容器
1 列出docker映象
docker images
2 列出執行的映象
docker ps -a
3 停止正在執行的容器
docker stop 83ce3514ec50 #後面是容器ID
4 刪除容器
docker rm 83ce3514ec50 #容器是執行狀態的映象
5 刪除映象,刪除映象前需要先刪除容器,停止容器(i表示image)
docker rmi 83ce3514ec50
6 檢視docker容器啟動日誌
實時檢視docker容器日誌
sudo docker logs -f -t --tail 行數 容器名