使用Docker部署项目
1. Why Docker
之前部署项目都比较直接,本地编译好然后把可执行文件丢到服务器上跑。
- 对于后端,先把服务器数据库环境配好
- Java项目用maven打个Jar包
- Golang项目交叉编译个Linux平台的可执行文件
- 对于前端,先把服务器nignx环境配好
- 把项目打包成静态资源,一般是放到dist目录下
但是这样有个问题,在多台服务器上部署相同项目时都得先去配好环境,非常麻烦。在微服务架构中,一个应用可能会拆成几十个微服务,每个服务都有开发、测试、生产几套环境需要搭建,如果采用传统的部署方式,工作量就太大了。

使用Docker部署的话,可以将应用程序打包封装到一个容器中,容器包含了应用程序的代码、运行环境、依赖库、配置文件等必须的资源。容器之前相互隔离,互不影响。
用上Docker后,可以实现开发、测试和生产环境的统一化和标准化。镜像作为标准的交付件,可在开发、测试和生产环境上以容器来运行,最终实现三套环境上的应用以及运行所依赖内容的完全一致。
下面用一个例子记录一下如何用Docker部署项目
2. 使用Docker部署Go Web应用
2.1 编写Dockerfile
先在项目根目录新建一个 Dockerfile
FROM golang:alpine AS builder
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 移动到工作目录:/build
WORKDIR /build
# 将代码复制到容器中
COPY . .
# 将我们的代码编译成二进制可执行文件 app
RUN go build -o app .
# 接下来创建一个小镜像
FROM scratch
# 将项目的配置文件移动到配置文件中
COPY ./configs /configs
# 从builder镜像中把/dist/app 拷贝到当前目录
COPY --from=builder /build/app /
# 声明服务端口
EXPOSE 3344
# 需要运行的命令
ENTRYPOINT ["/app", "configs/config.yaml"]
2.2 构建镜像
创建镜像并名为为 goweb_app
docker build . -t goweb_app
2.3 运行镜像
docker run -d -p 8080:3344 goweb_app
-d
表示在后台运行、 -p 3344:3344
表示将宿主机的3344端口(前)绑定到容器的3344端口(后)。
2.4 分阶段构建
Docker的最佳实践之一是通过仅保留二进制文件来减小镜像大小,为此,我们将使用一种称为多阶段构建的技术,这意味着我们将通过多个步骤构建镜像。
使用这种技术,我们剥离了使用golang:alpine
作为编译镜像来编译得到二进制可执行文件的过程,并基于scratch
生成一个简单的、非常小的新镜像。我们将二进制文件从命名为builder
的第一个镜像中复制到新创建的scratch
镜像中。
3. 使用Docker部署MySQL
直接启动mysql容器
docker run --name mysqlxk -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxf -v /Users/xxf/docker/mysql:/var/lib/mysql -d mysql:8.0.19
--name mysqlxk
设置容器名称为mysqlxk
-e MYSQL_ROOT_PASSWORD=xxf
设置root用户密码为xxf
-v /Users/xxf/docker/mysql:/var/lib/mysql
挂载容器中的/var/lib/mysql
到本地的/Users/xxf/docker/mysql
之前go web里的配置也要改改,其中Host要改成mysql容器的名称
Database:
DBType: mysql
Username: root
Password: xxf
Host: mysqlxk:3306
DBName: xk
Charset: utf8
ParseTime: true
MaxIdleConns: 10
MaxOpenConns: 30
重新构建go web镜像后再运行,使用 —-link
与mysqlxk容器关联起来
docker run -d --link=mysqlxk:mysqlxk -p 3344:3344 goweb_app
4. 使用Docker部署Vue项目
部署前端就更简单了,首先本地编译项目生成静态文件vue build
,然后创建 Dockerfile
FROM nginx
COPY dist/ /usr/share/nginx/html
之后构建镜像
docker build --platform linux/amd64 . -t xxf0512/xkfrontend:1.0
--platform linux/amd64
是指目标主机的系统
上面说了几种构建镜像的方式,构建完成后将镜像直接传到服务器上。或者先在本地push到镜像仓库,然后在服务器上拉取镜像运行即可。
直接传到话先把镜像打个包:
docker save -o goweb_app.tar goweb_app
docker save -o xkfrontend.tar xxf0512/xkfrontend:1.0