使用Alpine镜像构建镜像
一、alpine介绍
1、Alpine Linux是一个完整的操作系统,像其他操作系统一样,可以将Alpine安装到本地硬盘中,使用apk
进行包管理。
包含了以下特点:
小巧:基于Musl libc和busybox,和busybox一样小巧,最小的Docker镜像只有5MB;
安全:面向安全的轻量发行版;
简单:提供APK包管理工具,软件的搜索、安装、删除、升级都非常方便。
适合容器使用:由于小巧、功能完备,非常适合作为容器的基础镜像。
清华大学:https://mirror.tuna.tsinghua.edu.cn/alpine/
阿里云:https://mirrors.aliyun.com/alpine/
中科大:http://mirrors.ustc.edu.cn/alpine/
修改成中科大的源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
或者
echo 'http://mirrors.ustc.edu.cn/alpine/v3.7/main http://mirrors.ustc.edu.cn/alpine/v3.7/community http://mirrors.ustc.edu.cn/alpine/edge/main http://mirrors.ustc.edu.cn/alpine/edge/community http://mirrors.ustc.edu.cn/alpine/edge/testing' >/etc/apk/repositories
apk update更新
# apk update fetch https://mirrors.ustc.edu.cn/alpine/v3.13/main/x86_64/APKINDEX.tar.gz fetch https://mirrors.ustc.edu.cn/alpine/v3.13/community/x86_64/APKINDEX.tar.gz v3.13.2-80-g54a52c1386 [https://mirrors.ustc.edu.cn/alpine/v3.13/main] v3.13.2-82-g032419bdd3 [https://mirrors.ustc.edu.cn/alpine/v3.13/community] OK: 13878 distinct packages available
3、apk常用命令
apk update $ apk update #更新最新镜像源列表 apk search $ apk search #查找所以可用软件包 $ apk search -v #查找所以可用软件包及其描述内容 $ apk search -v 'acf*' #通过软件包名称查找软件包 $ apk search -v -d 'docker' #通过描述文件查找特定的软件包 apk add $ apk add openssh #安装一个软件 $ apk add openssh openntp vim #安装多个软件 $ apk add --no-cache mysql-client #不使用本地镜像源缓存,相当于先执行update,再执行add apk info $ apk info #列出所有已安装的软件包 $ apk info -a zlib #显示完整的软件包信息 $ apk info --who-owns /sbin/lbu #显示指定文件属于的包 apk upgrade $ apk upgrade #升级所有软件 $ apk upgrade openssh #升级指定软件 $ apk upgrade openssh openntp vim #升级多个软件 $ apk add --upgrade busybox #指定升级部分软件包 apk del $ apk del openssh #删除一个软
4、Alpine Linux服务管理
alpine没有使用fedora的systemctl来进行服务管理,使用的是RC系列命令
rc-update
rc-update主要用于不同运行级增加或者删除服务。
rc-status
rc-status 主要用于运行级的状态管理。
rc-service
rc-service主用于管理服务的状态
试例
1.增加服务到系统启动时运行,下例为docker rc-update add docker boot 2.重启网络服务 rc-service networking restart 3.列出所有服务 rc-status -a
二、docker中运行一个alpine镜像
1、pull alpine
docker pull alpine
2、运行alpine镜像
docker run --name nginx-alpine -d alpine tail -f /etc/hosts fb867a5f3df8958cd791d6a46b55a64638b29e1673da4d2271ec3622171a8e5c
3、进入alpine容器
docker exec -it fb867a5f3df8 /bin/sh / # / # ls bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var / # cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.13.2 PRETTY_NAME="Alpine Linux v3.13" HOME_URL="https://alpinelinux.org/" BUG_REPORT_URL="https://bugs.alpinelinux.org/" / # ping baidu.com PING baidu.com (220.181.38.148): 56 data bytes 64 bytes from 220.181.38.148: seq=0 ttl=127 time=7.400 ms 64 bytes from 220.181.38.148: seq=1 ttl=127 time=8.300 ms 64 bytes from 220.181.38.148: seq=2 ttl=127 time=15.404 ms --- baidu.com ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 7.275/9.594/15.404 ms
三、使用alpine构建镜像
1、dockerhub上的例子
FROM alpine:3.7 RUN apk add --no-cache mysql-client ENTRYPOINT ["mysql"]
2、构建一个nginx镜像
FROM alpine:3.3 MAINTAINER Marin "1164216442@qq.com.cn" EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"] VOLUME ["/var/cache/nginx"] RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \ && echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ && apk update \ && apk add nginx \ # && build_pkgs="build-base linux-headers openssl-dev pcre-dev wget zlib-dev" \ # && runtime_pkgs="ca-certificate openssl pcre zlib" \ # && apk --update add ${build_pkgs} ${runtime_pkgs} \ # && cd /tmp \ # && wget http://nginx.org/download/nginx-1.16.1.tar.gz \ # && tar xzf nginx-1.16.1.tar.gz \ # && cd /tmp/nginx-1.16.1 \ # && ./configure \ # --prefix=/etc/nginx \ # --sbin-path=/usr/sbin/nginx \ # --conf-path=/etc/nginx/nginx.conf \ # --error-log-path=/var/log/nginx/error.log \ # --http-log-path=/var/log/nginx/access.log \ # --pid-path=/var/run/nginx.pid \ # --lock-path=/var/run/nginx.lock \ # --http-client-body-temp-path=/var/cache/nginx/client_temp \ # --http-proxy-temp-path=/var/cache/nginx/proxy_temp \ # --http-fascgi-temp-path=/var/cache/nginx/fascgi_temp \ # --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \ # --http-scgi-temp-path=/var/cache/nginx/scgi_temp \ # --user=nginx \ # --group=nginx \ # --with-http_ssl_module \ # --with-http_realip_module \ # --with-http_addition_module \ # --with-http_sub_module \ # --with-http_dav_module \ # --with-http_flv_module \ # --with-http_mp4_module \ # --with-http_gunzip_module \ # --with-http_gzip_static_module \ # --with-http_random_index_module \ # --with-http_secure_link_module \ # --with-http_stub_status_module \ # --with-http_auth_request_module \ # --with-threads \ # --with-stream \ # --with-stream_ssl_module \ # --with-http_slice_module \ # --with-mail \ # --with-mail_ssl_module \ # --with-file-aio \ # --with-http_v2_module \ # --with-ipv6 \ #&& make \ #&& make install \ #&& sed -i -e 's/#access_log logs\/access.log main;/access_log \/dev\/stdout;/' -e 's/#error_log logs\/error.log notice;/error_log stderr notice;/' /etc/nginx/nginx.conf \ && rm -rf /tmp/* \ && apk del ${build_pkgs} \ rm -rf /var/cache/apk/*
注:"nginx", "-g", "daemon off;"
- 在容器里nginx是以daemon方式启动,退出容器时,nginx程序也会随着停止
- /usr/local/nginx/sbin/nginx 使用前台方式永久运行:/usr/local/nginx/sbin/nginx -g "daemon off;"
docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
多阶段构建,go应用容器化打包示例
基础镜像 golang:1.16.2-alpine比golang:1.16.2小500M左右
# 构建阶段 build stage FROM golang:stretch AS build-env ADD . /go/src WORKDIR /go/src ENV GO111MODULE=on ENV APP_NAME="goappname" RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -mod=vendor -o ${APP_NAME} RUN pwd && ls -lsa # 构建物打包阶段 final stage FROM alpine:latest ## 配置 apk包加速镜像为阿里 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories ## 安装 一些基础包 RUN apk update \ && apk upgrade \ #&& apk add s6 \ && apk add bash \ #&& apk add nghttp2-dev \ && apk add ca-certificates \ && apk add wget \ #&& apk add curl \ #&& apk add tcpdump \ && apk add iputils \ && apk add iproute2 \ && apk add libc6-compat \ && apk add -U tzdata \ && rm -rf /var/cache/apk/* ## 设置 操作系统时区 RUN rm -rf /etc/localtime \ && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ## 打包 应用 ENV APP_NAME="goappname" ENV APP_ROOT="/data/apps/"${APP_NAME} RUN mkdir -p $APP_ROOT WORKDIR $APP_ROOT ## 从构建阶段复制构建物 COPY --from=build-env /go/src/${APP_NAME} $APP_ROOT/ ## 增加 配置文件、其他依赖文件 COPY config/config.toml.tpl $APP_ROOT/config/ RUN ls -lsah && pwd && mv ./config/config.toml.tpl ./config/config.toml && ls -lsah $APP_ROOT/config && cat config/config.toml ## 配置 对外端口 EXPOSE 10000 # 设置启动时预期的命令参数, 可以被 docker run 的参数覆盖掉. CMD $APP_ROOT/$APP_NAME
docker-compose.yml
version: "3.1" services: goappname: build: ./ image: registry.cn-shanghai.aliyuncs.com/goappname/goappname container_name: goappname deploy: restart_policy: condition: on-failure ports: - "0.0.0.0:10000:10000" volumes: - "/data/apps/goappname/config/:/data/apps/goappname/goappname/config/"
Python应用容器化打包示例
FROM alpine:latest # 打标签 LABEL version="1.0" \ description="alpine:latest" \ maintainer="wwek<licoolgo@gmail.com>" # 配置apk包加速镜像为阿里 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories # 安装一些基础包 RUN apk update \ && apk upgrade \ && apk add s6 \ && apk add bash \ # && apk add nghttp2-dev \ && apk add ca-certificates \ && apk add wget \ # && apk add curl \ # && apk add tcpdump \ # && apk add bash-completion \ && apk add iputils \ && apk add iproute2 \ && apk add libc6-compat \ && apk add -U tzdata \ && rm -rf /var/cache/apk/* # 设置 操作系统时区 RUN rm -rf /etc/localtime \ && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 设置时区变量 ENV TIME_ZONE Asia/Shanghai # 安装 python3、升级pip、setuptools RUN apk add --no-cache python3 \ #&& apk add --no-cache python3-dev \ && python3 -m ensurepip \ && rm -r /usr/lib/python*/ensurepip \ && pip3 install --default-timeout=100 --no-cache-dir --upgrade pip \ && pip3 install --default-timeout=100 --no-cache-dir --upgrade setuptools \ && if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi \ && if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi \ && rm -rf /var/cache/apk/* \ && rm -rf ~/.cache/pip # 设置 语言支持 ENV LANG=C.UTF-8 # 配置 应用工作目录 WORKDIR /data/apps/appdir # 增加 项目文件 ADD appmain.py ./ ADD 你的py文件2.py ./ ADD 目录1 ./ ADD requirements.txt ./ # 安装 项目依赖包 RUN pip install -r requirements.txt # 配置 对外端口 EXPOSE 11000 # 设置启动时预期的命令参数, 可以被 docker run 的参数覆盖掉. CMD ["python", "appmain.py"]