edited by nrzheng,20220224
创建镜像
要先准备两个文件,如下图所示:  其中,Dockerfile内容如下:
# BASE IMAGE
FROM nvidia/cuda:10.0-cudnn7-runtime-ubuntu16.04
SHELL ["/bin/bash","-c"]
WORKDIR /tmp
# copy安装文件
COPY Python-3.6.9.tar.xz /tmp
# 设置 root 密码
RUN echo 'root:password' | chpasswd \
# 安装openssh-server 并配置
&& apt-get update && apt-get -y install openssh-server \
&& sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
&& sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config \
&& mkdir /var/run/sshd \
# 安装python依赖包
&& apt-get -y install build-essential python-dev python-setuptools python-pip python-smbus \
&& apt-get -y install build-essential libncursesw5-dev libgdbm-dev libc6-dev \
&& apt-get -y install zlib1g-dev libsqlite3-dev tk-dev \
&& apt-get -y install libssl-dev openssl \
&& apt-get -y install libffi-dev \
# 安装python 3.6.9
&& mkdir -p /usr/local/python3.6 \
&& tar xvf Python-3.6.9.tar.xz \
&& cd Python-3.6.9 \
&& ./configure --prefix=/usr/local/python3.6 \
&& make altinstall \
# 建立软链接
&& ln -snf /usr/local/python3.6/bin/python3.6 /usr/bin/python \
&& ln -snf /usr/local/python3.6/bin/pip3.6 /usr/bin/pip\
# 安装pytorch
&& mkdir ~/.pip && echo -e '[global] \nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple' >> ~/.pip/pip.conf \
&& pip install torch===1.2.0 torchvision===0.4.0 -f https://download.pytorch.org/whl/torch_stable.html \
# 清理copy的安装文件
&& apt-get clean \
&& rm -rf /tmp/* /var/tmp/*
EXPOSE 22
CMD ["/bin/bash"]
使用dockerfile创建镜像,先写好Dockerfile,然后放到文件夹里(如上所示),之后在xshell中启用管理员权限,cd到文件夹里运行命令(注意后面有个点)(服务器要联网):
docker build -t + 镜像的名字:版本 .
 运行后可以用命令docker images查看:  这样我们就创建了一个镜像。 接下来就是在镜像里创建,启动容器。(镜像是静态的,启动容器可以改变容器,但是不会改变镜像,然后再据此创建新的镜像,或者覆盖原来的镜像)
创建容器
(在镜像yzc_znr的基础启动容器yzc_znr_container)
docker run -it --gpus all --name yzc_znr_container yzc_znr /bin/bash
- –gpus all 才能用nvidia-smi查看
- yzc_znr_container是容器的名字
- yzc_znr就是刚刚用Dockerfile创建的镜像名字
(run之后就是在容器里了)  这样就创建了容器并且进入了容器 (可以使用exit退出容器,使用docker ps -a查看所有容器状态,用docker start + 容器id启动id,start只是启动而已,要进去还需要用docker attach + 容器id进入容器)
docker ps -a(查看所有容器状态)
docker start + 容器id启动id(启动容器)
docker attach + 容器id(进入容器)
(具体容器使用命令可以上网查询)
在本地设置好镜像
(比赛的提交过程)
设置容器
就是往容器里面放需要提交的东西,具体要求见上面的文档(没放)。创建工作空间(要求的)命令如下:
- 退出tmp(dockerfile里面写的):cd
- 进入/:cd /
- 创建workspace(提交要求):mkdir workspace
- 然后cd进去workspace
接下来就是往容器里面的workspace传需要提交的东西。本次比赛需要上传的有(ocr例子):  可以在window打包好需要的东西(解压出来是零散的文件,而不是文件夹)。再把压缩包传到服务器,再打开一个命令行把压缩包传到容器里,再进行解压。 压缩:  从服务器把压缩包传到容器:
docker cp /emwusr/zwb/znr/aaaa.zip a27001c20ee6:/workspace
(docker cp local-file-path container-id:container-path)
- /emwusr/zwb/znr/aaaa.zip:就是要传的压缩包的路径
- a27001c20ee6:/workspace:容器id:/workspace
再解压(解压完可以把压缩包删了):  然后要python运行一下那个py文件,把没有的包安装一下。 最后是这样(因为本地没有这两个文件夹):  (最后记得把运行的py文件改成‘run.py’(比赛提交要求),命令:) 至此,容器就弄好了
将容器改变写回镜像
先exit退出容器 将容器改变写回镜像并改变启动命令:
docker commit --change="WORKDIR /workspace" -c 'CMD ["python","run.py","/input_path", "/output_path"]' yzc_znr_container yzc_znr:v1
- –change=“WORKDIR /workspace”:这里就是把工作文件夹改到workspace
- yzc_znr_container:容器名字
- yzc_znr:v1:镜像名字。可以弄一个新的镜像,如果用原来的镜像名字,就会把原来的覆盖(这里把原来的覆盖了)(注意下图镜像被覆盖,id也不一样了)

创建阿里云仓库
网址 创建个人实例,设置Registry 登录密码,创建私有本地镜像仓库,如下图所示 (下面的内容根据自己的信息设置即可)    下面是操作指南: 
把镜像传到阿里云
(操作指南看上面) 在本地连接到刚刚创建的阿里云:
docker login --username=damonx registry.cn-hangzhou.aliyuncs.com
 打标签:
docker tag 935dafae768f registry.cn-hangzhou.aliyuncs.com/damonzheng46/yzc_znr:aliyun
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/damonzheng46/yzc_znr:[镜像版本号]
 (可以看到id是一样的,就是tag不一样)
push到阿里云上面:
docker push registry.cn-hangzhou.aliyuncs.com/damonzheng46/yzc_znr:aliyun
docker push registry.cn-hangzhou.aliyuncs.com/damonzheng46/yzc_znr:[镜像版本号]
 这样镜像就被传到阿里云上面了 
把阿里云的镜像提交到比赛官网
这里的镜像名称就是: docker pull registry.cn-hangzhou.aliyuncs.com/damonzheng46/yzc_znr:[镜像版本号]的后面这串registry.cn-hangzhou.aliyuncs.com/damonzheng46/yzc_znr:aliyun

非第一次提交
之后提交的话,就可以用之前创建的镜像再拉容器出来,然后更改容器里面的内容(如果原来的容器还在的话也可以直接在原来的容器改),再覆盖回镜像,再提交。
- 更改容器里面的内容
- 容器写回镜像(可以覆盖掉原来的,注意id就变了)
- 再登陆阿里云,打tag,push。非第一次上传的话,push就很快了

一些命令
启动容器:docker run -it --gpus all --name container-name image-name /bin/bash
复制文件到容器:docker cp local-file-path container-id:container-path
将容器改变写会镜像:docker commit container-id image-name
将容器改变写会镜像,并修改启动命令:
docker commit --change="WORKDIR /workspace" -c 'CMD ["python","run.py","/input_path", "/output_path"]' container-name image-name
提交至阿里云仓库:
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
docker tag image-id registry.cn-hangzhou.aliyuncs.com/fudan_ewb_seg/gaofen_allright:v0.1
docker push registry.cn-hangzhou.aliyuncs.com/fudan_ewb_seg/gaofen_allright:v0.1
|