1. 程式人生 > >Docker踩坑筆記[一]:開始使用Docker(基於CentOS7)

Docker踩坑筆記[一]:開始使用Docker(基於CentOS7)

本文記錄了近兩天開始學習docker基本操作的一些心得,進行小小的總結。
至於什麼是docker,為什麼使用docker,這裡就不再贅述;
參考:
桀驁不馴的喵:《docker命令詳解》
廣州千鋒:Docker-容器化引擎

文章目錄

安裝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就是指定基礎映象,因此一個DockerfileFROM 是必備的指令,並且必須是第一條指令

執行命令(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