Skip to content

项目容器化-DockerFile学习之路

这周我主要负责的就是我们项目整个的容器化以及Docker-Compose的书写,Docker-Compose的使用,Docker-Compose的使用在小组报告中已经写出,这里主要讲讲完成Dockerfile时的一些遇到的问题已经解决的方法,供同学们参阅,基础的Dockerfile使用这里不多讲,在我的前面一篇博客已经谈到过。

服务端部署

这部分的Dockerfile较为简单, 直接使用golang官方的镜像即可

Go-Server

FROM golang:1.8
MAINTAINER WilsonZhong "1316628630@qq.com"
WORKDIR $GOPATH/src/github.com/GoProjectGroupForEducation/Go-Blog
ADD . $GOPATH/src/github.com/GoProjectGroupForEducation/Go-Blog
RUN go get -v github.com/GoProjectGroupForEducation/Go-Blog
EXPOSE 8081
ENTRYPOINT ["Go-Blog"]

前端部署

这部分相比服务端相对复杂,因为这里涉及到跨域问题,需要运用nginx做一个反向代理,所以这里的Dockerfile是将node以及nginx结合到了一起进行使用,这里我是先build出dist/,自己完成配置文件default.conf的书写后,COPY到对应的容器内的目录,运行nginx,主要涉及到两个镜像的共用

# build stage
FROM node:9.11.1-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# production stage
FROM nginx:1.13.12-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY --from=build-stage /app/default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

MySQL容器搭建

3个容器当中,耗费我时间最久的就是MySQL容器,因为其涉及到与其他容器的连通,如何使数据库可以由外界访问,并控制用户的访问权限之类的很多问题

我一开始直接写了一个sh在Dockerfile中尝试调用,后来问题有点多,实在顶不住之后开始阅读mysql:latest的Dockerfile,我发现mysql镜像的每次运行都会运行/docker-entrypoint-initdb.d文件夹下的sql文件,我只需要把初始化数据库的文件COPY到容器的对应目录,我就完成数据库的初始化了,通过合理书写create.sql,我们就可以达到控制访问权限的效果

FROM mysql:latest

# 复制数据库初始化脚本sql到/docker-entrypoint-initdb.d文件夹下
COPY create.sql /docker-entrypoint-initdb.d

create.sql如下

create database `blogdb`;
set global max_connections = 30000;

use mysql;
CREATE USER 'blogdb'@'%' IDENTIFIED BY 'zsy2720a';
alter user 'blogdb' identified with mysql_native_password by 'zsy2720a';
grant all on blogdb.* to 'blogdb'@'%';
flush privileges;
select host, user from user;

至于服务端在docker-compose中与mysql容器联动的问题,我也在小组报告中给出了解决的一种方法,而docker-compose的书写,也在小组博客之中,这里不多赘述