zoukankan      html  css  js  c++  java
  • 使用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"]
    
  • 相关阅读:
    RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例
    Spring入门(四):使用Maven管理Spring项目
    Java基础知识常见面试题汇总 第三篇
    Java基础知识常见面试题汇总 第二篇
    Java基础知识常见面试题汇总 第一篇
    程序员如何巧用Excel提高工作效率 第二篇
    程序员如何巧用Excel提高工作效率
    数据库管理工具DataGrip使用总结(一)
    MySql给表添加列和注释
    Spring入门(三):通过JavaConfig装配bean
  • 原文地址:https://www.cnblogs.com/zjz20/p/14536998.html
Copyright © 2011-2022 走看看