docker 创建conda镜像,保存容器为新镜像,运行docker

1. pull 一个 conda镜像

首先查看镜像库:

$ docker search miniconda

docker 创建conda镜像,保存容器为新镜像,运行docker_第1张图片

选择第一个conda镜像

$ docker pull continuumio/miniconda3

2. pull好镜像后,查看,修改tag和image名称

查看镜像:

$ docker images

修改REPOSITORY 和TAG名称

$ docker tag ????? xxxxxxy:1.0
#?????为IMAGE ID   xxxxxxy为你想要设置的REPOSITORY镜像名称   1.0为你想要设置的TAG名称

3. run镜像

或者直接run一个conda镜像,将启动一个容器:

3.1 交互运行

docker run -it continuumio/miniconda3 /bin/bash

docker run -it xxxxxxy:1.0 /bin/bash
#xxxxxxy为镜像名称  1.0为TAG名称
#-i: 交互式操作。
#-t: 终端。
#/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是 /bin/bash。

run镜像后会进入镜像中的容器(一个镜像可以有多个容器),以下就为容器环境:
要退出容器终端,直接输入  exit,或者ctrl+d

3.2 后台运行

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。

$ docker run -itd --name ubuntu-test ubuntu /bin/bash

4. 在容器中使用conda创建虚拟环境

conda create -n xxx python=xx
#xxx:虚拟环境名称 xx:python版本
#若有以下报错 ,尝试先设置--proxy代理或者镜像源:  conda config --set proxy_servers.https http://xxxxxx

Collecting package metadata (current_repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.

'https//repo.anaconda.com/pkgs/main/linux-64'

在容器里进入conda创建的虚拟环境

conda activate xXX

    在该虚拟环境中部署需要的运行环境,代码等。

5. 复制文件到容器中

从Linux本地将代码,需要的文件等复制到容器中。

5.1 查看容器ID

docker ps   #查看容器信息

5.2 复制文件到容器中

docker cp 本地路径 容器ID:容器路径
#eg: docker cp /home/projects/test.py 39dfc9287ea6:/home/Atpo/scrip
#将本地test.py复制到39dfc9287ea6容器的/home/Atpo/scrip路径下

6. 保存容器为新的docker镜像

(新开一个Linux终端窗口,不要退出此容器,否则容器中建立的虚拟环境,路径等不会被保存):

6.1查看完整容器ID

docker ps --no-trunc

6.2 保存容器为新镜像

将部署好的容器保存为新镜像

docker commit 容器ID 镜像名称:tag名称
docker commit 39dfc9287ea6fe5e051faf17c773b3a09383c5ecd3d990cdbfeec491b474a3ce xxxxxxy:2.0

6.3 查看新镜像是否建立成功 

docker images

可以看到已经生成了2.0的镜像

进入这个镜像可以看到里面含有前面复制进来的文件,以及创建的虚拟环境等

7. 本地挂载路径运行docker镜像中的代码

在Linux终端下直接运行镜像中的代码 并将代码的输出文件 映射到Linux终端路径下

docker run -v /home/XXX/project/:/home/host xxxxxy:2.0 /bin/bash -c 'export PATH=/root/conda/bin/:$PATH && source activate envname && cd /home/py_workspace && python test.py'
# /home/XXX/project/  为Linux终端的路径
# /home/host 为docker镜像中的路径
# -v /home/XXX/project/:/home/host 将两个路径共享
# xxxxxy:2.0 为镜像名称:tag名称
# -c'cmd' -c后为在镜像中执行的命令,
##例如上面 export PATH=/root/conda/bin/:$PATH && source activate envname 激活镜像中的虚拟环境 
##cd /home/py_workspace && python test.py 进入test.py所在路径 并运行入test.py
# 如果test.py运行后有输出文件并输出到/home/host路径下  那么Linux终端的路径/home/XXX/project/下也会生成这个输出文件

 8. 删除镜像

在打包镜像过程中 可能发生将一个容器新建成新的镜像 进入这个新镜像后,在新镜像的容器内又有了新改动,那就需要再将这个容器保存为新镜像,产生多个镜像,需要将之前的镜像删除

docker rmi 镜像名称:TAG名称     #删除镜像
docker rmi -f 镜像名称:TAG名称   #强制删除镜像

9. 删除镜像中产生的文件

在镜像中产生文件为root权限,映射到本地后,想删除可能发生删不掉的情况,这时可以将要删除的文件所在的本地路径挂载到docker镜像里的路径进行删除

docker run -itv $path/out/result:$path/out REPOSITORY:V2 /bin/bash 

#进入容器后可以看到本地想删除的result路径下文件,删掉后退出容器,在本地上看已经没有这个文件了
#注意映射路径时,删除文件一定要看仔细了  别删了其他不想删的

10. 本地挂载路径运行镜像中的代码完整示例

sudo docker run --rm -v $本地路径:$容器路径 REPOSITORY:TAG /bin/bash -c "export PATH=/opt/conda/envs/bin:$PATH && source /opt/conda/bin/activate env_name && python $py所在路径/mask.py  py所需参数"

#--rm 运行结束会自动删除容器

11. 将镜像移动到其他服务器

11.2 导出镜像

docker save -o nginx.tar nginx:latest 

#将镜像保存到tar文件

11.3 加载镜像

docker load -i nginx.tar

#将导出的镜像文件复制到想要部署的服务器中,通过上述命令部署
#如果报错,很大概率是镜像较大,服务器空间不够,或者是分配给docker的空间不够

12. run容器

#先启docker,后台运行一个容器,并为容器命名

docker run -it -d --name 容器名 -v $path_local:$path_docker REPOSITORY:TAG /bin/bash

#后台运行容器中的任务代码
docker exec -d 容器名 /bin/bash -c '运行命令'

#进入容器,使用docker exec 进入,此命令会退出容器终端,但不会导致容器的停止
docker exec -it 容器名 /bin/bash

你可能感兴趣的:(docker,conda,python)