Docker的部署(以go为例子)
一.基础概念
首先需要了解基础概念,我们首先需要了解什么是docker,以及docker内的一些概念,以及为什么要使用docker?
首先先介绍基础概念
1.镜像:Docker镜像是一个只读的模板,包含了运行应用程序所需的文件系统、库、依赖关系以及配置信息等。
它可以被理解为一个打包了应用程序及其运行环境的轻量级、可移植的容器镜像。
2.容器:Docker容器是镜像的运行实例,是镜像的一个可执行进程。
它包含了运行应用程序所需的所有内容,包括代码、运行时、系统工具、系统库等,并且是一个独立、可执行的环境。
说白了就是镜像就是软件包,容器就是运行这个软件包的一个程序一样。
- 镜像与容器的联系:
-
- 容器是基于镜像创建的。每个容器都有一个与之对应的镜像,这个镜像定义了容器的初始状态。
- 容器在运行时,会加载镜像中的文件系统、库、依赖关系等,并在这个基础上执行应用程序。
- 镜像与容器的区别:
-
- 镜像是静态的、不可更改的模板,而容器是镜像的一个动态运行实例。
- 镜像是用于分发和部署的,而容器是用于运行和管理应用程序的。
为什么要使用docker呢?
这个问题就很简单了,如果我们要想在其他服务器或者电脑上去运行我们的一个项目,我们就要花很长的时间去下载对应的环境,如果这个项目牵扯的环境特别多,就会导致部署非常麻烦,那有没有什么方法可以简化部署呢?
那就可以使用docker了,他可直接帮我们部署环境,而且只下载需要使用的部分,不会占用大量内存。
具体的好处可以上网查询。
二.dockerfile
2.1概念
废话不多说,直接进入部署环节:
docker的部署也很简单,就是写一个dockerfile文件,执行就可以了
有人可能会好奇为什么要写这个dockerfile文件,他是干什么的呢?
接下来就简单介绍一下什么是dockerfile。
dockerfile就是一个指令集,运行这个指令集,他就会将这些指令一一进行,帮助我们下载所需要配置的环境。
简单地说,它是一个描述要做的事情的一个清单,这要把它写好,计算机就会按照这个清单把要下载的东西下载好。
2.2编写
既然如此要如何去写这个docker文档呢?
这里以go为例写一个分段式的docker文件的编写:
# 使用golang:alpine作为基础镜像,这个镜像比较轻量且包含了Go语言环境
# 作用就是告诉docker使用那个基础镜像作为模板,后续命令都一这个镜像作为基础
FROM golang:alpine AS builder
# 为我们的镜像设置必要的环境变量
ENV CGO_ENABLED=0
# 关闭CGO
ENV GOPROXY=https://goproxy.cn,direct
# 设置中国的代理
# 创建工作目录:/build
WORKDIR /build
# 复制项目中的 go.mod 和 go.sum文件并下载依赖信息(这里只针对go语言而已)
COPY go.mod .
COPY go.sum .
RUN go mod download
# 将代码复制到容器中
COPY . .
# 将我们的代码编译成二进制可执行文件 MyApp
RUN go build -o Newstudy .
###################
# 接下来创建一个小镜像
###################
# 第二阶段(如果需要访问config.yaml,则此阶段不适用scratch,因为scratch不包含文件系统)
# FROM scratch
# scratch不包含文件系统
# 替代方案:选择一个包含文件系统的基础镜像
#FROM alpine:latest
FROM debian:stretch-slim
# 从builder镜像中把可执行文件拷贝到当前目录 /build/Newstudy <- /Newstudy
COPY --from=builder /build/Newstudy /Newstudy
# 设置运行时的工作目录(可选,如果MyApp需要访问相对路径的文件)
# WORKDIR /root
# 复制配置文件
COPY /config.yaml /config.yaml
# 声明服务端口
EXPOSE 8080
# 告诉docker,启动容器时执行如下命令
#CMD []
# 设置入口点
ENTRYPOINT ["/Newstudy","config.yaml"]
# 如果MyApp需要特定参数,可以在这里添加,例如:ENTRYPOINT ["/MyApp", "-config", "/config/myapp.conf"]
# 注意:由于我们使用的是scratch镜像,所以这里必须确保MyApp是静态链接的,或者所有必要的库都已经以某种方式包含在镜像中。
# 否则,MyApp可能无法运行
2.3相关指令
docker build -t your_name .
这个命令就是创建一个你的项目的镜像的命令,后面的点不要忘记。
docker ps
这个命令用来查看我们的容器运行情况:

三:docker-compose.yml
2.1介绍和实例
往往在实际的开发里面的web,涉及的到内容往往非常多。
比如redis,mysql,nginx等等一系列的内容,一个一个部署又非常的麻烦,
那有什么快速部署,启动他们的方法嘛?
当然有,那就是docker-compose.yml
它可以同时部署多个容器,并且同时启动。
具体就展示一个例子,来看他是如何实现的吧:
(这也就是一个展示,具体的内容还是上网搜索即可。)
# yaml 配置
version: '3.8'
services:
# MySQL容器
mysql:
image: mysql:8.0.39
container_name: some-mysql
restart: always
# command: #初始化命令导入我们的sql语句,去创建表
# -
environment: # 设置密码
MYSQL_ROOT_PASSWORD: "123456"
# MYSQL_DATABASE: go_web_app
# MYSQL_PASSWORD: 123456
# volumes: #目前还不知道是干啥的(卷,可能是牵扯到逻辑卷的挂载,确实,就是为了实现数据的可持续化)
# - mysql_data:/var/lib/mysql
ports: # 端口的映射
- "127.0.0.1:3307:3306"
# Redis容器
redis:
image: redis:7.4.1
container_name: redis-test
restart: always
command: redis-server --requirepass 123456 # 设置Redis密码
# volumes:
# - redis_data:/data
ports:
- "6379:6379"
# # Nginx容器(用于Vue前端)
# nginx:
# image: nginx:alpine
# container_name: nginx
# restart: always
# volumes:
# - ./vue_dist:/usr/share/nginx/html # 将Vue打包后的文件复制到Nginx容器中
# - ./nginx.conf:/etc/nginx/nginx.conf # 自定义Nginx配置文件
# ports:
# - "80:80"
# Go Web应用容器
go_web_app:
build:
context: . # 上下文路径
dockerfile: Dockerfile #指定构建镜像的dockerfile文件的文件名
container_name: test #容器的名字
restart: always #是否重启容器
ports:
- "8080:8080"
depends_on: #设置依赖关系。
- mysql
- redis
再导入数据库的时候我们会发现,我们并没有将数据库的信息导入,这里docker提供了一个方法:

编写一个这样名字的文件夹,将sql放入,docker会在你部署的时候自动执行这个sql文件
或者就是在docker-compose.yml的cmd执行,也是可以的。
3.2相关指令
docker-compose up -d
就是通过docker-compose创建一个大镜像
四.补充
除此之外,我们还要学会如何部署mysql,redis等等,可以参考这个文档
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.39
这个:后面是版本,如果是latest,意思就是默认最新版本,尽量与自己版本对齐哦
docker的实例化工具:docker desktop还要别的,本人用的是这个。
更多想学习go语言的,都可以看我语雀笔记,可以为我提出意见,嘿嘿。
这个是我的语雀网址,时刻更新Go (yuque.com),欢迎大家阅读。
「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!
更多推荐



所有评论(0)