1. pull 一个 conda镜像
首先查看镜像库:
$ docker search miniconda
选择第一个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
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
精彩链接
发表评论