docker是我最近工程開發上急需使用的一個開發工具,但是由於本人“深入沉浸”windows系統,並且對於Linux系統不太熟悉,所以學習docker很多困難,因此用這個博客來記錄一下很簡單的docker的常用操作。本文是以Linux系統為基礎,windows系統對於docker的安裝太繁瑣了,而且有windows版本的限制,強烈推薦使用Linux系統。本文參考了很多博主的經驗分享,如果大家要看原文可以到本文底部查看原網站。有眾多的docker命令行可以參看官方文檔
1、進入Docker
安裝docker的方式可以參看我上一篇博文。
一般來說Linux安裝好docker之后,就可以直接使用docker這個命令了,如果沒有啟動docker(守護進程)會出現以下命令報錯:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
可以使用以下代碼進入:
service docker start
2 、關閉Docker服務
其實一般說的關閉docker其實就是關閉docker的守護進程,一般來說可以不用管這個(我現在水平還不到探討這個的水平)
service docker stop
3、Docker查看現有鏡像
查看現有鏡像:
docker images
其實可以看到返回了現有鏡像的列表,下面來解讀以下返回的內容:
- REPOSITORY:“鏡像所屬的倉庫名”,在倉庫下會有很多版本的鏡像,也就是一個倉庫會包含多個鏡像,而這里顯示表示的是不同鏡像屬於那些倉庫
- TAG:“鏡像的標簽名”,在倉庫中,不同的鏡像是以標簽的形式來區分的。一個REPOSITORY倉庫名+TAG標簽名,就構成了一個完整的鏡像名,如:centos:7.02、ubuntu:14.04、debian:latest這個鏡像名就會對應一個鏡像的ID。我們之前在運行鏡像時,通常只是指定了centos,並沒有指定后面的TAG標簽名,在這種情況下,docker會默認使用“latest”標簽所對應的鏡像。
- IMAGE ID:“鏡像的唯一ID”,常常可以使用這個來打開指定的鏡像,因為TAG是可以重復的,但是ID是唯一的
- CREATED:“鏡像建立的時間”。
- SIZE:“鏡像建立的大小”。
4、Docker刪除現有鏡像
刪除鏡像有兩種方法,一般是通過ID刪除和通過TAG刪除,剛才有提到TAG是可以重復的,對於同一個鏡像可以有多個標簽,所以如果采用指定標簽的方法來刪除鏡像,只會刪除你指定的REPOSITORY倉庫名+TAG標簽名的那個鏡像。
docker rmi hello-world:latest
上面的命令就是刪除hello-world這個倉庫里的標簽為latest的鏡像。
不過要注意到這樣刪除是不能刪除正在被容器使用的鏡像,例如有以下報錯:
這個時候可以使用 docker rmi -f hello-world:latest的命令強制刪除,不過不推薦這樣的方式,正確方法是:
- 先刪除引用這個鏡像的容器(刪除容器和查看容器的方法下面會講到)
- 再刪除這個鏡像
5、Docker啟動鏡像
對於Docker來說,image是靜態的,類似於操作系統快照,而container則是動態的,是image的運行實例。因此啟動鏡像就需要創建容器。
有一個image名稱為ubuntu,那么比如現在我們啟動這個image的container並且進入到這個container的bash命令行中:
docker run -t -i ubuntu /bin/bash
命令行的理解如下:
-
docker run:啟動container(這種方式是基於鏡像的啟動,會創建一個新的容器)
-
ubuntu:你想要啟動的image
-
-t:進入終端
-
-i:獲得一個交互式的連接,通過獲取container的輸入
-
/bin/bash:在container中啟動一個bash shell
上圖就是成功查創建了一個容器,並進入到了,容器的ID是2fa8d7535635,這個時候容器就已經在運行了。
如果要退出容器就直接在命令行輸入 exit,就可以退出了。
6、Docker查看現有容器
查看正在運行的容器
docker ps
可以看到我們之前運行的容器已經顯示出來了(這個是在新窗口執行的命令行,原來的那個窗口沒有exit容器),如果exit容器之后,用這個命令行就看不到。如果想要查看所有的容器,可以使用下面的命令行。
docker ps -a #查看無論運行還是沒有運行的容器
可以看到就算退出容器之后依然有可以查看到對應的容器信息。
- CONTAINER ID(container id ) :顧名思義 ,容器ID的意思,可以通過這id找到唯一的對應容器
- IMAGE (image):該容器所使用的鏡像
- COMMAND (command):啟動容器時運行的命令
- CREATED (created):容器的創建時間,顯示格式為”**時間之前創建“
- STATUS (status):容器現在的狀態,狀態有7種:created(已創建)|restarting(重啟中)|running(運行中)|removing(遷移中)|paused(暫停)|exited(停止)|dead
- PORTS (ports): 容器的端口信息和使用的連接類型(tcp\udp)
- NAMES (names): 鏡像自動為容器創建的名字,也唯一代表一個容器
7、Docker刪除現有容器
剛才提到了在刪除鏡像以前,需要先刪除引用着的容器,我們可以使用以下的命令行來進行。我們先看下有哪些容器存在。
然后使用docker rm dockerID的方法刪除。
docker rm 3043893130d5
可以看到已經剛才存在的容器已經沒有了,當然還有更多高級的刪除容器的方法,可以參考(https://www.cnblogs.com/wholj/p/10396516.html)
8、Docker 修改鏡像以及保存鏡像
對於鏡像來說,每次進入鏡像(容器)並且操作鏡像里的內容之后,如果直接使用exit退出容器,是不會保存你的操作的(也就是說重新加載dockerrun -t -i xxxx /bush鏡像之后,一切內容都會重新來)。如果我們想要保存我們的操作該怎么辦呢?下面我們啟動之前創辦的ubuntu的系統,並在ubuntu系統里安裝vim編譯器,並保存。
啟動ubuntu系統,如果沒有指定:TAG,會啟動TAG為latest的鏡像
docker run -it ubuntu /bin/bash
可以看到這個容器里面並沒有vim編譯器
接下來我們在這個容器安裝vim編譯器(具體細節參看我之前的博文Linux中安裝vim編譯器),具體就是兩行命令行。安裝完成之后命令行鍵入vim之后可以看到
好了這個系統已經被更改了,接下來是把這個系統(容器)打包成鏡像保存(換句話說就是沒有辦法更改原來的鏡像的,但是可以保存修改后的容器為另一個鏡像的方法來保存),主要的命令是
docker commit 75eb300dd5b2 ubuntu:2.0
上面這個命令就是docker commit 容器ID ubuntu:2.0(這里這個鏡像新的TAG)。
可以看到出現這個界面就說明已經保存成功了(主要到這個命令行以一定要在新的窗口中執行,不是在容器中執行這個儲存命令行)
最后我們可以看看我們剛剛新創建的鏡像。
可以看到我們的ubuntu:2.0鏡像已經創建好了。如果我們進入ubuntu:2.0可以發現vim已經被安裝好了。
9、Docker鏡像及容器的保存位置
我們已經學會修改以及保存鏡像,那我們會問那些下載到本地的鏡像在哪里呢?我是一個對空間要求極高的人,在可以的情況下我希望知道所有的東西都放在哪里,因此無論安裝什么包我都希望知道它的具體路徑並設置好(特別是這種需要頻繁下載東西的軟件)。我們可以通過一下命令來查看。
sudo docker info
着張圖片顯示出來docker的信息,其中我們需要注意到的是:Docker Root Dir: /var/lib/docker,這就是docker鏡像的存儲路徑(鏡像的名字是不會顯式的寫在文件夾上的,具體的對應關系可以參看這篇博文)。
接下來是我們需要知道該如何更改這個路徑,比如把這些鏡像放到另一個分區里面。
1、把/var/lib/docker這個文件夾下的所有內容移動到另一個文件夾下,比如我這里移動到/data/docker這個文件里。
2、修改配置文件,更改docker中鏡像和容器的默認儲存位置。(注意,剛安裝docker的需要新建這個文件)
sudo vim /etc/docker/daemon.json
3、將文件中'data-root',改為‘data-root’:'/home/data/docker'
4、重啟docker服務
參考網址:
https://www.cnblogs.com/520yang/articles/8744454.html
https://blog.csdn.net/woshimeihuo/article/details/90209779
https://blog.csdn.net/acmman/article/details/84449092
https://www.cnblogs.com/quanxiaoha/p/10542278.html