Alpine Linux 是一个非常轻量级的 Linux 发行版(官网 ),其采用 musl libc 和 busybox 以减小系统的体积和运行时资源的消耗,基本运行系统还不到5M, 同时还提供了自己包管理工具apk。 是制作Docker镜像的绝佳环境。本文就演示构建一个基础的 Alpine Linux 镜像。
本演示基于 Windows 10。 Docker Desktop 的版本为 2.1.0.1。 Docker Engine 的版本为: 19.03.1
新建 Dockfile 文件 在任意目录下新建一个名为 Dockerfile 的文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 FROM alpine:3.8 MAINTAINER Jini RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.8/main/" > /etc/apk/repositories RUN apk update \ && apk upgrade \ && apk add --no-cache bash \ bash-doc \ bash-completion \ openrc \ vim \ && rm -rf /var/cache/apk/* \ && /bin/bash
以上代码的第1行声明本镜像(image)基于官方的3.8版本的镜像。
第5行我们将alpine的软件更新源改为清华大学的源,这样在安装包,更新包时会快很多。
从第7行开始,我们执行了系列的命令,更新软件包,安装了bash 和 Vim 等最基础,最常用的软件。
构建镜像(Image) 保存文件后,打开命令行窗口,在与 Dockerfile 同一目录中执行
1 docker build -t alpine-base .
使用 docker 的 build 子命令, 基于 Dockerfile, 构建一个标签名为 alpine-base 的 Docker 镜像。
执行命令后,系统显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Sending build context to Docker daemon 3.072kB Step 1/3 : FROM alpine:3.8 3.8: Pulling from library/alpine c87736221ed0: Pull complete Digest: sha256:04696b491e0cc3c58a75bace8941c14c924b9f313b03ce5029ebbc040ed9dcd9 Status: Downloaded newer image for alpine:3.8 ---> dac705114996 Step 2/3 : MAINTAINER Jini ---> Running in 1acafed7029a Removing intermediate container 1acafed7029a ---> 5985ac336505 Step 3/3 : RUN apk update && apk upgrade && apk add --no-cache bash bash-doc bash-completion openrc vim && rm -rf /var/cache/apk/* && /bin/bash ---> Running in 2e63dc17b1dc fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz v3.8.4-172-g44322cf3a8 [http://dl-cdn.alpinelinux.org/alpine/v3.8/main] v3.8.4-166-g8b2616ec00 [http://dl-cdn.alpinelinux.org/alpine/v3.8/community] OK: 9565 distinct packages available (1/2) Upgrading musl (1.1.19-r10 -> 1.1.19-r11) (2/2) Upgrading musl-utils (1.1.19-r10 -> 1.1.19-r11) Executing busybox-1.28.4-r3.trigger OK: 4 MiB in 13 packages fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz (1/10) Installing ncurses-terminfo-base (6.1_p20180818-r1) (2/10) Installing ncurses-terminfo (6.1_p20180818-r1) (3/10) Installing ncurses-libs (6.1_p20180818-r1) (4/10) Installing readline (7.0.003-r0) (5/10) Installing bash (4.4.19-r1) Executing bash-4.4.19-r1.post-install (6/10) Installing bash-completion (2.8-r0) (7/10) Installing bash-doc (4.4.19-r1) (8/10) Installing openrc (0.35.5-r5) Executing openrc-0.35.5-r5.post-install (9/10) Installing lua5.3-libs (5.3.5-r2) (10/10) Installing vim (8.1.1365-r0) Executing busybox-1.28.4-r3.trigger OK: 47 MiB in 23 packages Removing intermediate container 2e63dc17b1dc ---> 2d847942ce24 Successfully built 2d847942ce24 Successfully tagged alpine-base:latest SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
构建完成后,执行
查看本地的镜像。
1 2 3 REPOSITORY TAG IMAGE ID CREATED SIZE alpine-base latest 2d847942ce24 7 minutes ago 38.9MB alpine 3.8 dac705114996 5 months ago 4.41MB
可以看到, 当前系统又两个镜像,要给是 alpine 官方的 3.8 版本镜像,只有 4.41M 大小。另一个就是我们基于官方镜像建立的自己的镜像: alpine-base。
运行容器 在 Docker 中,每个容器都是基于镜像的。要运行在上面建立的 alpine-base 镜像,可以运行
1 docker run -t -i alpine-base /bin/bash
该命令会自动建立一个基于 apline-base 镜像的容器,并连接到该容器的 bash 终端,就好像远程登录了一台 Linux 主机, 其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开, 效果如下:
1 2 3 4 5 bash-4.4 bin dev etc home lib media mnt proc root run sbin srv sys tmp usr var bash-4.4 root bash-4.4
可以看到,以 root 身份登录到了 apline linux 中,并可以执行 bash 中的命令,当然也可以使用 vim 编辑文章(因为我们在最初制作镜像时安装了 vim)
这时,如果在主机上打开另外一个命令行窗口,可以察看到当前运行的容器
系统显示
1 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80784fb08ff8 alpine-base "/bin/bash" 5 minutes ago Up 5 minutes loving_nightingale
停止容器 可以执行 docker stop 命令来停止一个运行中的容器,如下:
1 docker stop 80784fb08ff8
这里我们通过容器的id来指定需要停止的容器。