本文為觀看B站狂神的視訊學習Docker時所整理的筆記,中間加了一些自己的理解,如果對大家有所幫助,還希望點贊支援一下,後續我會繼續將自己遇到的Docker問題以及學習的新的知識全部整理新增到本文後面或者整理髮布新的文章,如果感興趣可以關注一波。
Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協定開源。
Docker的官網地址:https://www.docker.com/
檔案地址:https://docs.docker.com/
倉庫地址:https://hub.docker.com/
傳統的開發問題:
Docker的出現解決以上問題
關於環境問題解決方案
Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。將環境構建打包成一個映象釋出到網上,想要用這個環境的時候就直接拉取一份就OK了。
解決應用之間隔離問題
Docker核心思想就是使用容器化技術,打包裝箱,每個箱子是互相隔離的。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。如下圖所示:
這裡參照知乎上大佬的說法:https://www.zhihu.com/question/48174633
伺服器虛擬化解決的核心問題是資源調配,而容器解決的核心問題是應用開發、測試和部署。
(1)應用更快速的交付和部署:
(2)更快捷的升級和擴縮容
(3)更簡單的系統運維
(4)更高效的計算資源利用
映象(image):docker映象就好比是一個模板,可以通過這個模板來建立容器服務,tomcat映象—>run---->tomcat01容器(提供服務),通過這個映象可以建立多個容器(最終服務執行或者專案執行就是在容器中執行的)。
容器(container):docker利用容器技術,獨立執行一個或者一組應用,通過映象來建立的,啟動、停止、刪除、基本命令,目前就可以把這個容器理解為就是一個簡易的Linux系統。
倉庫(repository):倉庫就是存放映象的地方,倉庫分為公有倉庫和私有倉庫,Docker Hub(預設是國外的)、阿里雲…都有容器伺服器(設定映象加速)
不一樣的話也行,主要是看Centos的版本
執行環境:阿里雲伺服器 Centos 7
連線工具:XShell 5
需要掌握:Linux的基本命令
由於這裡的執行環境是Centos 7,與Centos 6的命令還是有一些區別的,但是區別不大,後面我會將命令詳細的介紹。
檢視環境:
[root@oldou ~]# uname -r
3.10.0-957.21.3.el7.x86_64
cat /etc/os-release
這裡可以參考官網的幫助檔案進行安裝
地址:https://docs.docker.com/engine/install/centos/
第一步:解除安裝舊版本(執行以下程式碼即可)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
第二步:安裝yum工具包
命令:yum install -y yum-utils
第三步:設定映象倉庫
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 這裡預設是國外的,十分的慢,我們用以下阿里雲的地址
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 這是阿里雲的docker映象地址,建議使用這個
更新一下yum索引:
命令:yum makecache fast
第四步:安裝Docker
docker-ce:社群版 ee:企業版
命令:yum install docker-ce docker-ce-cli containerd.io
注意:以上是安裝Docker最新的版本,如果想要安裝指定的版本,就需要進行以下命令:
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
這裡的<VERSION_STRING>
表示版本。
第五步:啟動Docker
命令:systemctl start docker
注意:Centos6使用的是service
,而Centos7使用的都變成了systemctl
。
第六步:檢視Docker是否安裝成功
命令:docker version
檢視Docker的狀態: systemctl status docker
第七步:測試hello-word
命令:docker run hello-world
第八步:檢視一下剛剛下載的hello-word的這個映象
命令:docker images
官網中有介紹,下面我給出來:
第一步:解除安裝依賴
命令:yum remove docker-ce docker-ce-cli containerd.io
第二步:刪除資源 安裝的資源都在/var/lib/docker目錄下
命令:rm -rf /var/lib/docker
這樣就OK了。
由於我們拉取映象的時候,使用國外的下載太慢了,當然我們這裡是使用國內阿里雲的,所以肯定比國外的存取和下載快,這個時候再配個加速器就美滋滋。
第一步:登入我們的阿里雲控制檯,然後找到容器映象服務
第二步:找到映象加速器---->映象加速地址
第三步:設定使用(直接複製命令執行即可)
(1)在伺服器中建立一個目錄:sudo mkdir -p /etc/docker
(2)編輯組態檔
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://7ih0bv9h.mirror.aliyuncs.com"]
}
EOF
(3)將服務重新啟動:sudo systemctl daemon-reload
(4)啟動docker:sudo systemctl restart docker
這樣就設定完成了。
回顧hello-word的流程
就拿我們執行hello-word來說,一開始我們執行hello-word的時候,Docker會在本機中尋找映象,而本機中沒有這個映象,所以就回去我們設定的Hub上去下載映象,如果找到了就將映象下載到本地執行,如果沒有就返回錯誤。如下所示:
底層原理
(1)Docker是怎麼工作的?
官方幫助檔案:https://docs.docker.com/engine/reference/run/
命令:docker version
# 檢視docker的版本資訊
命令:docker info
# 顯示Docker的系統資訊,包括映象和容器的數量
命令:docker xxx --help
#幫助命令,可以顯示docker的所有命令
檢視映象
命令:docker images
# 檢視所有原生的主機上的映象
REPOSITORY :映象的倉庫源
TAG :映象的標籤
IMAGE ID :映象的ID
CERATED :映象的建立時間
SIZE :映象的大小
docker images [可選項]
-a , --all # 列出所有映象
-q , --quiet # 只顯示映象的ID
搜尋映象
命令:docker search 映象名
# 搜尋映象
可選項,通過搜過過濾
--filter-STARS=3000 #搜尋出來的映象修飾STARS大於3000的
下載映象
命令:docker pull 映象名 [:tag]
# 下載映象,預設是下載最新版 latest 。
如果是下載指定版本的映象,那麼就需要指定:版本號
,如下所示:
docker pull mysql:5.7
# 指定版本下載 下載mysql5.7
刪除映象
# 刪除映象 -f就是全部刪除,後面的條件是根據什麼來刪除,這裡是根據容器的id進行刪除
docker rmi -f 容器id
# 刪除多個映象
docker rmi -f 容器id 容器id 容器id
# 刪除所有的映象
docker rmi -f $(docker images -aq)
說明:我們有了映象才可以去建立容器,Linux,下載一個centos映象來進行學習。
下載centos映象
命令:docker pull centos
新建容器並啟動
命令:docker run [可選引數] image
引數說明:
--name="Name" : 容器名字 ,tomcat01、tomcat02,用來區分容器
-d :後臺方式執行
-it:使用互動方式執行,進入容器檢視內容
-p :指定容器的埠 -p 8080:8080
-p ip:主機埠:容器埠
-p 主機埠:容器埠(常用方式)
-p 容器埠
容器埠
-p: 隨機指定埠
測試,啟動並進入容器
命令:docker run -it centos /bin/bash
#啟動容器
命令: ls
# 檢視容器內的centos,基礎版本,很多命令都是不完善的
命令:exit
# 從容器中退回到主機
列出所有執行中的容器
命令:docker ps [可選引數]
# 列出當前正在執行的程式
-a #列出當前正在執行的容器+帶出歷史執行過的容器
-n=? #顯示最近建立的容器
-p #只顯示容器的編號
退出容器
命令:
exit # 直接停止容器並退出
Ctrl + P + Q # 容器不停止退出
刪除容器
docker rm 容器id # 刪除指定的容器,不能刪除正在執行的容器
docker rm -f $(docker ps -aq) # 刪除所有的容器
docker ps -a -q|xargs docker rm # 刪除所有的容器
啟動和容器的操作
docker start 容器id # 啟動容器
docker restart 容器id # 重新啟動容器
docker stop 容器id # 停止正在執行的容器
docker kill 容器id # 強制停止當前正在執行的容器
命令:docker run -d 映象名
docker run -d centos # 後臺啟動centos
問題:使用docker ps
檢視,發現 centos停止了
常見的坑:docker容器使用後臺執行的時候就必須要一個前臺執行緒,不然docker發現沒有應用就會自動停止
例如:nginx容器啟動後,發現自己沒有提供服務就會立刻停止,就是沒有程式了。
命令:docker stats [容器id]
命令:docker logs -tf --tail 容器
,沒有紀錄檔
docker run -d centos /bin/sh -c "while true; do echo oldouTest;sleep 1;done"
docker ps
去檢視docker logs -tf --tail number 容器id
-tf #顯示紀錄檔
--tail number #要顯示紀錄檔條數
例如:docker logs -tf --tail 10 容器id
命令:docker top 容器id
命令:docker inspect 容器id
我們的容器通常都是使用後臺方式執行的,需要進入容器,修改一些設定
方式一:
命令:docker exec -it 容器id bashShell
例如:docker exec -it bb6ddb943ea5 /bin/bash
方式二:
命令:docker attach 容器id
兩種方式的對比:
docker exec
: 進入容器後開啟一個新的終端,可以在裡面操作(常用)docker attach
:進入容器正在執行的終端,不會啟動新的程序# 進入到容器內:
[root@oldou home]# docker exec -it bb6ddb943ea5 /bin/bash
[root@bb6ddb943ea5 /]# cd home
[root@bb6ddb943ea5 home]# ls
# 建立一個java檔案
[root@bb6ddb943ea5 home]# touch Test.java
[root@bb6ddb943ea5 home]# ls
Test.java
# 退出容器回到主機
[root@bb6ddb943ea5 home]# exit
exit
#檢視當前執行的容器
[root@oldou home]# docker ps
# 將容器內/home目錄下的Test.java檔案拷貝到主機的home目錄下
[root@oldou home]# docker cp bb6ddb943ea5:/home/Test.java /home
[root@oldou home]# ls
Test.java
拷貝只是一個手動的過程,後面學習了 -v 卷的技術時,可以實現同步資料
命令 | 英文描述 | 中文意思 |
---|---|---|
attach | Attach to a running container | 當前shell下attach連線指定執行映象 |
build | Build an image from a Dockerfile | 通過Dockerfile客製化映象 |
commit | Create a new image from a container changes | 提交當前容器為新的境像 |
cp | copy files/folders from the containers filesystem to the host path | 從容器中拷貝指定檔案或者目錄到宿主機中 |
create | Create a new container | 建立一個新的容器,同run.但不啟動容器 |
diff | Inspect changes on a container’s filesystem | 檢視docker容器變化 |
events | Get real time events from the server | 從docker服務中獲取容器實時事件 |
export | Stream the contents of a container as a tar archive | 匯出容器的內容流作為一個 tar歸檔檔案[對應import] |
history | Show the history of an image | 展示一個境像形成歷史 |
images | List images | 列出系統當前所有映象 |
import | Create a new filesystem image from the contents of a tarball | 從tar包中的內容建立一個新的檔案系統映像[對應export] |
info | Display system-wide information | 顯示系統相關資訊 |
inspect | Return low-level information on a container | 檢視容器詳細資訊 |
kill | Kill a running container | kill指定docker容器 |
load | Load an image from a tar archive | 從—個 tar包中載入一個映象[對應save] |
login | Register or Login to the docker registry server | 註冊或者登陸一個docker源伺服器 |
logout | Log out from a Docker registry server | 從當前Docker registry退出 |
logs | Fetch the logs of a container | 輸出當前容器紀錄檔資訊 |
port | Lookup the public-facing port which is NAT-ed to PRIVATE_PORT | 檢視對映埠對應的容器內部源端 |
pause | Pause all processes within a container | 暫停容器 |
ps | List containers | 列出容器列表 |
pull | Pull an image or a repository from the docker registry server | 從docker映象伺服器中拉取指定映象或者庫映象 |
push | push an image or a repository to the docker registry server | 推播指定映象或者庫映象至docker源伺服器 |
restart | Restart a running container | 重新啟動執行的容器 |
rm | Remove one or more containers | 移除—個或者多個容器 |
rmi | Remove one or more images | 移除一個或多個境像[無容器使用該映象才可刪除,否則需刪除相關容器才可能繼續或者 -f 強制刪除 |
run | Run a command in a new container | 建立—個新的容器並執行一個命令 |
save | Save an image to a tar arehive | 儲存一個映象為—個tar包「對應load] |
search | Search for an image on the Docker Hub | 在docker hub中搜尋映象 |
start | start a stopped containers | 啟動容器 |
stop | stop a stopped containers | 停止容器 |
tag | Tag an image into a repository | 給源中映象打標籤 |
top | Lookup the running processes of a container | 檢視容器中執行的程序資訊 |
unpause | Unpause a paused container | 取消暫停容器 |
version | show the docker version information | 檢視docker版本號 |
wait | Block until a container stops,then print its exit code | 擷取容器停止時的退出狀態值 |
官網:https://hub.docker.com/_/nginx
第一步:搜尋映象(這裡建議去docker Hub上查詢一下版本資訊,上面還有幫助檔案介紹)
命令:docker search nginx
第二步:下載映象
命令:docker pull nginx
第三步:檢視映象並且啟動
命令:docker images # 檢視所有映象
**命令:docker run -d --name nginx01 -p 3344:80 nginx
-d 表示後臺執行,--name 表示給容器起名字,而nginx01表示起的名字,
-p 宿主機埠 :容器內部埠
後面的3344表示主機開發的3344埠,80表示容器內部的埠,這裡表示將80埠對映到外部的3344,
可以通過公網的3344存取到docker裡面的80埠,後面的nginx表示的是映象名字。
第四步:檢視容器並且執行測試
命令:docker ps
#檢視是否啟動
命令:curl localhost:3344
關閉防火牆:systemctl stop firewalld
到這一步的時候我們就可以使用 公網ip:3344 在瀏覽器存取了
第五步:進入Nginx容器
命令:docker exec -it nginx01 /bin/bash
#進入容器
命令:whereis nginx
命令:cd /etc/nginx
命令:ls檢視
命令:exit #退出
命令:docker stop 容器id
#停止Nginx容器
埠暴露的概念:
思考問題:我們每次改動nginx組態檔,都需要進入容器內部?十分的麻煩,我要是可以在容器外部提供一個對映路徑,達到在容器修改檔名,容器內部就可以自動修改?
使用 -v資料卷。
官網:https://hub.docker.com/_/tomcat
方式一:
docker run -it --rm tomcat:9.0
# 下載並啟動docker run -it --rm tomcat:9.0
,一般用於測試,用完停止就刪除。方式二:
還是使用之前的方式。
第一步:搜尋映象(這裡建議去docker Hub上查詢一下版本資訊,上面還有幫助檔案介紹)
命令:docker search tomcat
第二步:下載映象
命令:docker pull tomcat
# 這是下載最新版的tomcat
命令: docker pull tomcat:7.0
# 指定版本號
第三步:檢視映象並且啟動
命令:docker images
# 檢視所有映象
命令:docker run -d --name tomcat01 -p 3355:8080 tomcat:7.0
-d 表示後臺執行,--name 表示給容器起名字,而tomcat01表示起的名字,
-p 宿主機埠 :容器內部埠
後面的3355表示主機開發的3355埠,8080表示容器內部的埠,這裡表示將8080埠對映到外部的3355,
可以通過公網的3355存取到docker裡面的8080埠,後面的tomcat表示的是映象名字。
我們這個時候去瀏覽器存取發現,報了404異常,那我們進入到tomcat容器內部檢視一下原因.
docker exec -it tomcat01 /bin/bash
ll
命令時竟然不能使用,只能使用ls
命令檢視,同時進入到webapps目錄下發現這個目錄竟然是空的。發現問題:
1、Linux的命令少了;
2、webapps目錄下沒有檔案;
原因:
阿里雲的映象預設是最小的映象,它把所有不必要的都剔除掉了。保證最小可執行的環境。
解決辦法:
在tomcat目錄下有一個webapps.dist
目錄,這個目錄下有我們所需要的檔案,也就是webapps目錄所需要的檔案,我們將這個檔案中的內容全部拷貝到webapps下。
cp -r webapps.dist/* webapps
這樣我們再去瀏覽器中去存取就可以存取到了。
思考問題:我們以後要部署專案,如果每次都要進入容器是不是十分麻煩?要是可以在容器外部提供一個對映路徑,webapps ,我們在外部放置專案,就自動同步到內部就好了!
由於暫時沒有學過Elasticsearch,所以暫時沒有做這個部分的筆記,只是暫時看了一遍,後續補上…
後續筆記待更新中…