在Docker中运行Alpine Linux

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
docker images

查看本地的镜像。

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# ls
bin dev etc home lib media mnt proc root run sbin srv sys tmp usr var
bash-4.4# whoami
root
bash-4.4#

可以看到,以 root 身份登录到了 apline linux 中,并可以执行 bash 中的命令,当然也可以使用 vim 编辑文章(因为我们在最初制作镜像时安装了 vim)

这时,如果在主机上打开另外一个命令行窗口,可以察看到当前运行的容器

1
docker ps

系统显示

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来指定需要停止的容器。

本文标题:在Docker中运行Alpine Linux

文章作者:晨星

发布时间:2019年08月22日 - 14:08

最后更新:2020年09月16日 - 08:09

原始链接:https://www.mls-tech.info/docker/docker-build-alpine-image/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。