可參考學習地址: 極客學院docker教程,還不錯,可以參考
1.Dockerhub下載鏡像
下載地址:Dockerhub地址
有兩種方式可以獲得新的鏡像
- 直接從dockerhub下載編譯好的image(該編譯過程在docker hub的雲端完成)(見3.1)
- 下載docekrfile文件,在本機進行build
直接在dockerhub上pull pre-built image
在terminal中輸入如下命令:
sudo Docker pull tingtinglu/docker
注:
① tingtinglu/docker是dockerhub上的pre-built image的名字
② 如何獲取pre-built image的名字?需要在dockerhub上搜索自己需要的image
下載dockerfile文件,在本機進行build
詳細介紹見docker的官方文檔:build your own image,介紹來如何利用dockerfile編譯自己的鏡像
(1)獲取dockerfile(即下載名稱為dockerfile的文件,內容為構造docker的一些命令)
(2)利用terminal的cd命令進入到dockerfile所在的文件夾
(3)在名稱為“dockerfile”的文件所在的文件夾下(即terminal cd到該文件夾),執行如下命令
docker build -t ImageName .
注1:ImageName是利用dockerfile生成的image的name(自行設置)
注2:不要忘記ImageName后面的點“.”
利用Dockerfile文件對已存在的image做某些更改
有時候,已經得到了一個image,但需要往該image中做新的更改,例如,想要在docker的opt路徑下添加一個新的路徑workspace,此時,可以通過dockerfile進行,方法如下:
① 新建一個dockerfile,添加如下內容
RUN mkdir /opt/workspace
② 利用terminal進入該dockerfile所在路徑,然后,built該dockerfile,即執行如下命令:
docker build -t ImageNameOld
一定要注意,這里的ImageNameOld是你想要添加該變化的那個image的名字
2.利用下載的鏡像生成容器
在命令行中輸入類似如下的命令:
sudo docker run -it --rm -p 8888:8888 -v `pwd`/workspace:/opt/workspace -v `pwd`/data:/root/data tingtinglu/deepdock
下面對該條命令進行剖析
(1)-p 8888:8888
將docker中的jupyter的8888接口與本機的8888接口關聯
(2)-v `pwd`/workspace:/opt/workspace
將當前路徑下(由`pwd`)的workspaace文件夾映射到docker中的opt路徑下的的workspace文件夾,這樣,docker下的opt/workspace就指向來本機的`pwd`/workspace文件夾;
要實現該目的,還有一個辦法:利用terminel進入到本機的workspace路徑下,然后: -v ¨$(pwd):/opt/workspace¨
具體的圖示如下:

此時,再進入docker后,docker的/opt/workspace/中的內容就變為的本機的workspace中的內容;
可以認為,無論原來docker的/opt/workspace中是否由內容,現在該workspace的內容都被本機的workspace覆蓋來,即docker的opt/workspace此時不再指向daocker中的opt/workspace,而只是指向本機的workspace文件夾
(3)有時,docker可能不能上網,那么,可以加入--net=host,即完整的命令如下:
sudo docker run -it --rm -p 8888:8888 --net=host -v `pwd`/workspace:/opt/workspace -v `pwd`/data:/root/data tingtinglu/deepdock
(4)如果是windows系統,那么,文件夾映射需要絕對路徑
即需要如下命令:
sudo docker run -it --rm -p 8888:8888 --net=host -v `pwd`/workspace:/root/opt/workspace -v `pwd`/data:/root/data tingtinglu/deepdock
並且,windows目前只支持C盤!一定要注意!
注:docker的指令模式是:標示+參數,即:[sudo] docker [flags] [command] [arguments]
eg.: docker run -i -t ubuntu /bin/bash
3.查看本機的docker images
sudo docker images
會得到本機的所有images的信息

- 第一列是docker image的名稱
- 第二列是該image的tag(同一個image有時需要進行多次更改,為了區分不同版本image的區別,為image賦予了一個tag)
- 第三列是docker image的ID
- 第四列是該docekr image的創建時間
- 第五列是該docker image的大小
4. 查看正在運行的container
sudo docker ps
顯示的信息如下:
| Container Id | IMAGE | command | Created | status | ports | names |
|---|---|---|---|---|---|---|
| container的ID | 生成該container的image的名稱 | 生成該container的時間 | 該container的狀態 | ContainerName(自動分配) |
5. 以bash模式進入正在運行的docker
sudo docker exec -it containerName bash
圖例: 
(1)ls
列出docker container下的文件夾 
可以看到,在container的ls文件夾下,有兩個文件夾,分別為caffe和workspace
(2) cd..
返回到當前文件夾opt的上一級文件夾
並且列出該文件夾下的所有文件ls 
可以看到該container的所有文件夾
(3)這里應該注意:
- 由於前面的命令:
-v `pwd`/workspace:/opt/workspace
使得本機的當前路徑`pwd`下(`pwd`為生成docker container時所在的路徑)下的workspace文件夾與docker container中的opt文件夾下的workspace發生映射關系 
- 由於前面的命令:
-v `pwd`/data:/root/data
使得本機的當前路徑`pwd`下的data文件夾與docker container中的root文件夾下的data發生映射關系 
6. 將一個容器保存為image
如果對docker的做了一些更改,並且,這些更改不是安裝了jupyter這樣的軟件,而只是安裝了一些package,那么,保存新的鏡像只需要:
sudo docker commit containerID newImageName
containerID為要保存的容器的ID,newImageName為新image的名字
例如:ting/caffe:version1這樣的名字,其中,version1為新容器的flag,可以用來標識新image的版本信息
7. 從已經創建的容器中更新鏡像,並且提交這個鏡像
- 在容器中進行相應的更改
例如:apt-get install wget - 將容器保存為新的鏡像
sudo docker commit containerID newImageName:tag
8. 刪除/停止等命令
-
從主機中移除鏡像
sudo docker rmi 鏡像名稱 -
停止正在運行的container
sudo docker stop containerName -
移除某個container
sudo docker rm containerID
注:輸入ID時,不必須輸入完整的ID,一般輸入前幾個字符便可以識別出
各種錯誤記錄
Error response from daemon: conflict: unable to delete 40787553f761 (must be forced) - image is being used by stopped container 8a1faaf9d24b
- 該問題的原因是:由image-40787553f761生成的container(ID:8a1faaf9d24b)仍舊存在
- 但利用sudo docker ps,卻無法顯示container-8a1faaf9d24b,因為該container-8a1faaf9d24b雖然沒有在運行,但它仍然存在,所以必須將其移除
- 解決辦法:利用
docker rm <containerid>即8a1faaf9d24b將該container移除
Cannot connect to the Docker daemon. Is the docker daemon running on
this host?
- 需要用到sudo
其他注意事項
1.最近發現,自己本機的鏡像有許多是none,經過查詢發現原因可能是:
重復pull同一個tag的鏡像,並且,在pull新的鏡像時(與本機已有的舊鏡像具有相同的tag),舊鏡像已經被容器占用,那么,在pull新鏡像后,之前被占用的舊鏡像就會變為none
2.在本機書寫dockerfile,該dockerfile用到了本機的鏡像A(From A),利用該dockerfile build 鏡像B,那么,鏡像B被稱為鏡像A的child
