本文為觀看B站狂神的視頻學習Docker時所整理的筆記,中間加了一些自己的理解,如果對大家有所幫助,還希望點贊支持一下,后續我會繼續將自己遇到的Docker問題以及學習的新的知識全部整理添加到本文后面或者整理發布新的文章,如果感興趣可以關注一波,
目錄
- Docker的概述
- 為什么需要Docker?
- 簡述虛擬機和Docker容器的區別
- Docker中的DevOps(開發、運維)
- Docker的基本組成
- Docker的安裝
- 前期準備(看看即可)
- 開始安裝
- 如何卸載Docker(了解即可)
- 配置阿里云鏡像加速
- Run的流程以及Docker原理
- Docker的常用命令
- 查看資訊和幫助命令
- 鏡像命令
- 容器命令
- 常用的其他命令
- 后臺啟動容器
- 查看系統CPU狀態
- 查看日志
- 查看容器中行程資訊
- 查看鏡像中的元資料
- 進入當前正在運行的容器
- 從容器中拷貝檔案到主機上
- 常用命令小結
- 練習
- 練習一:使用Docker安裝Nginx
- 練習二:使用Docker部署Tomcat
- 練習三:使用Docker部署Elasticsearch、Kibana
Docker的概述

Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源,
Docker的官網地址:https://www.docker.com/
檔案地址:https://docs.docker.com/
倉庫地址:https://hub.docker.com/
為什么需要Docker?
傳統的開發問題:
- 環境(切換/配置)麻煩
在開發一個產品的途中,時常會出現的問題就是:“在我的電腦上可以運行,而到了另外一個開發人員的電腦上就不能使用的問題”,或者是因為版本更新導致服務不可用等等,這對于運維人員來說,壓力十分大,而環境配置是一個非常頭疼的問題,每一個機器都需要部署環境(Redis集群、ES…)十分麻煩且費時費力,并且配置的環境不能跨平臺,非常不方便, - 應用之間的沖突(隔離性)
假如我們將開發的兩個應用部署到同一個服務器上,如果一個應用出了問題,導致CPU出問題上升到了100%,那么第二個應用也會受到關聯;并且如果兩個應用分別使用不同的語言或者技術堆疊,當安裝在同一個服務器上的時候可能就會造成各種沖突/無法兼容,到時候除錯就非常頭疼,如下圖所示:
Docker的出現解決以上問題
-
關于環境問題解決方案
Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實作虛擬化,將環境構建打包成一個鏡像發布到網上,想要用這個環境的時候就直接拉取一份就OK了, -
解決應用之間隔離問題
Docker核心思想就是使用容器化技術,打包裝箱,每個箱子是互相隔離的,容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器性能開銷極低,如下圖所示:

簡述虛擬機和Docker容器的區別
這里參考知乎上大佬的說法:https://www.zhihu.com/question/48174633
服務器虛擬化解決的核心問題是資源調配,而容器解決的核心問題是應用開發、測驗和部署,
- 使用Docker容器和使用虛擬機在運行多個相互隔離的應用時對比,Docker要簡潔很多;
- Docker守護行程可以直接與主作業系統進行通信,為各個Docker容器分配資源;它還可以將容器與主作業系統隔離,并將各個容器互相隔離,
- 虛擬機啟動需要數分鐘,而Docker容器可以在數毫秒內啟動,由于沒有臃腫的從作業系統,Docker可以節省大量的磁盤空間以及其他系統資源,
- 虛擬機更擅長于徹底隔離整個運行環境,例如,云服務提供商通常采用虛擬機技術隔離不同的用戶,而Docker通常用于隔離不同的應用,例如前端,后端以及資料庫,
- 傳統的虛擬機,首先是虛擬出一條硬體,運行一個完整的作業系統,然后在這個系統上安裝和運行軟體;
- Docker容器內的應用直接運行在宿主機的內容,容器是沒有自己的內核的,也沒有虛擬我們的硬體,所以就輕巧了很多;
Docker中的DevOps(開發、運維)
(1)應用更快速的交付和部署:
- 傳統:一堆的幫助檔案和安裝程式
- Docker:打包鏡像發布測驗,一鍵運行
(2)更快捷的升級和擴縮容
- 使用了Docker以后我們部署應用就像搭積木一樣;
- 專案打包成一個鏡像
(3)更簡單的系統運維
- 在容器話之后我們的開發、測驗環境都是高度一致的
(4)更高效的計算資源利用
- Docker是內核級別的虛擬化,可以再一個物理機上可以運行很多的容器實體!服務器的性能可以被壓榨到極致,
Docker的基本組成

