Docker踩坑筆記[一]:開始使用Docker(基於CentOS7)
本文記錄了近兩天開始學習docker基本操作的一些心得,進行小小的總結。
至於什麼是docker,為什麼使用docker,這裡就不再贅述;
參考:
桀驁不馴的喵:《docker命令詳解》
廣州千鋒:Docker-容器化引擎
文章目錄
- 安裝docker
- 啟動並檢查docker
- 映象操作(以測試CentOS為例)
- 下載映象(pull)
- 檢視映象(images/imge ls)
- 啟動一個CentOS容器(run)
- 再次進入myCentOS(exec)
- 刪除容器(rm)
- 刪除映象(rmi)
- 定製映象(Dockerfile)
- 後記
安裝docker
##首先,解除安裝直接用yum install的docker(原因:yum庫裡的docker版本過低)
yum remove docker
yum remove docker-*
##更新yum,這個操作不是必須的,但是更新升級核心,更有利於docker對系統資源的利用
yum update
##安裝相關依賴
yum install -y yum-utils \
device-mapper-persistent-data \
lm2
##設定安裝正式版docker-edge
yum-config-manager --enable docker-ec-edge
##新增阿里雲映象
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
##安裝docker
yum install docker-ce
啟動並檢查docker
##啟動docker服務
systemctl start docker
##檢視docker版本
docker version
##檢視docker詳細資訊
docker info
映象操作(以測試CentOS為例)
下載映象(pull)
因為國內網速問題,會導致在從docker hub拉取映象時,速度過慢,甚至出現失敗現象,這裡我們可以使用映象加速;
docker中國映象加速
想要選取指定版本,可以參考docker hub的標籤TAG
##使用映象加速(docker中國)
##拉取centos官方映象,不指定版本號,預設為latest版本
##docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標籤]
##Docker Registry 地址,預設為Docker Hub
##倉庫名為兩段式名稱,即<使用者名稱>/<軟體名>。對於Docker Hub,預設為library,即官方映象
docker pull registry.docker-cn.com/library/centos
檢視映象(images/imge ls)
docker images
##也可以使用docker image ls
##REPOSITORY TAG IMAGE ID CREATED SIZE
##registry.docker-cn.com/library/centos latest 75835a67d134 8 weeks ago 200MB
啟動一個CentOS容器(run)
##docker run <選項><映象名稱或者id><命令><引數>
## --name 自定義容器名稱
## -t 分配一個偽終端
## -i 互動式操作
docker run -it --name myCentOS IMAGE ID /bin/bash
##此時進入到docker內的centOS
##可以看到使用者名稱已經有改變
##[[email protected] /]# docker run -it --name myCentOS IMAGE ID /bin/bash
##[[email protected] /]#
##檢視docker內的centOS版本資訊
cat /etc/redhat-release
##[[email protected] /]# cat /etc/redhat-release
##CentOS Linux release 7.5.1804 (Core)
##啟動成功
##如果想退出docker內的CentOS互動式操作,輸入
exit
##注意,此時容器仍然存在,可以使用docker ps命令檢視
## -a 表示檢視所有容器,包括執行和未執行狀態
docker ps -a
再次進入myCentOS(exec)
##檢視容器資訊
docker ps -a
##CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
##e09b83c89159 75835 "/bin/bash" 5 minutes ago Exited (0) 13 seconds ago myCentOS
##此時發現容器STATUS為已經停止,首先啟動容器
docker start <CONTAINER ID>
##然後進入Centos
##exec用於從外部執行容器內部的命令
docker exec -it <CONTAINER ID> /bin/bash
##此時再次進入到了myCentOS
刪除容器(rm)
##刪除容器之前,請確保容器已經關閉
##檢視當前正在執行的容器
docker ps
##CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
##e09b83c89159 75835 "/bin/bash" 16 minutes ago Up 6 minutes myCentOS
##此時發現容器STATUS為正在執行,首先停止容器
docker stop <CONTAINER ID或者NAMES>
##容器已停止,刪除容器
##rm 刪除容器命令
##-f 強制停止容器後刪除,使用SIGKILL訊號
docker rm <CONTAINER ID或者NAMES>
##刪除所有容器
docker rm $(docker ps -aq)
刪除映象(rmi)
##刪除映象前,請確保由此映象建立的容器已經正確刪除
##檢視映象
docker images
##刪除映象
##docker rmi <註冊名稱>/<映象名稱,id>:<標籤>
##不指定標籤,則預設刪除latest標籤
##-f 強制刪除映象
docker rmi <IMAGE ID>
##刪除所有映象
docker rm $(docker images -aq)
定製映象(Dockerfile)
Dockerfile 是一個文字檔案,其包含了一條條的指令(Instruction),每一條指令構建一層。
Dockerfile 支援 Shell 類的行尾新增 \
的命令換行方式,以及行首 #
進行註釋的格式。
指定基礎映象(FROM)
所謂定製映象,那一定是以一個映象為基礎,在其上進行定製。而FROM就是指定基礎映象,因此一個Dockerfile 中 FROM 是必備的指令,並且必須是第一條指令。
執行命令(RUN)
用於執行命令列命令,格式有兩種
-
shell格式:RUN <命令>
-
exec格式:RUN [“可執行檔案”, “引數1”, “引數2”],這更像是函式呼叫中的格式。
構建映象(build)
docker build <選項><Dockerfile路徑>
Dockerfile 路徑可以使是本地路徑,也可以是URL路徑。若設定為 - ,則從標準輸入獲取Dockerfile的內容
--force-rm=false
建立映象失敗時,刪除臨時容器
--no-cache=false
不使用之前構建中建立的快取。
-q、--quiet=false
不顯示Dockerfile的RUN執行的輸出結果
--rm=true
建立映象成功時,刪除臨時容器
-t、--tag=""
設定註冊名稱、映象名稱、標籤。格式為 <註冊名稱>/<映象名稱>:<標籤>(標籤預設為latest)
##cd到Dockerfile檔案所在目錄下,執行
docker build -t <REPOSITORY>:TAG .
其中REPOSITORY,為自定義映象REPOSITORY,TAG為自定義標籤(版本)
後面還有一個 .
表示當前目錄, 而Dockerfile
就在當前目錄,這個目錄稱為構建上下文
映象構建上下文(Context)
首先我們要理解
docker build
的工作原理。Docker 在執行時分為 Docker 引擎(也就是服務端守護程序)和客戶端工具。Docker 的引擎提供了一組 REST API,被稱為 Docker Remote API,而如docker
命令這樣的客戶端工具,則是通過這組 API 與 Docker 引擎互動,從而完成各種功能。因此,雖然表面上我們好像是在本機執行各種docker
功能,但實際上,一切都是使用的遠端呼叫形式在服務端(Docker 引擎)完成。也因為這種 C/S 設計,讓我們操作遠端伺服器的 Docker 引擎變得輕而易舉。當我們進行映象構建的時候,並非所有定製都會通過RUN指令完成,經常會需要將一些本地檔案複製進映象,比如通過COPY指令、ADD 指令等。而
docker build
命令構建映象,其實並非在本地構建,而是在服務端,也就是 Docker 引擎中構建的。那麼在這種客戶端/服務端的架構中,如何才能讓服務端獲得本地檔案呢?這就引入了上下文的概念。當構建的時候,使用者會指定構建映象上下文的路徑,
docker build
命令得知這個路徑後,會將路徑下的所有內容打包,然後上傳給 Docker 引擎。這樣 Docker 引擎收到這個上下文包後,展開就會獲得構建映象所需的一切檔案。
一般來說,應該將Dockerfile放置在一個空目錄下,或者專案的根目錄下。如果該目錄沒有需要上傳的檔案,則需要將需要的檔案複製過來;如果有些檔案不需要在構建的時候上傳Docker引擎,那麼可以用類似.gitignore
檔案的語法寫一個.dockerignore
,忽略不需要的檔案。
一般習慣,會使用Dockerfile
作為檔名,並放置在基於構建的上下文目錄中;
其實Dockerfile的檔名不是必須要為Dockerfile
,也不是必須要位於上下文目錄中,可以用-f
指定某個檔案作為Dockerfile;
其他構建方式
- 使用Git repo構建
- 用給定的tar壓縮包構建
- 從標準輸入中讀取Dockerfile構建
- 從標準輸入中讀取上下文壓縮包進行構建
後記
至此,學習docker的旅途才算剛剛邁出了第一步,積跬步,至千里。只有堅持,才能走得穩,行的遠;下一篇將介紹更多關於Dockerfile的使用的詳細內容,歡迎關注!
轉載請註明出處:https://blog.csdn.net/zouguo1211/article/details/84859827