CCF复赛 docker踩坑记 为明年踩坑做准备

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 获取一个新的镜像
熟悉这次复赛要求的同学,应该看到这个
CCF复赛 docker踩坑记 为明年踩坑做准备
比如我们想要获取一个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代码,想要获取的话,可以先关注下公众号,之后会上传
CCF复赛 docker踩坑记 为明年踩坑做准备
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公众号
CCF复赛 docker踩坑记 为明年踩坑做准备
欢迎加入ChallengeHub学习交流群
CCF复赛 docker踩坑记 为明年踩坑做准备

上一篇:CCF-CSP-2019-03-1小中大


下一篇:CCF CSP 201703