(可选)构建Docker镜像
构建Docker镜像可以确保环境一致性、实现快速部署、提供容器间隔离性、简化依赖管理,并具备良好的可移植性和灵活性,使应用能够在任何安装了Docker的环境中高效运行。
本节为Milvus安装操作的补充,以openeuler-22.03-lts-sp4:latest镜像为基础,将Milvus安装方式写进Dockerfile中,以此构建Milvus Docker镜像。
- 准备Docker环境。
1
yum install docker
- 准备基础镜像。
参考表2中的链接,下载基础Docker镜像,并将镜像导入。
- ARM版本
1
docker load -i openEuler-docker.aarch64.tar.xz
- x86版本
1
docker load -i openEuler-docker.x86_64.tar.xz
- ARM版本
- 准备Dockerfile。
- 创建并打开Dockerfile文件。
1
vim Dockerfile
- 按“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 ...
- 创建并打开Dockerfile文件。
- 构建镜像。
通过以下命令,开始通过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 .
- ARM
- 导出镜像。
将构建好的镜像打包成本地磁盘上的tar包文件。
1
docker save -o openeuler-22.03-lts-sp4-milvus.tar openeuler-22.03-lts-sp4-milvus:latest
- 导入镜像。若是需要使用镜像,可以将其上传到相应的服务器中,然后将tar包导入到本地镜像仓库。
1
docker load -i openeuler-22.03-lts-sp4-milvus.tar
- 创建容器。
使用镜像运行一个容器实例,并以后台方式运行。命令中参数解释如表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
启动容器执行的命令。
- 进入容器。
进入容器后可以像在宿主机上一样操作。
1
docker exec -it milvus-16u64g-01 /bin/bash
由于一些可能的故障需要编译一次Milvus之后才能通过生成配置文件进行修改,例如编译Milvus出现未找到GCC的版本,构建的镜像并没有进行Milvus的编译。在创建容器之后,需要进入容器中,通过以下命令进行编译,遇到问题则参考故障排除。
conda activate milvus cd /root/milvus make milvus