CCF複賽 docker踩坑記 為明年踩坑做準備

2021-02-17 ChallengeHub

下面以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安裝成功

以下命令不要記住,你只需要會用,然後想用的時候來查一下即可,不妨先收藏下文章^_^ ^_^
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

獲取一個新的鏡像
熟悉這次複賽要求的同學,應該看到這個

比如我們想要獲取一個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

重命名鏡像
對於強迫症的我們,如何容忍有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,這裡可以根據你的習慣隨便寫

刪除鏡像

另外如果我們不想保留之前的長名字鏡像可以使用下面的命令進行刪除

$ 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

啟動容器 container
什麼是容器,就好比我們把上面操作的鏡像image代表一個虛擬機,然后里面有我們的想要的環境,現在我們把它進行開機
運行

$ docker run -itd --name qiye qiye:v1 /bin/bash
80ce4ad6d4aa7c0766d9590b0e34c817a54a1de9848285230e227590131098e4

其中--name qiye為我們指定的鏡像名稱,qiye:v1為我們想要使用哪個鏡像
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

docker與宿主機相互複製傳遞文件
下面的命令都是是在宿主機上運行的

複製本地文件到docker容器中

sudo docker cp code /qiye:/root # 向docker複製文件

code代表本地文件夾,/qiye:/root代表容器名稱和容器的目標目錄

複製容器文件到本地

docker cp qiye:/root  /home/user

停止和啟動容器

在宿主機,通過命令來啟動/停止已部署的容器服務。

docker start/stop  qiye

11.刪除容器

docker rm [containerID] 刪除容器

退出容器到宿主機

root@80ce4ad6d4aa:/# exit # 容器
exit
(base) quincyqiang:~$ # 宿主機

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/

