Go版本:1.13.1
部署环境:centos7
Docker版本:18.06.1
Docker-Compose版本:1.26.0
Mysql版本:5.7
RabbitMQ版本:3.8.4
下载
[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:[email protected]/xxx.git /app/www
#设置工作路径
#WORKDIR /app/www
#RUN npm install
#RUN npm run build
FROM 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"]
version: '3.7'
services:
studioui:
build: frontend
container_name: studioui
image: studioui:V1.0
depends_on:
- studioservice
restart: always
links:
- studioservice
ports:
- 80:80
networks:
- ainet
studioservice:
build: backend
#生成容器名
container_name: studioapi
#生成镜像名和tag
image: studioapi:V1.0
#关机或者重启docker同时重启容器
restart: always
depends_on:
- mysql
- rabbitmq
links:
- mysql
- rabbitmq
- minio1
ports:
- 9090:9090
networks:
- ainet
rabbitmq:
# management安装客户端插件,可以浏览器访问rabbitmq
image: rabbitmq:3.8.4-management
container_name: ai_rabbitmq
ports:
#erlang发现端口
- 4369:4369
- 5671:5671
#client端通信端口
- 5672:5672
#管理界面ui端端口
- 15672:15672
#server间内部通信端口
- 25672:25672
#setup host name
hostname: worknode1
#设置环境变量
environment:
RABBITMQ_DEFAULT_VHOST: testvh
RABBITMQ_DEFAULT_USER: test
RABBITMQ_DEFAULT_PASS: 1234
RABBITMQ_LOGS: /var/lib/rabbitmq/rabbitmq.log
RABBITMQ_SASL_LOGS: /var/lib/rabbitmq/rabbitmq-sasl.log
RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
#宿主机和容器关联的目录.如果非root账号执行,挂载目录必须是登录账号家目录
volumes:
- /opt/rabbitmq/data:/var/lib/rabbitmq
- /opt/rabbitmq/log:/var/log/rabbitmq/log
#- /etc/hosts:/etc/hosts
#关机或者重启docker同时重启容器
restart: always
networks:
- ainet
mysql:
image: mysql:5.7
container_name: ai_mysql
ports:
- 3306:3306
environment:
MYSQL_DATABASE: aisvc
MYSQL_USER: aisvc
MYSQL_PASSWORD: 20191014
MYSQL_ROOT_PASSWORD: 20191014
volumes:
# 挂载数据件目录.如果非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: always
command:
--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_SUBSTITUTION
networks:
- ainet
minio1:
image: minio/minio:latest
container_name: ai_minio1
volumes:
- /opt/minio/data1-1:/data1
- /opt/minio/data1-2:/data2
ports:
- "9001:9000"
environment:
MINIO_ACCESS_KEY: miniotest
MINIO_SECRET_KEY: 12345678
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
networks:
- ainet
minio2:
image: minio/minio:latest
container_name: ai_minio2
volumes:
- /opt/minio/data2-1:/data1
- /opt/minio/data2-2:/data2
ports:
- "9002:9000"
environment:
MINIO_ACCESS_KEY: miniotest
MINIO_SECRET_KEY: 12345678
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
networks:
- ainet
minio3:
image: minio/minio:latest
container_name: ai_minio3
volumes:
- /opt/minio/data3-1:/data1
- /opt/minio/data3-2:/data2
ports:
- "9003:9000"
environment:
MINIO_ACCESS_KEY: miniotest
MINIO_SECRET_KEY: 12345678
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
networks:
- ainet
minio4:
image: minio/minio:latest
container_name: ai_minio4
volumes:
- /opt/minio/data4-1:/data1
- /opt/minio/data4-2:/data2
ports:
- "9004:9000"
environment:
MINIO_ACCESS_KEY: miniotest
MINIO_SECRET_KEY: 12345678
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
networks:
- ainet
networks:
ainet:
external: true
如果非root账号执行docker-compose,那么yaml文件里挂载的目录,根目录只能是/home/账号名(账号的家目录)
下图,go编写的后端服务在run容器的时候,会把mysq、RabbitMQ、MinIO容器信息记录到自己的容器中,那么后端应用在访问mysq、RabbitMQ、MinIO的时候,可用使用container_name而不使用IP
怎么验证这一点呢?
进入go编写后端服务的容器
docker exec -it studioapi sh
下下图,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.yaml文件目录执行
下面的命令,每次都会重新build使用到的docker镜像
docker-compose -f docker-compose.yaml up --build -d
下面的命令,如果使用到的docker镜像存在,直接使用,不build镜像。如果不存在,会build镜像
docker-compose -f docker-compose.yaml up -d