docker镜像制作
构建定制化docker的镜像,选择合适的 Linux 作为构建镜像的基础。
Alpine
Alpine 是一个轻量的 Linux 发行版,适合制作镜像,本体大小只有58 MB 。使用 apk 包管理器。不过也可以使用 ubuntu 等 Linux 发行版来制作镜像,体积稍大,7080MB。所以可以从 Alpine 开始制作一个镜像。
1 | docker run -it alpine:3.11.3 #用新的稳定发行版,一般来说,支持两年。 |
下以添加 hexo 为例,打包镜像。
1 | apk add nodejs npm |
- alpine 实在是非常轻量,虽然构建镜像很适合,但是也会少了很多熟悉的工具,如果有打包好的镜像,可以直接下载对应 tag 的 alpine 镜像。比如 redis:4.0-alpine ,jenkins2.60.3-alpine(
什么老古董)。 - alpine 的 package repo 只有一个版本的包,这就意味着,当使用 alpine 构建特定镜像时,没有对应版本的包。比如 alpine3.4 中的 nodejs 包,只有6.7的。
- 选择 alpine 构建镜像前,如果对版本有特殊要求(不喜欢
最新版的大坑),先去 alpine 官网的 packages 查一下。 - 其他发行版的体积大,但是版本管理确实舒服。个人用来应应急是无所谓的。
1 | alpine 的常用命令 |
dockerfile
构建镜像这种事,当然还是自动化一点更好。写个 dockerfile 比较方便。
以最简单的 hello world 镜像构建为例。
1 | FROM scratch |
太简单了。再写几个
1 | FROM node:8.4 |
1 | ROM openjdk:8-jre # jar包基于jdk ,war包基于tomcat |
项目根目录下,可以新建一个 .dockerignore
,逐行写入不需要打包的文件。
以后有需求再加点实例吧。
常用指令
参考文档
FROM 指令初始化一个新的构建阶段并为后续指令设置基本镜像。有效的 Dockerfile 必须以 FROM 指令开头。(除非是 ARG 开头,FROM 指令支持在第一个 FROM 之前出现的 ARG 指令声明的变量)
1
2ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}RUN 有两种形式:
RUN command
(shell形式,命令在shell中运行,Linux默认为/bin/sh -c,Windows默认为cmd /S /C),RUN ["executable", "param1", "param2"]
(执行形式),- RUN 指令将在当前图像之上的新层中执行任何命令并提交结果。生成的提交图像将用于 Dockerfile 中的下一步。exec 形式可以避免 shell 字符串修改,并使用不包含指定 shell 可执行文件的基本映像运行命令。
CMD 的主要目的是为正在执行的容器提供默认值。这些默认值可以包括可执行文件,也可以省略可执行文件,在这种情况下,还必须指定 ENTRYPOINT 指令。只会生效一个,所以写多个也只有最后一个生效。
LABEL 指令将元数据添加到镜像,是键值对。
EXPOSE 指令指定 Docker 容器在运行时监听的网络端口。可以指定端口监听 TCP 还是 UDP,如果不指定协议,则默认为 TCP。端口暴露与否视 RUN 指令决定。
ENV 键值对,指定环境变量,可被后续调用。
COPY 和 ADD,COPY 复制主机或前阶段(–from)的文件或目录生成新的镜像层(不解压,不能访问网络资源),ADD 相似,不过支持使用 URL,tar 文件自动解压。
VOLUME 用于指定持久化目录(指定此目录可以被挂载出去)。
WORKDIR 工作目录,类似于cd命令。
docker-compose
如果一个项目需要用到多个容器(常有的事),那么容器的编排就十分重要了。
- dockerfile 定义环境
- docker-compose 定义服务,运行在隔离的环境中。构建完整的业务单元。
- 启动命令
docker compose up
安装
一般来说,linux 下安装 docker 是不会带 docker compose 的。除非装的是 docker engine ,安装 compose 可以用库也可以用二进制文件
1 | sudo apt-get update |
1 | DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} |
实例
A docker-compose.yml
looks like this:
1 | version: "3.9" # optional since v1.27.0 |
实操见此,官网文档过于详细,我都不想抄了。