docker构建nodejs镜像,rancher管理nodejs应用

构建镜像

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 行数 容器名

猜你喜欢

转载自blog.csdn.net/u010129985/article/details/82528978