鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

(可选)构建Docker镜像

构建Docker镜像可以确保环境一致性、实现快速部署、提供容器间隔离性、简化依赖管理,并具备良好的可移植性和灵活性,使应用能够在任何安装了Docker的环境中高效运行。

本节为Milvus安装操作的补充,以openeuler-22.03-lts-sp4:latest镜像为基础,将Milvus安装方式写进Dockerfile中,以此构建Milvus Docker镜像。

  1. 准备Docker环境。
    1
    yum install docker
    
  2. 准备基础镜像。

    参考表2中的链接,下载基础Docker镜像,并将镜像导入。

    • ARM版本
      1
      docker load -i openEuler-docker.aarch64.tar.xz
      
    • x86版本
      1
      docker load -i openEuler-docker.x86_64.tar.xz
      
  3. 准备Dockerfile。
    1. 创建并打开Dockerfile文件。
      1
      vim Dockerfile
      
    2. 按“i”进入编辑模式并将以下内容粘贴到文件中。
      FROM openeuler-22.03-lts-sp4:latest
      
      ARG TARGETARCH
      ARG CACHE_BUST
      RUN echo "Cache busting with $CACHE_BUST"
      # 根据系统类型获取架构
      RUN echo "target arch ${TARGETARCH}"
      
      # 安装依赖,包括python和openblas
      RUN yum install -y wget g++ gcc gdb libatomic libstdc++-static ninja-build git make zip unzip tar which \
          autoconf automake python3 python3-pip texinfo gfortran numa* libstdc* curl vim \
          pkg-config libuuid-devel libaio perl-IPC-Cmd libasan openblas-devel libomp hdf5 hdf5-devel gtest-devel && \
          yum clean all
      
      # 配置miniconda3
      RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-aarch64.sh -O miniconda.sh
      RUN sh miniconda.sh -b && rm miniconda.sh
      ENV PATH=/root/miniconda3/bin:$PATH
      RUN conda config --set auto_activate_base false
      
      # 配置pip镜像代理
      RUN mkdir /root/.pip && \
          echo -e "[global]\nindex-url=https://repo.huaweicloud.com/repository/pypi/simple\n[install]\ntrusted-host=repo.huaweicloud.com\n" >> /root/.pip/pip.conf
      
      # 创建python虚拟环境
      RUN conda create -y --name milvus python=3.11
      
      # 下载python依赖conan
      RUN conda init bash && source /root/.bashrc && conda activate milvus && pip install conan==1.61.0 && \
          conan remote add conancenter https://center.conan.io False -f && \
          conan remote add default-conan-local https://milvus01.jfrog.io/artifactory/api/conan/default-conan-local False -f && \
          sed -i '32s/self._verify_ssl = verify/self._verify_ssl = False/' /root/miniconda3/envs/milvus/lib/python3.11/site-packages/conans/client/downloaders/file_downloader.py
      
      # 下载安装cmake
      RUN wget -qO- "https://cmake.org/files/v3.27/cmake-3.27.5-linux-`uname -m`.tar.gz" | tar --strip-components=1 -xz -C /usr/local
      
      # 下载安装go
      RUN mkdir /root/go && mkdir /usr/local/go && \
          wget -qO- "https://repo.huaweicloud.com/go/go1.21.10/go1.21.10.linux-${TARGETARCH}.tar.gz" | tar --strip-components=1 -xz -C /usr/local/go
      ENV GOROOT=/usr/local/go
      ENV GOPATH=/root/go
      ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH
      ENV GO111MODULE=on
      ENV GOPROXY=https://repo.huaweicloud.com/repository/goproxy/
      ENV GOSUMDB=off
      
      # 下载安装rust
      RUN curl https://sh.rustup.rs -sSf | \
          sh -s -- --default-toolchain=1.73 -y
      ENV PATH=/root/.cargo/bin:$PATH
      
      # 下载安装OpenBLAS
      RUN mkdir OpenBLAS-0.3.10 && \
          wget -qO- https://github.com/xianyi/OpenBLAS/archive/v0.3.10.tar.gz | tar --strip-components=1 -xz -C OpenBLAS-0.3.10
      RUN cd OpenBLAS-0.3.10 && make FC=gfortran USE_OPENMP=1 -j && make install && \
          cd .. && rm -rf OpenBLAS-0.3.10
      ENV LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH
      
      # 下载安装etcd
      RUN mkdir /usr/local/etcd && \
          wget -qO- "https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-${TARGETARCH}.tar.gz" | tar --strip-components=1 -xz -C /usr/local/etcd
      ENV PATH=/usr/local/etcd:$PATH
      
      # 下载安装minio
      RUN wget -q "https://dl.min.io/server/minio/release/linux-${TARGETARCH}/minio" && chmod +x ./minio && mv ./minio /usr/bin/
      
      # 下载milvus
      RUN git clone https://github.com/milvus-io/milvus.git && \
          cd /root/milvus && git checkout v2.4.5

      1.如果物理机所在网络环境无法直接访问外网,可在Dockerfile中增加代理配置,在添加FROM之后添加ENV配置代理信息,在文件最后清除代理信息。修改示例如下:

      FROM openeuler-22.03-lts-sp4:latest
      
      # 增加代理,连接外网
      ENV http_proxy="http://代理服务用户名:代理服务密码@代理服务IP地址:代理服务端口"
      ENV https_proxy=$http_proxy
      
      ...
      
      ENV http_proxy=""
      ENV https_proxy=""

      2.若是需要外部证书以防止连接被拒绝,可以将证书放在Dockerfile同一级目录,并将证书复制到正确路径。修改示例如下:

      ...
      
      RUN echo "Cache busting with $CACHE_BUST"
      # 根据系统类型获取架构
      RUN echo "target arch ${TARGETARCH}"
      
      COPY certificate.crt /etc/pki/ca-trust/source/anchors/
      RUN update-ca-trust
      
      ...

      3.由于从GitHub上克隆Milvus可能花费很多时间,若是构建失败,则需要全部重新构建。可以先将Milvus准备好,放在Dockerfile同一级目录下,然后将其复制到镜像中。修改示例如下:

      ...
      
      # 下载安装minio
      RUN wget -q "https://dl.min.io/server/minio/release/linux-${TARGETARCH}/minio" && chmod +x ./minio && mv ./minio /usr/bin/
      
      COPY milvus/ /root/milvus
      RUN cd /root/milvus && git checkout v2.4.5
      
      ...
  4. 构建镜像。

    通过以下命令,开始通过Dockerfile文件构建镜像。

    • ARM
      1
      docker build --no-cache --build-arg TARGETARCH=arm64 --build-arg CACHE_BUST=$(date +%s) -t openeuler-22.03-lts-sp4-milvus:latest .
      
    • x86
      1
      docker build --no-cache --build-arg TARGETARCH=amd64 --build-arg CACHE_BUST=$(date +%s) -t openeuler-22.03-lts-sp4-milvus:latest .
      
  5. 导出镜像。

    将构建好的镜像打包成本地磁盘上的tar包文件。

    1
    docker save -o openeuler-22.03-lts-sp4-milvus.tar openeuler-22.03-lts-sp4-milvus:latest
    
  6. 导入镜像。
    若是需要使用镜像,可以将其上传到相应的服务器中,然后将tar包导入到本地镜像仓库。
    1
    docker load -i openeuler-22.03-lts-sp4-milvus.tar
    
  7. 创建容器。

    使用镜像运行一个容器实例,并以后台方式运行。命令中参数解释如表1 命令中的参数说明所示。

    1
    docker run -d -it --cpus=16 --cpuset-cpus=0-15 --cpuset-mems=0 -m 64g --name milvus-16u64g-01 --network host --privileged=true -v /data/milvus:/data/milvus openeuler-22.03-lts-sp4-milvus /bin/bash
    
    表1 命令中的参数说明

    参数

    参数含义

    -d

    后台运行容器。

    -it

    i表示分配一个交互终端,t表示分配一个伪tty设备,可以支持终端登录。

    --cpus=16

    给容器分配16个CPU核。

    --cpuset-cpus=0-15

    绑定具体CPU核。

    --cpuset-mems=0

    内存绑定配置,从NUMA0申请。

    -m

    给容器分配多大的内存。

    --name

    给容器起的名称。

    --network host

    容器和主机共享网络。

    --privileged=true

    使用root权限。

    须知:

    这个选项执行了以下两项操作:为容器添加了所有capabilities,并允许容器访问主机的所有设置。这意味着,在设置privileged = true的容器中,我们能够执行许多平时无法进行的操作,比如加载内核模块和直接操作硬件设备。然而,这一选项也带来了严重的安全隐患,可能使容器突破边界,对主机进行任意操作。

    -v /data/milvus:/data/milvus

    表示文件挂载,Docker和主机共享的文件目录。

    openeuler-22.03-lts-sp4

    使用的镜像的名称。

    /bin/bash

    启动容器执行的命令。

  8. 进入容器。

    进入容器后可以像在宿主机上一样操作。

    1
    docker exec -it milvus-16u64g-01 /bin/bash
    

由于一些可能的故障需要编译一次Milvus之后才能通过生成配置文件进行修改,例如编译Milvus出现未找到GCC的版本,构建的镜像并没有进行Milvus的编译。在创建容器之后,需要进入容器中,通过以下命令进行编译,遇到问题则参考故障排除

conda activate milvus
cd /root/milvus
make milvus