构建镜像
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 行数 容器名