-
鏡像(image):docker鏡像就好比是一個模板,可以通過這個模板來創建容器服務,tomcat鏡像—>run---->tomcat01容器(提供服務),通過這個鏡像可以創建多個容器(最終服務運行或者專案運行就是在容器中運行的),
-
容器(container):docker利用容器技術,獨立運行一個或者一組應用,通過鏡像來創建的,啟動、停止、洗掉、基本命令,目前就可以把這個容器理解為就是一個簡易的Linux系統,
-
倉庫(repository):倉庫就是存放鏡像的地方,倉庫分為公有倉庫和私有倉庫,Docker Hub(默認是國外的)、阿里云…都有容器服務器(配置鏡像加速)
Docker的安裝
前期準備(看看即可)
不一樣的話也行,主要是看Centos的版本
運行環境:阿里云服務器 Centos 7
連接工具:XShell 5
需要掌握:Linux的基本命令
由于這里的運行環境是Centos 7,與Centos 6的命令還是有一些區別的,但是區別不大,后面我會將命令詳細的介紹,
查看環境:
- 系統內核是3.10以上的
[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

如何卸載Docker(了解即可)
官網中有介紹,下面我給出來:
第一步:卸載依賴
命令: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
這樣就配置完成了,
Run的流程以及Docker原理
回顧hello-word的流程

就拿我們運行hello-word來說,一開始我們運行hello-word的時候,Docker會在本機中尋找鏡像,而本機中沒有這個鏡像,所以就回去我們配置的Hub上去下載鏡像,如果找到了就將鏡像下載到本地運行,如果沒有就回傳錯誤,如下所示:

底層原理
(1)Docker是怎么作業的?
- Docker是一個Client-Server結構的系統,Docker的守護行程運行在本機上(運行在后臺,和mysql一樣),通過Socket從客戶端訪問,
- DockerServer接收到Docker-Client的指令,就會執行這個命令,

(2)Docker為什么比虛擬機(VM)快?

- Docker利用的是宿主機的內核,VM需要的是Guest OS
所以說,新建一個容器的時候,Docker不需要像虛擬機那樣重新加載一個作業系統內核,避免引導,虛擬機是加載Guest OS,是分鐘級別的,而Docker利用的是宿主機的作業系統,省略了這個復雜的程序,

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容器啟動后,發現自己沒有提供服務就會立刻停止,就是沒有程式了,
查看系統CPU狀態
命令:docker stats [容器id]

查看日志
命令:docker logs -tf --tail 容器,沒有日志
- 撰寫一段shell腳本
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 | 截取容器停止時的退出狀態值 |
練習
練習一:使用Docker安裝Nginx
官網: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資料卷,
練習二:使用Docker部署Tomcat
官網:https://hub.docker.com/_/tomcat
方式一:
- 官方給出的命令:
docker run -it --rm tomcat:9.0# 下載并啟動
上面介紹Nginx的啟動都是后臺啟動,停止了容器以后,容器還是可以查到,并且占用著配置的埠,
使用官方給出的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 ,我們在外部放置專案,就自動同步到內部就好了!
練習三:使用Docker部署Elasticsearch、Kibana
由于暫時沒有學過Elasticsearch,所以暫時沒有做這個部分的筆記,只是暫時看了一遍,后續補上…
后續筆記待更新中…
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/161380.html
標籤:其他
上一篇:Hadoop源代碼分析【1-5】
