一、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"]
