先介绍一下我的需求,conda和代码在离线服务器1上,想要将他们打包成docker镜像后放到另一个离线服务器2上使用(迁移)

1.在有网的环境下 拉取基础镜像

我这里是拉取的指定版本24.5.0

docker pull continuumio/miniconda3:24.5.0-0

查看镜像:

docker images

2. 打包基础镜像

docker save -o  miniconda3_24_5_0.tar continuumio/miniconda3:24.5.0-0

3.拷贝到离线环境

4.离线下安装镜像

docker load -i <tar文件路径>

docker load -i miniconda3_24_5_0.tar 

5.打包conda环境,切到需要打包的环境中

conda activate env1 
conda pack -n env1 -o env1.tar.gz

如果显示conda没有pack选项,说明当前虚拟环境还没有安装conda-pack

如果为离线环境,需要在有网的环境下把whl包下载,copy到离线环境,安装:

pip install conda_pack-0.8.0-py2.py3-none-any.whl

如果有网下,则可以直接在当前环境中

pip install conda-pack

6.将自己的conda环境打到基础镜像中

我当前的目录层级是:

test是代码文件夹,app.py是一个flask应用


mv_dir/
│
├── Dockerfile
├── test/
│   ├── app.py
├── env1.tar.gz


app.py 

from flask import Flask


app = Flask(__name__)


@app.route('/')
def index():
    return "测试容器部署!"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)


(1)写Dockerfile

# 使用基于 Miniconda 的镜像
FROM continuumio/miniconda3

# 设置工作目录
WORKDIR /opt

# 复制环境文件和应用程序代码
COPY . /opt  

# 创建并激活 Conda 环境 + 解压、创建文件夹、解压到哪
RUN 
    mkdir -p /opt/conda/envs/env1 && \
    tar -zxvf env1.tar.gz -o /opt/conda/envs/env1 && \
    conda env create -f /opt/environment.yml && \
    conda init bash && \
    echo "conda activate myenv" >> /root/.bashrc

# 声明使用的环境
ENV PATH /opt/conda/envs/myenv/bin:$PATH

# 将web服务器的端口8000暴露出来
EXPOSE 8000

# 运行应用程序
CMD ["python", "test/app.py", "--port", "8000"]

(2)打包镜像

在此目录下(含dockerfile的目录)运行

docker build -t 自己取镜像名:自己版本 .
docker build -t test:v1 .


# test是自定义的镜像名称,.表示Dockerfile所在的当前目录。

(3)查看当前镜像即可看到新镜像test

docker images

(4)打包镜像

docker save -o  test.tar test:v1

7.打包好的环境和代码放到离线服务器2中

docker load -i test.tar 

8.启动容器

docker run --rm -it -p:8000:8000 --name ceshi -v <本机文件夹路径>:<容器文件夹路径> -d test:v1
  • -it 选项使容器的标准输入保持打开,并分配一个伪终端。
  • --rm 选项告诉 Docker 在容器退出时自动删除它,避免留下无用的容器。
  • -d 后台运行容器
  • -p 宿主机端口:容器端口 映射
  • -v <本机文件夹路径>:<容器文件夹路径> 进行数据卷挂载,方便随时修改容器内代码
  • --name <容器名称> 是给容器命名,不添加系统会自动生成名称
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