7天docker入门:第2天 特定语言指南(Go)

本文详细介绍了Dockerfile的基础知识,包括如何为Go项目编写Dockerfile,以及Dockerfile中9个核心指令的使用,如FROM、MAINTAINER、WORKDIR、RUN等。通过示例,展示了如何构建和部署应用镜像,以及如何使用DockerCompose提高开发效率。此外,还强调了减少镜像层数以减小体积的重要性。
摘要由CSDN通过智能技术生成

引言

学完了:docker入门(1)getting-started 之后,你应该:

  • 初步掌握了Docker的使用
  • 知道了Dockerfile是什么
  • docker compose出现的目的以及作用。

但是,你可能我和当时一样有个问题:我要怎么为我的项目(比如Go)编写Dockfile

此时,很有必要把官方的这个特定语言的指南再快速的过一遍。

当然,除了Go之外,还有Python, Node.js, Java等等,请读者自行选择。

内容

为了引起你的兴趣,我把它主要的内容列举一下:

  • 构建图像
    • 先决条件
    • 概述
    • 示例应用程序
    • 测试应用程序
    • 为应用程序创建一个Docker文件
    • 构建图像
    • 查看本地图像
    • 标记图像
    • 多阶段构建
  • 运行容器
    • 以分离模式运行
    • 列出容器
    • 停止、启动和命名容器
  • 开发您的应用程序
    • 本地数据库和容器
      • 存储
      • 联网
      • ……
    • 使用Docker Compose提高工作效率

其中,我把 构建图像 看了一下,“运行容器”和之前重复就没看了,“开发您的应用程序”不是使用的Mysql,所以我也跳过了。

最主要的还是getting-started。覆盖到了方方面面。

学习这一节最主要的目标就是掌握dockerfile的编写,刚好在一本书上看到了这9个最常用的指令。

我把它贴在这里。

下一节,我们将基于这9个指令进行dockerfile实践。

Dockerfile常用9个指令

节选自《docker进阶与实战》,指令详解请参考:
《Docker——从入门到实践》

示例

# escape=\ 
# This dockerfile uses go build, then use the ubuntu run
# Version: 0.1
# Author: xmcy0011@sina.com
# Desc: 注意,编译镜像的上下文必须在src下(../../),否则会失败
#       example: docker build -t im_gate -f . ../../

##
## build
##

# Base image to use, this must be set as the first line
FROM golang:1.16-alpine as build

LABEL maintainer="xmcy0011<xmcy0011@sina.com>"

# 工作目录
WORKDIR /go/src/coffeechat

# 把当前所有文件 拷贝到上面的工作目录下(包括配置文件)
COPY . .

# 设置go代理,加快拉包速度
RUN go env -w GOPROXY=https://goproxy.io && \
    cd app/im_http && \
    # 拉项目依赖
    go mod tidy && \
    # 编译程序
    go build

##
## deploy
##

FROM alpine
# 指定日志存储卷,当前工作目录下的Log文件
VOLUME [ "log" ]
EXPOSE 18080
COPY --from=build /go/src/coffeechat/app/im_http /usr
CMD [ "/usr/im_http", "--conf=/usr/http-docker.toml" ]

FROM指令

格式为:

FROM <image> 
或 
FROM <image>:<tag>。

Dockerfile的第一条必须是FROM指令,用来指定要制作的镜像继承自哪个镜像。需要说明的是,可以在Dockerfile中写多个FROM指令来构建复杂的镜像。另外一点,基础镜像决定了镜像的体积,非常重要

MAINTAINER指令

格式为:

LABEL MAINTAINER=<name>
如:
LABEL maintainer="xmcy0011<xmcy0011@sina.com>"

用来指定维护者信息。

WORKDIR指令

设置指令工作目录,因为Docker的每一条指令都是一层,层和层之间独立,上一层比如CD 到某个目录后,不会对下一层有影响。
格式为:

WORKDIR /path/to/workdir

RUN指令

格式为:

RUN <command>
或
RUN ["executable","param1","param2"...]。

如:

# 合并指令,通过\换行拼接
RUN go env -w GOPROXY=https://goproxy.io && \
    go mod tidy

该指令是用来执行shell命令的,当解析Dockerfile时,遇到RUN指令,Docker会将该指令翻译为“/bin/sh–c“xxx””,其中xxx为RUN后边的Shell命令。

多条指令换行在最后增加“ \”即可,代表拼接下一行的指令为一条指令。值得注意的时候,RUN指令尽可能合并,这样可以减少镜像的层数,从而减小镜像体积。

EXPOSE指令

格式为:

EXPOSE <port>[<port>...]
如:
EXPOSE 8080

该指令用来将容器中的端口号暴露出来,也可以通过“docker run–p”命令实现和服务器端口的映射。

CMD指令

该指令有三种格式:

  • 使用exec执行
CMD["executable","param1","param2"]
  • 在/bin/sh中执行,提供给需要交互的应用
CMD command param1 param2 
  • 提供给ENTRYPOINT的默认参数
CMD["param1","param2"]

指定启动容器时执行的命令,每个Dockerfile只能有一条CMD指令。如果指定了多条CMD指令,只有最后一条会被执行。值得说明的是,如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。

VOLUME指令

格式为:

VOLUME["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库或需要永久保存的数据。

如果和host共享目录,Dockerfile中必须先创建一个挂载点,然后在启动容器的时候通过“docker run –v $HOSTPATH:$CONTAINERPATH”来挂载,其中CONTAINERPATH就是创建的挂载点。

ADD指令

格式为:

ADD <src> <dest>
如:
ADD . .

该指令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;还可以是一个tar文件(自动解压为目录)。

COPY指令

格式为:

COPY <src> <dest>
如:
COPY . . # 拷贝当前目录

复制本地主机的(为Dockerfile所在目录的相对路径)到容器中的。当使用本地目录为源目录时,推荐使用COPY

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值