一.基础概念

首先需要了解基础概念,我们首先需要了解什么是docker,以及docker内的一些概念,以及为什么要使用docker?

首先先介绍基础概念

1.镜像:Docker镜像是一个只读的模板,包含了运行应用程序所需的文件系统、库、依赖关系以及配置信息等。

它可以被理解为一个打包了应用程序及其运行环境的轻量级、可移植的容器镜像。

2.容器:Docker容器是镜像的运行实例,是镜像的一个可执行进程。

它包含了运行应用程序所需的所有内容,包括代码、运行时、系统工具、系统库等,并且是一个独立、可执行的环境。

说白了就是镜像就是软件包,容器就是运行这个软件包的一个程序一样。

  1. 镜像与容器的联系
    • 容器是基于镜像创建的。每个容器都有一个与之对应的镜像,这个镜像定义了容器的初始状态。
    • 容器在运行时,会加载镜像中的文件系统、库、依赖关系等,并在这个基础上执行应用程序。
  1. 镜像与容器的区别
    • 镜像是静态的、不可更改的模板,而容器是镜像的一个动态运行实例。
    • 镜像是用于分发和部署的,而容器是用于运行和管理应用程序的。

为什么要使用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创建一个大镜像

四.补充

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),欢迎大家阅读。

Logo

「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!

更多推荐