CCF复赛 docker踩坑记 为明年踩坑做准备
原创 致Great 公众号:ChallengeHub
1 docker安装篇
下面以Ubuntu系统讲解docker安装,其他系统可以参考安装 Docker
1.1 卸载旧版本
旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本:
$ sudo apt-get remove docker \
docker-engine \
docker.io
1.2 使用 APT 安装
由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
然后,我们需要向 sources.list 中添加 Docker 软件源
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 官方源
# $ sudo add-apt-repository \
# "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
# $(lsb_release -cs) \
# stable"
1.3 安装 Docker
更新 apt 软件包缓存,并安装 docker-ce:
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
1.4 启动 Docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
1.5 建立 docker 用户组
这一步比较重要,否则每次操作docker的时候都需要sudo权限
默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立 docker 组:
$ sudo groupadd docker
将当前用户加入 docker 组:
$ sudo usermod -aG docker $USER
退出当前终端并重新登录,进行如下测试。
1.6 测试 Docker 是否安装正确
docker run hello-world会自动拉取一个hello word镜像
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
看到上面输出,说明我们docker安装成功
2 docker 常用基本命令
以下命令不要记住,你只需要会用,然后想用的时候来查一下即可,不妨先收藏下文章__
2.1 查看docker镜像列表
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qiye latest a4683ac2023f 43 hours ago 2.32GB
pydocx v1 91c7d6596a68 7 weeks ago 1.39GB
python latest 3189819ced3e 4 months ago 934MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
compnay latest a4cc999cf2aa 19 months ago 929MB
python 3.6.5-stretch 9a58cce9b09f 2 years ago 912MB
2.2 获取一个新的镜像
熟悉这次复赛要求的同学,应该看到这个
比如我们想要获取一个Python的基础镜像,就可以输入下面的命令
$ docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
3: Pulling from tcc-public/python
Digest: sha256:6268ecdce5f04d54bd411cba64e49c714589e53ae482a49c6c12eaf91a5d0425
Status: Downloaded newer image for registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
# 因为我之前下载过,下载运行的很快,首次下载需要一段时间
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qiye latest a4683ac2023f 43 hours ago 2.32GB
pydocx v1 91c7d6596a68 7 weeks ago 1.39GB
python latest 3189819ced3e 4 months ago 934MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
compnay latest a4cc999cf2aa 19 months ago 929MB
registry.cn-shanghai.aliyuncs.com/tcc-public/python 3 a4cc999cf2aa 19 months ago 929MB # 获取的新镜像
python 3.6.5-stretch 9a58cce9b09f 2 years ago 912MB
2.4 重命名镜像
对于强迫症的我们,如何容忍有registry.cn-shanghai.aliyuncs.com/tcc-public/python这个长名字存在,我们接下来重命名
$ docker image tag a4cc999cf2aa qiye:v1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qiye latest a4683ac2023f 43 hours ago 2.32GB
pydocx v1 91c7d6596a68 7 weeks ago 1.39GB
python latest 3189819ced3e 4 months ago 934MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
compnay latest a4cc999cf2aa 19 months ago 929MB
qiye v1 a4cc999cf2aa 19 months ago 929MB # 重新命名的镜像
registry.cn-shanghai.aliyuncs.com/tcc-public/python 3 a4cc999cf2aa 19 months ago 929MB
python 3.6.5-stretch 9a58cce9b09f 2 years ago 912MB
docker image tag a4cc999cf2aa qiye:v1
其中a4cc999cf2aa 为我们要重新命名的镜像id,qiye:v1代表新的镜像名字和tag,这里可以根据你的习惯随便写
2.5 删除镜像
另外如果我们不想保留之前的长名字镜像可以使用下面的命令进行删除
$ docker rmi registry.cn-shanghai.aliyuncs.com/tcc-public/python:3 # :3记得加上
Untagged: registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
Untagged: registry.cn-shanghai.aliyuncs.com/tcc-public/python@sha256:6268ecdce5f04d54bd411cba64e49c714589e53ae482a49c6c12eaf91a5d0425
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qiye latest a4683ac2023f 43 hours ago 2.32GB
pydocx v1 91c7d6596a68 7 weeks ago 1.39GB
python latest 3189819ced3e 4 months ago 934MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
compnay latest a4cc999cf2aa 19 months ago 929MB
qiye v1 a4cc999cf2aa 19 months ago 929MB
python 3.6.5-stretch 9a58cce9b09f 2 years ago 912MB
2.6 启动容器 container
什么是容器,就好比我们把上面操作的镜像image代表一个虚拟机,然后里面有我们的想要的环境,现在我们把它进行开机
运行
$ docker run -itd --name qiye qiye:v1 /bin/bash
80ce4ad6d4aa7c0766d9590b0e34c817a54a1de9848285230e227590131098e4
其中–name qiye为我们指定的镜像名称,qiye:v1为我们想要使用哪个镜像
2.7.查看证正在运行的容器
可以通过docker ps查看正在运行的容器 docker ps -a可以看到所有的容器(有可能状态是停止的容器)
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80ce4ad6d4aa qiye:v1 "/bin/bash" 40 seconds ago Up 38 seconds qiye # 启动的容器
fbca0b46106e compnay:latest "/bin/bash" 2 days ago Up 2 days gongjijin
c4524d7e9d2d python:latest "/bin/bash" 7 weeks ago Up 7 weeks pydocx
8.进入容器
走到这一步我们要区分一个宿主机和容器的概念,上面的操作都是在宿主机,也叫物理机上操作的,如果我们想要在容器里面操作,需要通过下面的命令进入,比如在容器内新建一个文件夹data
$ docker exec -it qiye /bin/bash
root@80ce4ad6d4aa:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@80ce4ad6d4aa:/# mkdir data # 新建一个data文件夹
root@80ce4ad6d4aa:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@80ce4ad6d4aa:/# ll
bash: ll: command not found
root@80ce4ad6d4aa:/# ls -lh
2.9 docker与宿主机相互复制传递文件
下面的命令都是是在宿主机上运行的
复制本地文件到docker容器中
sudo docker cp code /qiye:/root # 向docker复制文件
code代表本地文件夹,/qiye:/root代表容器名称和容器的目标目录
复制容器文件到本地
docker cp qiye:/root /home/user
2.10 停止和启动容器
在宿主机,通过命令来启动/停止已部署的容器服务。
docker start/stop qiye
2.11.删除容器
docker rm [containerID] 删除容器
2.12 退出容器到宿主机
root@80ce4ad6d4aa:/# exit # 容器
exit
(base) quincyqiang:~$ # 宿主机
3 docker 复赛篇
3.1 准备复赛文件
Ubuntu下有个tree命令特别好用,下面是我准备的复赛文件,具体这里就不解释了,大家安装官方准备好就可以了
(base) quincyqiang@LISA-DW2:~$ tree qiye
记住,这个`qiye`是宿主机的目录
qiye
├── data
│ ├── code # 代码文件夹
│ │ ├── catboot.py
│ │ ├── ensemble.py
│ │ ├── gen_feas.py
│ │ ├── gen_feas_v2.py
│ │ ├── init.py
│ │ ├── lgb.py
│ │ ├── nohup.out
│ │ └── xgb.py
│ ├── prediction_result # 预测结果
│ │ ├── cat.csv
│ │ ├── lgb.csv
│ │ ├── result.csv
│ │ └── xgb.csv
│ ├── raw_data # 比赛数据
│ │ ├── entprise_evaluate.csv
│ │ ├── entprise_submit.csv
│ │ └── train
│ │ ├── annual_report_info.csv
│ │ ├── base_info.csv
│ │ ├── change_info.csv
│ │ ├── entprise_info.csv
│ │ ├── news_info.csv
│ │ ├── other_info.csv
│ │ └── tax_info.csv
│ ├── README.md
│ └── user_data # 用户自定义文件
│ ├── cat_acc0.9786747393205516auc0.9929635475060612testoof.csv
│ ├── cat_acc0.9786747393205516auc0.9929635475060612trainoof.csv
│ ├── feature_importance_lgb.csv
│ ├── lgb_acc0.9785401950891355auc0.9934458005698372testoof.csv
│ ├── lgb_acc0.9785401950891355auc0.9934458005698372trainoof.csv
│ ├── lgb_acc0.9788765556676756auc0.9934976109951237testoof.csv
│ ├── lgb_acc0.9788765556676756auc0.9934976109951237trainoof.csv
│ ├── test.pkl
│ ├── train.pkl
│ ├── xgb_acc0.9789438277833838auc0.9933705923097136testoof.csv
│ └── xgb_acc0.9789438277833838auc0.9933705923097136trainoof.csv
└── image # 镜像目录
├── great.tar
├── READEME.md
└── run.sh
这个是我们团队top5代码,想要获取的话,可以先关注下公众号,之后会上传
3.2 复现测试
其中如果你按照第2节 基本命令操作完之后,接下来就很简单了,你需要进入容器,新建一个data文件夹,
root@fbca0b46106e:/# mkdir data
root@fbca0b46106e:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run run.sh sbin srv sys tmp usr var
具体这个什么意思,到第3步解释,然后安装对应的pip包就可以了
$ docker exec -it qiye/bin/bash
root@fbca0b46106e:/# pip list
Package Version
--------------- -------
catboost 0.18.1
cycler 0.10.0
dill 0.3.3
graphviz 0.15
joblib 0.17.0
kiwisolver 1.3.1
lightgbm 2.3.1
matplotlib 3.3.3
numpy 1.17.4
pandarallel 1.5.1
pandas 1.1.4
Pillow 8.0.1
pip 20.3.1
plotly 4.14.1
pyparsing 2.4.7
python-dateutil 2.8.1
pytz 2020.4
retrying 1.3.3
scikit-learn 0.23.2
scipy 1.5.4
setuptools 41.0.1
six 1.15.0
threadpoolctl 2.1.0
tqdm 4.54.1
wheel 0.33.1
xgboost 0.90
挂载主机工作目录 利用容器运行程序
docker run -v /home/quincyqiang/qiye/:/data a4683ac2023f sh /data/image/run.sh
- 这个命令的意思是挂载主机的一个qiye目录然后放到a4683ac2023f镜像去运行image下的run.sh文件
- /home/quincyqiang/qiye/为本地目录 /data为容器目录下的data文件夹
- /data/image/run.sh意思是我们已经把本地的qiye挂载到容器data了,所以容器的data文件夹相当于就有了qiye的data和image的所有东西
下面是run.sh的文件内容
(base) quincyqiang@LISA-DW2:~$ cat qiye/image/run.sh
cd /data/data/code # 第一个data为容器的data,第二个data为qiye的data,因为我们挂载了,所以容器下data就有了data,有点绕哈哈
python gen_feas.py
python lgb.py
python xgb.py
python catboot.py
echo 'done'
exit
如果你的目录按照官方的话,运行让面命令就会产生最终的复现结果,这个结果是宿主机上的,我们只是让容器跑这个程序,但是所有的东西还在宿主机上
$ tree qiye/data/prediction_result/
qiye/data/prediction_result/
├── cat.csv
├── lgb.csv
├── result.csv # 复现结果
└── xgb.csv
0 directories, 5 files
更多资料:https://yeasy.gitbook.io/docker_practice/
扫码关注ChallengeHub公众号
欢迎加入ChallengeHub学习交流群