引言
学完了: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