下面以Ubuntu系統講解docker安裝,其他系統可以參考安裝 Docker
1.1 卸載舊版本舊版本的 Docker 稱為 docker 或者 docker-engine,使用以下命令卸載舊版本:
$ sudo apt-get remove docker \
docker-engine \
docker.io
由於 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"
更新 apt 軟體包緩存,並安裝 docker-ce:
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ sudo systemctl enable docker
$ sudo systemctl start 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:~$ # 宿主機
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代碼,想要獲取的話,可以先關注下公眾號,之後會上傳
其中如果你按照第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/