相關焦點

  • 模型部署翻車記:PyTorch轉onnx踩坑實錄
    在深度學習模型部署時,從pytorch轉換onnx的過程中,踩了一些坑。本文總結了這些踩坑記錄,希望可以幫助其他人。首先,簡單說明一下pytorch轉onnx的意義。有了這4個角點之後,對車牌做透視變換,這時的車牌就是水平放置的,最後做車牌識別,這樣就做成了一個車牌識別系統,在這個系統裡包含車牌檢測,車牌矯正,車牌識別三個模塊。車牌檢測模塊使用retinaface,原始的retinaface是做人臉檢測的,它能輸出人臉檢測矩形框和人臉5個關鍵點。
  • 踩坑|NVIDIA驅動安裝
    看,這就是一個以目標為導向排查問題的過程。我也不知道伺服器具體有哪些毛病,不如先跑一個複雜點的代碼踩踩坑,比如我這個是pytorch下,利用多個GPU並行的圖形識別訓練程序。基本上通過跑這個程序,可以排查出伺服器的大部分問題。cuda和cudnn的安裝也是個麻煩事,這裡就先不寫了,放到明天吧。本文主要寫重新安裝NVIDIA驅動。
  • virtualbox centos7 nat+host-only方式聯網踩坑總結
    1、問題背景按照以往習慣的設置我採用橋接模式進行上網,但現在面臨的需求場景是這樣:要求centos虛擬機可以yum install、docker拉網際網路鏡像,因此需要訪問網際網路。本地xshell可以ssh訪問cenots虛擬機。
  • Prometheus使用總結:我踩過的那些坑
    當然,這當中也免不了踩過一些坑,下面就總結一下。假如你沒有用過 Prometheus,建議先看一遍官方文檔:https://prometheus.io/docs/introduction/overview/。Prometheus 作為一個基於指標(Metric)的監控系統,在設計上就放棄了一部分數據準確性:放棄一點準確性得到的是更高的可靠性,這裡的可靠性體現為架構簡單、數據簡單、運維簡單。
  • 數據挖掘:聊聊那些年你我踩過的「坑」
    今天就來談一談數據挖掘中常常被我們忽略的小問題(踩過的坑)。讓我們從下面這張圖開始吧! 圖一 從現實世界到模型世界(圖片來自網絡) 咳咳注意,本篇不是八卦文,在這裡我們要正經地討論一些小case。如圖所示,我們以左圖代表現實世界,右圖代表模型世界——對,數據挖掘的世界。
  • 經驗 | 在C++平臺上部署PyTorch模型流程+踩坑實錄
    方法二:Scripting直接在Torch腳本中編寫模型並相應地注釋模型,通過torch.jit.script編譯模塊,將其轉換為ScriptModule。主要原因可歸為一下兩點1.torch.rand(1, 3, 224, 224)) def forward(self, input): return self.resnet(input - self.means)my_script_module = torch.jit.script(MyScriptModule())如果上一步的坑都踩完
  • Docker 從入門到掉坑
    但是docker本身和虛擬機還是有較為明顯的出入的。我大致歸納了一下,可以總結為以下幾點:docker自身也有著很多的優點,關於它的優點,可以總結為以下幾項:Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之後也不會被改變。dock
  • UNRAID進階避坑指南(篇二):UNRAID進階配置
    UNRAID擁有很高的底層虛擬效率,油管eSir大佬做過主流虛擬平臺的性能測試《什麼?性能相差近10倍?!到底虛擬機平臺哪家強,應該如何選擇?這樣UNRAID重啟之後就會等待5分鐘就會執行一次掛載NAS共享文件服務的命令,這個時候去看Unassigned Devices插件的狀態,對應的共享文件服務share type前已經亮起了綠色小標,就代表共享文件服務已經掛載成功如何實現docker加速如果不配置docker鏡像加速的話,docker鏡像的拉取速度會慢得令人髮指。
  • 踩坑日誌 | kingfisher 公共測序數據 SRA/Fastq 下載神器!
    幫大夥踩坑測試,與大夥分享。- CJ - 陳程傑寫在前面    一般在進行公共測序數據挖掘的時候,需要從公共資料庫中(SRA、ENA、DDBJ等)下載自己所需的測序數據。    此外,還能根據用戶的需求將下載數據直接輸出為SRA、Fastq、Fasta或Gzip等格式,非常方便,不需要自己再對SRA數據通過fasterq-dump進行拆分轉換。
  • 我又踩坑了!如何為 HttpClient 請求設置 Content-Type 標頭?
    入坑下面是構造 HttpClient填坑給這個常規的 Post 請求設置正確的 Content-Type 標頭。
  • 敏捷組織的「入坑」與「填坑」
    我也看到很多組織還是不免會踩到幾個坑。以下,是我過去幾年觀察到的敏捷組織推行的幾個坑和避免入坑的布局,以供有想法推行敏捷組織的公司做前車之鑑。坑:敏捷和戰略脫節 為了敏捷而敏捷有一些客戶看到身邊很多同行在推行敏捷組織、創新型組織覺得特好,於是也想在公司內推動。
  • 氪分享 | 敏捷組織的「入坑」與「填坑」
    敏捷組織如果能推行成功好處良多,我也看到很多組織還是不免會踩到幾個坑。以下,是我過去幾年觀察到的敏捷組織推行的幾個坑和避免入坑的布局,以供有想法推行敏捷組織的公司做前車之鑑。於是在公司內做了好多敏捷嘗試:考勤取消、打卡取消、取消KPI考核、取消報銷審批,員工也因此歡呼雀躍。但是,當你試著問公司裡的員工為什麼要做敏捷組織的時候,大家是一臉茫然。敏捷似乎變成了一個組織內興起的又一項運動。所以,這裡有一個重要的步驟沒有做,那就是如何把敏捷組織從創始人的個人想像變成組織的共同想像。
  • PyG的使用及踩坑
    num_nodes,num_node_features]data.edge_index:COO格式的圖節點連接信息,類型為torch.long,維度為[2,num_edges](具體包含兩個列表,每個列表對應位置上的數字表示相應節點之間存在邊連接)data.edge_attr:圖中邊的屬性信息,維度[num_edges,num_edge_features]data.y
  • 電腦風扇的誤區,這些坑你都踩過嗎?
    很多小夥伴在裝機的時候都盯著CPU、顯卡、內存等與「性能」直接相關的硬體,卻很容易忽略了電腦主機是一個系統工程這個事實,其實裝一個沒有短板的「水桶機」,性能是一方面,能否讓主機發揮全部或者大部分性能的周邊配置是另一方面,比方說機箱的散熱風扇吧,這個常被玩家忽略的硬體其實「坑」
  • 說說win10下準備battery historian踩的坑
    目標:在win10下配置battery historian環境需要準備的有:安裝jdk1.8,git2.16,python2.7,
  • 峴港 | 旅遊老司機翻車記 剛出機場就被「坑」兩次
    先吐槽一下浦發的猴性。老司機翻車記——對於這次雙Bug齊下之旅,本想著,在峴港的酒店裡坐兩天的鹹魚就算了。但是沒想到,做鹹魚還是有風險的。從出機場的第一步,就已經開始被套路。神坑找換店由於一點準備都沒有。所以在出發前,身上一分錢越南盾都沒有。打算用自己之前留下的50塊馬幣來作為這次「峴港鹹魚遊」的火種。
  • Android高斯模糊你所不知道的坑
    從效果還是可以看出,當點擊籤到按鈕的時候,會伴隨籤到頁面和分享按鈕的自下向上的彈出效果,這個動畫直接使用屬性動畫就能實現沒什麼好說的,最主要的就是後面的高斯模糊效果,仔細看的話可以發現是有一個從清晰逐漸模糊的漸變效果,這個不是本文重點,這裡想說的是在實現自定義高斯模糊效果的時候自己所遇到的一個坑。
  • 坑了F15,繼續坑F16-美國普惠F100發動機坑爹史
    美國空軍在越南戰爭上遭受了嚴重打擊,原來設計2倍音速飛行,依靠先進大型火控雷達,攜帶大量超視距飛彈,20公裡外秒殺敵機,排隊槍斃的架勢,結果到了戰場上,才滿天的飛機幾乎都是自己的,外加超視距敵我識別技術有問題,經常把友機誤判為敵機
  • Ubuntu安裝Docker採坑記錄
    bionic stable"1.若之前已添加 '$(lsb_release -cs)' 的,需要直接修改文件sudo gedit /etc/apt/sources.list.d/additional-repositories.list 1.由於國內網絡問題,可考慮替換上面的源地址為國內源,
  • WSL2 安裝 Docker
    //www.microsoft.com/zh-hk/software-download/windows10Windows 1909升級失敗問題:https://www.win10gw.com/win10wenzhang/6507.html安裝 WSL 並升級到 WSL2一定要確保系統已經達到標準,不然通過WSL使用Docker會遇到各種不知道為啥的坑,