- 一、环境介绍
- 二、安装Docker-Compose
- 三、准备工作
- 四、docker-compose讲解
-
-
-
- yaml文件内容
- links的作用
- depends_on的作用
-
-
- 五、执行docker-compose
一、环境介绍
Go版本:1.13.1
部署环境:centos7
Docker版本:18.06.1
Docker-Compose版本:1.26.0
Mysql版本:5.7
RabbitMQ版本:3.8.4
二、安装Docker-Compose
下载
[root@localhost tools]# wget https://github.com/docker/compose/releases/download/1.26.0/docker-compose-Linux-x86_64
拷贝
[root@localhost tools]# cp /ssd/tools/docker-compose-Linux-x86_64 /usr/local/bin
[root@ localhost tools]# mv docker-compose-Linux-x86_64 docker-compose
授权
[root@localhost tools]# chmod -R 777 /usr/local/bin/docker-compose
查看版本
[root@ localhost tools]# docker-compose --version
docker-compose version 1.26.0, build d4451659
卸载docker-compose
二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
三、准备工作
docker-compose和docker的版本配套关系在下面的地址可以查看
https://docs.docker.com/compose/compose-file/
下面的version: ‘3.7’ 是docker-compose的版本
创建docker网络
docker network create ainet
查看网络
docker network ls
一键部署目录结构
[root@localhost app_deploy]# tree
.
├── ai_algorithm
├── ai_server
├── backend
│ ├── aisvc
│ └── Dockerfile
├── dbconf
│ └── aimysql.cnf
├── dbsql
│ └── dxm.sql
├── docker-compose.yaml
└── frontend├── conf│ └── nginx.conf├── conf.d│ └── default.conf├── dist└── Dockerfile
目录说明如下
mysql初始化目录,可以存放创建表的sql脚本文件,在mysql容器启动后,会自动执行这个sql脚本文件
go代码后端Dockerfile内容如下
#使用了镜像大小体积只5MB的alpine镜像
FROM alpine:latest
#设置环境变量
#ENV env test
#在docker的根目录下创建相应的使用目录
RUN mkdir -p /go/app
#设置工作路径
WORKDIR /go/app
#把上文编译好的main文件添加到镜像里
COPY . .
#暴露容器内部端口
EXPOSE 9090
#入口
ENTRYPOINT ["/go/app/aisvc"]
前端Dockerfile内容如下
#FROM node:12.16.1 as build#在docker的根目录下创建相应的使用目录
#RUN mkdir -p /app/www
#clone分支branchA的代码到容器/app/www目录
#RUN git clone -b branchA https://username:password@github.com/xxx.git /app/www
#设置工作路径
#WORKDIR /app/www
#RUN npm install
#RUN npm run buildFROM nginx:latest
#添加自己的配置 default.conf
COPY conf.d/default.conf /etc/nginx/conf.d/default.conf
COPY conf/nginx.conf /etc/nginx/nginx.conf
# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
COPY dist/ /usr/share/nginx/html/#暴露容器内部端口
#EXPOSE 8080
#ENTRYPOINT ["npm", "start"]
四、docker-compose讲解
yaml文件内容
version: '3.7'
services:studioui:build: frontendcontainer_name: studiouiimage: studioui:V1.0depends_on:- studioservicerestart: alwayslinks:- studioserviceports:- 80:80networks:- ainetstudioservice:build: backend#生成容器名container_name: studioapi#生成镜像名和tagimage: studioapi:V1.0#关机或者重启docker同时重启容器restart: alwaysdepends_on:- mysql- rabbitmqlinks:- mysql- rabbitmq- minio1ports:- 9090:9090networks:- ainetrabbitmq:# management安装客户端插件,可以浏览器访问rabbitmqimage: rabbitmq:3.8.4-managementcontainer_name: ai_rabbitmqports:#erlang发现端口- 4369:4369- 5671:5671#client端通信端口- 5672:5672#管理界面ui端端口- 15672:15672#server间内部通信端口- 25672:25672#setup host namehostname: worknode1#设置环境变量environment:RABBITMQ_DEFAULT_VHOST: testvhRABBITMQ_DEFAULT_USER: testRABBITMQ_DEFAULT_PASS: 1234RABBITMQ_LOGS: /var/lib/rabbitmq/rabbitmq.logRABBITMQ_SASL_LOGS: /var/lib/rabbitmq/rabbitmq-sasl.logRABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX#宿主机和容器关联的目录.如果非root账号执行,挂载目录必须是登录账号家目录volumes:- /opt/rabbitmq/data:/var/lib/rabbitmq- /opt/rabbitmq/log:/var/log/rabbitmq/log#- /etc/hosts:/etc/hosts#关机或者重启docker同时重启容器restart: alwaysnetworks:- ainetmysql:image: mysql:5.7container_name: ai_mysqlports:- 3306:3306environment:MYSQL_DATABASE: aisvcMYSQL_USER: aisvcMYSQL_PASSWORD: 20191014MYSQL_ROOT_PASSWORD: 20191014volumes:# 挂载数据件目录.如果非root账号执行,挂载目录必须是登录账号家目录- /opt/mysql/data:/var/lib/mysql# 挂载配置文件目录- ./dbconf:/etc/mysql/conf.d# 挂载日志文件目录- /opt/mysql/logs:/logs# 初始化脚本件目录,相对docker-compose所在目录路径- ./dbsql:/docker-entrypoint-initdb.d/#- /etc/localtime:/etc/localtime:ro#关机或者重启docker同时重启容器restart: alwayscommand:--character-set-server=utf8--collation-server=utf8_general_ci--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONnetworks:- ainetminio1:image: minio/minio:latestcontainer_name: ai_minio1volumes:- /opt/minio/data1-1:/data1- /opt/minio/data1-2:/data2ports:- "9001:9000"environment:MINIO_ACCESS_KEY: miniotestMINIO_SECRET_KEY: 12345678command: server http://minio{
1...4}/data{
1...2}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- ainetminio2:image: minio/minio:latestcontainer_name: ai_minio2volumes:- /opt/minio/data2-1:/data1- /opt/minio/data2-2:/data2ports:- "9002:9000"environment:MINIO_ACCESS_KEY: miniotestMINIO_SECRET_KEY: 12345678command: server http://minio{
1...4}/data{
1...2}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- ainetminio3:image: minio/minio:latestcontainer_name: ai_minio3volumes:- /opt/minio/data3-1:/data1- /opt/minio/data3-2:/data2ports:- "9003:9000"environment:MINIO_ACCESS_KEY: miniotestMINIO_SECRET_KEY: 12345678command: server http://minio{
1...4}/data{
1...2}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- ainetminio4:image: minio/minio:latestcontainer_name: ai_minio4volumes:- /opt/minio/data4-1:/data1- /opt/minio/data4-2:/data2ports:- "9004:9000"environment:MINIO_ACCESS_KEY: miniotestMINIO_SECRET_KEY: 12345678command: server http://minio{
1...4}/data{
1...2}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- ainet
networks:ainet:external: true
如果非root账号执行docker-compose,那么yaml文件里挂载的目录,根目录只能是/home/账号名(账号的家目录)
links的作用
下图,go编写的后端服务在run容器的时候,会把mysq、RabbitMQ、MinIO容器信息记录到自己的容器中,那么后端应用在访问mysq、RabbitMQ、MinIO的时候,可用使用container_name而不使用IP
怎么验证这一点呢?
进入go编写后端服务的容器
docker exec -it studioapi sh
depends_on的作用
下下图,go编写的后端服务容器依赖于mysql、rabbitmq容器服务,容器启动有先后顺序。
后端服务容器启动晚于mysql、rabbitmq容器的启动。如下图看一下执行docker-comose的顺序。
可以看到,studioui依赖于studioservice,而studioservice又依赖mysql、rabbitmq、minio,因此mysql、rabbitmq、minio容器先启动,studioservice次之,studioui最后启动。
但是注意,并不是说studioservice会等mysql、rabbitmq、minio完全启动了再启动,而是mysql、rabbitmq、minio一启动后,studioservice就会启动,那么如果studioservice启动的过程中有可能连不上mysql、rabbitmq、minio
五、执行docker-compose
在docker-compose.yaml文件目录执行
下面的命令,每次都会重新build使用到的docker镜像
docker-compose -f docker-compose.yaml up --build -d
下面的命令,如果使用到的docker镜像存在,直接使用,不build镜像。如果不存在,会build镜像
docker-compose -f docker-compose.yaml up -d
看一下执行完的结果