docker镜像制作

docker镜像制作

构建定制化docker的镜像,选择合适的 Linux 作为构建镜像的基础。

Alpine

Alpine 是一个轻量的 Linux 发行版,适合制作镜像,本体大小只有58 MB 。使用 apk 包管理器。不过也可以使用 ubuntu 等 Linux 发行版来制作镜像,体积稍大,7080MB。所以可以从 Alpine 开始制作一个镜像。

1
2
3
4
5
6
docker run -it alpine:3.11.3   #用新的稳定发行版,一般来说,支持两年。
apk --help #查看包管理器的支持。
apk update

dcoker ps #在新建终端查看容器运行
docker diff id #以id查找容器,查看文件更改历史

下以添加 hexo 为例,打包镜像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apk add nodejs npm
node -v
npm -v
npm i hexo-cli -g
hexo -v
npm install
cd /home
mkdir bolg
cd blog
apk add git
hexo init
hexo g
# 新建终端
docker container ls
docker commit id your_name/image_name:tag_name #打包成新镜像
  • alpine 实在是非常轻量,虽然构建镜像很适合,但是也会少了很多熟悉的工具,如果有打包好的镜像,可以直接下载对应 tag 的 alpine 镜像。比如 redis:4.0-alpine ,jenkins2.60.3-alpine( 什么老古董)。
  • alpine 的 package repo 只有一个版本的包,这就意味着,当使用 alpine 构建特定镜像时,没有对应版本的包。比如 alpine3.4 中的 nodejs 包,只有6.7的。
  • 选择 alpine 构建镜像前,如果对版本有特殊要求(不喜欢最新版的大坑),先去 alpine 官网的 packages 查一下。
  • 其他发行版的体积大,但是版本管理确实舒服。个人用来应应急是无所谓的。
1
2
3
4
5
6
7
8
9
10
11
#alpine 的常用命令
apk # 包管理,下为参数,一般都是见词知意的。
update, upgrade, #更新镜像源,升级软件包
search, info, #查找与列出包信息
add, del,automove #添加与删除,默认自动执行的清理

rc- #服务管理,运行级的增删服务。我不用,所以不写。留个索引方便以后查
#使用服务管理需要安装openrc
apk add openrc

#一般就是包管理和服务管理这两类,详见 alpine 官网 docs/User Handbook/Working With Alpine

dockerfile

构建镜像这种事,当然还是自动化一点更好。写个 dockerfile 比较方便。

以最简单的 hello world 镜像构建为例。

1
2
3
4
FROM scratch 
# base on scrstch
COPY hello /
CMD ["/hello"]

太简单了。再写几个

1
2
3
4
5
FROM node:8.4
COPY . /test
WORKDIR /test
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 5000
1
2
3
4
5
6
ROM openjdk:8-jre	# jar包基于jdk ,war包基于tomcat
WORKDIR /app
ADD demo-0.0.1-SNAPSHOT.jar app.jar # 将上下文中 jar包复制到 /app目录下,并且重命名为app.jar
EXPOSE 8081 # 暴露端口
ENTRYPOINT[ "java" , "-jar" ] # 启动应用固定命令
CMD["app.jar"] # 动态传递jar包名

项目根目录下,可以新建一个 .dockerignore ,逐行写入不需要打包的文件。

以后有需求再加点实例吧。

常用指令

参考文档

  • FROM 指令初始化一个新的构建阶段并为后续指令设置基本镜像。有效的 Dockerfile 必须以 FROM 指令开头。(除非是 ARG 开头,FROM 指令支持在第一个 FROM 之前出现的 ARG 指令声明的变量)

    1
    2
    ARG  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 键值对,指定环境变量,可被后续调用。

  • COPYADD,COPY 复制主机或前阶段(–from)的文件或目录生成新的镜像层(不解压,不能访问网络资源),ADD 相似,不过支持使用 URL,tar 文件自动解压。

  • VOLUME 用于指定持久化目录(指定此目录可以被挂载出去)。

  • WORKDIR 工作目录,类似于cd命令。

docker-compose

如果一个项目需要用到多个容器(常有的事),那么容器的编排就十分重要了。

  • dockerfile 定义环境
  • docker-compose 定义服务,运行在隔离的环境中。构建完整的业务单元。
  • 启动命令 docker compose up

安装

一般来说,linux 下安装 docker 是不会带 docker compose 的。除非装的是 docker engine ,安装 compose 可以用库也可以用二进制文件

1
2
3
sudo apt-get update
sudo apt-get install docker-compose-plugin
docker compose version #verify that docker-compose is installed correctly
1
2
3
4
5
6
7
8
9
10
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}

mkdir -p $DOCKER_CONFIG/cli-plugins

curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose

chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

docker compose version

实例

A docker-compose.yml looks like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "3.9"  # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}

实操见此,官网文档过于详细,我都不想抄了。

参考

Alpine

Best practices for writing Dockerfiles

docker/compose

Overview of Docker Compose

作者

ivy

发布于

2021-09-29

更新于

2023-03-25

许可协议

CC BY-NC-SA 4.0

评论