使用Docker部署项目


使用Docker部署项目

参考资料
如何使用Docker部署Go Web应用

1. Why Docker

之前部署项目都比较直接,本地编译好然后把可执行文件丢到服务器上跑。

  • 对于后端,先把服务器数据库环境配好
    • Java项目用maven打个Jar包
    • Golang项目交叉编译个Linux平台的可执行文件
  • 对于前端,先把服务器nignx环境配好
    • 把项目打包成静态资源,一般是放到dist目录下

但是这样有个问题,在多台服务器上部署相同项目时都得先去配好环境,非常麻烦。在微服务架构中,一个应用可能会拆成几十个微服务,每个服务都有开发、测试、生产几套环境需要搭建,如果采用传统的部署方式,工作量就太大了。

docker能做什么

使用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

文章作者: xxf
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xxf !
  目录