使用Alpine鏡像構建鏡像


一、alpine介紹

1、Alpine Linux是一個完整的操作系統,像其他操作系統一樣,可以將Alpine安裝到本地硬盤中,使用apk進行包管理。

包含了以下特點:

小巧:基於Musl libc和busybox,和busybox一樣小巧,最小的Docker鏡像只有5MB;

安全:面向安全的輕量發行版;

簡單:提供APK包管理工具,軟件的搜索、安裝、刪除、升級都非常方便。

適合容器使用:由於小巧、功能完備,非常適合作為容器的基礎鏡像。

2、國內源

清華大學: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"]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM