本文目標(biāo)
介紹docker基本知識
學(xué)會(huì)打包一個(gè)自定義的docker并讓其他人可以成功使用
docker進(jìn)階知識積累
參考資料
docker_practice/SUMMARY.md at master · yeasy/docker_practice (github.com)
如何玩轉(zhuǎn)Docker 惦积?這波docker實(shí)戰(zhàn)總結(jié)(非常全面)終于趕上了! - 知乎 (zhihu.com)
docker-image container 基本操作 -常用命令 - iDEAAM - 博客園 (cnblogs.com)
如何玩轉(zhuǎn)Docker 抓狭?這波docker實(shí)戰(zhàn)總結(jié)(非常全面)終于趕上了瓶摆! - 知乎 (zhihu.com)
-Orientation and setup | Docker Documentationlinux查看正在運(yùn)行的容器,說說Docker 容器常用命令_weixin_39568597的博客-CSDN博客
【docker入門】10分鐘边苹,快速學(xué)會(huì)docker - 知乎 (zhihu.com)(入門實(shí)踐指南)
linux查看正在運(yùn)行的容器,說說Docker 容器常用命令weixin_39568597的博客-CSDN博客
docker基本概念
docker誕生背景
docker誕生就是為了解決開發(fā)環(huán)境和多軟件版本不一致的問題凉夯。
docker安裝
sudo wget -qO- https://get.docker.com | sh
sudo usermod -aG docker usernamexxx
docker基本概念
docker總體架構(gòu):
注意docker daemon,負(fù)責(zé)管控命令執(zhí)行
docker中有這樣幾個(gè)概念:
- dockerfile:
- image:
- container:
實(shí)際上你可以簡單的把image理解為可執(zhí)行程序,container就是運(yùn)行起來的進(jìn)程垢粮。
那么寫程序需要源代碼贴届,那么“寫”image就需要dockerfile,dockerfile就是image的源代碼,docker就是"編譯器"毫蚓。
因此我們只需要在dockerfile中指定需要哪些程序占键、依賴什么樣的配置,之后把dockerfile交給“編譯器”docker進(jìn)行“編譯”元潘,也就是docker build命令畔乙,生成的可執(zhí)行程序就是image,之后就可以運(yùn)行這個(gè)image了翩概,這就是docker run命令啸澡,image運(yùn)行起來后就是docker container。
具體的使用方法就不在這里贅述了氮帐,大家可以參考docker的官方文檔嗅虏,那里有詳細(xì)的講解。
實(shí)戰(zhàn)
docker常用指令
docker pull # 獲取docker image
docker run -p... #運(yùn)行container 端口映射
docker run -v xxx(local path):xxx(docker 內(nèi)部目錄)# 目錄掛載
docker run -it # -t 選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上上沐, -i 則讓容器的標(biāo)準(zhǔn)輸入保持打開皮服。
docker commit # 保存改動(dòng)為新的image
docker build # 創(chuàng)建docker image
docker create #
docker attach # 進(jìn)入容器(不是進(jìn)入image)
docker rm [docker id] # 刪除docker container
docker rmi [docker image id] # 刪除docker image
docker ps # 查看正在運(yùn)行的docker
docker ps -a # 查看docker運(yùn)行的歷史
docker images # 查看本地已有的docker鏡像
docker inspect # 查看image內(nèi)部具體信息
docker cp # 在host和container之間拷貝文件
docker stop # 停止container
docker search # 在遠(yuǎn)程倉庫docker hub搜索鏡像
docker login # 登錄docker hub
docker push # 將本地鏡像上傳到docker hub
build自定義docker
除了用docker commit
命令,還可以編寫Dockerfile
(約定俗稱是這種寫法)來定義和保存自己的docker参咙。
FROM xxx # 設(shè)置基礎(chǔ)鏡像
MAINTAINER xxxx # 著名文件作者/維護(hù)者
RUN xxx # 執(zhí)行命令
COPY xxx # 拷貝文件
ADD xxx # 添加文件
ENTRYPOINT xxx # 給container指定執(zhí)行入口
EXPOSE xxx # 暴露端口
CMD xxx # 執(zhí)行命令龄广,給container指定執(zhí)行入口
WORKDIR # 指定運(yùn)行命令的路徑
ENV # 為container里面環(huán)境的設(shè)置環(huán)境變量
USER # 指定執(zhí)行container的用戶
VOLUME # 指定container執(zhí)行時(shí)掛在的卷
Dockerfile中的每一行都產(chǎn)生一個(gè)新的層,也就是說每一行的命令都會(huì)產(chǎn)生一個(gè)新的docker id蕴侧。
Docker鏡像為深度學(xué)習(xí)訓(xùn)練模型提供了一個(gè)方便的環(huán)境择同,用戶可以在不影響系統(tǒng)環(huán)境的情況下實(shí)現(xiàn)自己任意的環(huán)境搭建,這里展示基本docker環(huán)境搭建過程净宵。
- 任務(wù)需求:比如我現(xiàn)在想要在torch1.7的docker(這里簡稱它為base docker)基礎(chǔ)上再安裝一些自己想要安裝的包敲才,構(gòu)建出一個(gè)新的docker。
- 大致邏輯:先把想要的base docker pull到本地择葡,在本地進(jìn)入此docker紧武,再在這docker里安裝自己想要的包,都安裝好后敏储,退出當(dāng)前docker阻星,把這個(gè)docker commit到一個(gè)新的docker(自己的docker)上,再push自己的docker到dockerhub repo已添。
- 具體步驟:
1)去dockerhub上找一個(gè)torch1.7的docker妥箕,pull下來,比如我們從torch官方的docker tags里面找到我們想要的torch1.7 develop版本更舞。找到后畦幢,在本地運(yùn)行:
docker pull pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel
上述操作是將這個(gè)docker先拉到本地。
2)進(jìn)入docker:
docker run --runtime=nvidia -it --name=test --ipc=host --net=host pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel
3)進(jìn)入docker后就可以盡情地配置自己的環(huán)境了疏哗。
4)配置完后呛讲,“exit”退出docker禾怠。
5)將配置好的docker commit到自己的docker(相當(dāng)于復(fù)制了一份到自己的docker)返奉。
docker ps -a # 查看并找到配置好的docker的id
docker commit [docker id] geekyutao/foresee-rl:v0 # geekyutao/foresee-rl:v0是我自己在dockerhub上創(chuàng)建的repo
6)在本地登錄dockerhub贝搁,再把本地的自己的docker push到dockerhub上。
docker login -u [username] -p [password] # 如果報(bào)錯(cuò)的話芽偏,很可能是因?yàn)闄C(jī)器默認(rèn)使用了一個(gè)docker證書
# 如果報(bào)錯(cuò):刪除/usr/local/bin/下的docker證書再登錄
# sudo rm /usr/local/bin/docker-credential-pass
docker push geekyutao/foresee-rl:v0
7)完成雷逆!再把操作期間遺留的docker和docker image都刪了。(借助docker基本操作)