一款軟體產品必須經過:開發 -> 上線
開發人員負責將應用程式開發製作出來。
運維人員負責上線,設定應用程式。
在這裡存在一個問題:開發環境和上線環境不一致;可能會導致,開發人員在自己的電腦上可以正常執行程式碼,運維人員將服務程式上線到伺服器後,由於環境不一致可能會導致執行失敗,服務不可用。
如何解決上述問題?
Docker就是將開發環境和程式程式碼一起打包到伺服器中執行的技術。
java語言 --> apk程式 --> 釋出到應用商店 --> 客戶下載apk --> 安裝使用(必須要有環境才能安裝成功)
java語言 --> jar環境 --> 打包專案和環境(映象) --> 上傳到docker倉庫(商店) --> 下載倉庫中的映象 --> 執行使用
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的Linux或Windows機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
Docker的核心思想就是來自集裝箱;集裝箱的概念是隔離貨物,所以docker的核心就是隔離機制。同時docker使用可移植映象所以部署以及運維極其方便快捷。
2010年,幾個熱愛IT的年輕人,在美國成立了一家公司叫做dotCloud,主要做一些Paas的雲端計算服務和LXC有關的容器技術賺錢盈利,他們將自己的容器技術命名為Docker!
Docker剛剛誕生的時候,並沒有引起行業的注意!這個時候 dotCloud公司難以在行業中存活,所以這幾個年輕人選擇開放Docker原始碼來引起注意!
2013年,Docker開源!越來越多的人發現docker的優點,救火了,docker每個月都會更新一個版本!
2014年4月9日,Docker1.0釋出!
Docker為什麼這麼火?十分的輕巧
在容器技術出來之前,我們都是使用虛擬機器器技術!
虛擬機器器:在window中裝一個Vmware,通過這個軟體我們可以虛擬出來一臺或者多臺電腦!(很笨重)
虛擬機器器也是屬於虛擬化技術,Docker容器技術,也是一種虛擬化技術!
vm:隔離,需要開啟多個虛擬機器器!linux centos原生映象(一個電腦!)需要幾個G記憶體空間,開啟需要幾分鐘!
docker:隔離,映象(最核心的環境4m記憶體)十分的小巧,執行映象就可以了!小巧!幾個M或KB的記憶體空間,秒級啟動!
虛擬機器器:通過虛擬化技術模擬真實的硬體從而建立出來的一臺擁有完整功能的邏輯計算機。
Docker容器:docker容器也是一種虛擬化技術,和傳統虛擬化不一樣的是docker只模擬一個程式最核心的執行環境,所以十分小巧,啟動更快。
對比 | 特點 |
---|---|
虛擬機器器 | 完整的系統功能,隔離性更好,佔用空間大(通常以G為單位),執行佔用資源較多,啟動慢(分鐘級啟動) |
容器 | 只有程式執行的核心環境,不需要安裝直接執行映象即可,隔離性一般,十分小巧佔用空間極小(一般以M為單位),啟動快(秒級啟動) |
Docker 引擎(Docker Engine)是目前主流的容器引擎;Docker 引擎是一個包含以下元件的客戶/伺服器 架構的應用程式,如圖所示:
Docker優勢:
映象(image):
docker映象就好比是一個模板,可以通過這個模板來建立容器服務,tomcat映象=>run=>tomcat1容器(提供伺服器),通過這個映象可以建立多個容器(最終服務執行或者專案執行就是在容器中的)。
容器(container):
Docker利用容器技術,獨立執行一個或者一個組應用,通過映象來建立的。
啟動,停止,刪除,基本命令!
目前就可以把這個容器理解為就是一個簡易的linux系統
倉庫(repository):
倉庫就是存放映象的地方!
倉庫分為公有倉庫和私有倉庫!
OCI&OCF
OCI
Open Container-initiative
OCF
Open Container Format
runC是一個命令列工具,用於根據OCI規範生成和執行容器
docker提供了一個專門容納容器映象的站點:https://hub.docker.com
# 1.首先設定yum倉庫
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
# 2.解除安裝舊的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 3.設定映象的倉庫
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 預設是從國外的。
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推薦使用阿里雲的。
# 4.安裝容器相關的。docker-ce(社群版)docker-ee(企業版)
yum install docker-ce
# 5.啟動docker服務並設定開機自啟
systemctl start docker
systemctl enable docker
# 6.使用docker version檢視是否安裝成功
docker version
# 7.測試hello-world
docker run hello-world
# 8.檢視一下,下載的這個hello-world映象
docker加速
docker-ce的組態檔是/etc/docker/daemon.json,此檔案預設不存在,需要我們手動建立並進行設定,而docker的加速就是通過設定此檔案來實現的。
docker的加速有多種方式:
阿里雲加速器使用方法
開啟瀏覽器,存取阿里雲官網
登入之後點選右上角控制檯,在點選左上角產品與服務
在彈性計算裡找到容器映象服務,
在/etc/docker目錄下新建檔案daemon.json將加速器地址寫入
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://此處地址為自己阿里雲映象加速地址.mirror.aliyuncs.com"]
}
重啟服務
systemctl daemon-reload
systemctl restart docker
瞭解:解除安裝docker
# 1.解除安裝依賴
yum remove docker-ce
# 2.刪除資源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
# /var/lib/docker docker的預設工作路徑
docker version # 顯示docker的版本資訊
docker info # 顯示docker的系統資訊,包括映象和容器的數量
docker 命令 --help # 幫助命令
docker images 檢視所有原生的主機上的映象
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
# 解釋
REPOSITORY //映象的倉庫源
TAG //映象的標籤
IMAGE ID //映象的id
CREATED //映象的建立時間
SIZE //映象的大小
# 命令引數可選項
-a, --all # 顯示所有映象 (docker images -a)
--digests #顯示映象的摘要資訊(docker images --digests)
-q, --quiet # 僅顯示映象id (docker images -q)
docker search 搜尋映象
[root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12966 [OK]
......
# 解釋
NAME //映象倉庫源的名稱
DESCRIPTION //表示該映象的功能
STARS //表示下載熱度
OFFICIAL //是否docker官方釋出
AUTOMATED //自動構建
# 命令引數可選項 (通過搜尋來過濾)
--filter=STARS=3000 # 搜尋出來的映象就是stars大於3000的
[root@localhost ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12966 [OK]
mariadb MariaDB Server is a high performing open sou… 4966 [OK]
docker pull 下載映象
# 下載映象:docker pull 映象名[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest #如果不寫tag,預設就是latest,最新的版本
latest: Pulling from library/mysql
32c1bf40aba1: Pull complete # 分層下載,docker image的核心,聯合檔案下載
3ac22f3a638d: Pull complete
b1e7273ed05e: Pull complete
20be45a0c6ab: Pull complete
410a229693ff: Pull complete
1ce71e3a9b88: Pull complete
c93c823af05b: Pull complete
c6752c4d09c7: Pull complete
d7f2cfe3efcb: Pull complete
916f32cb0394: Pull complete
0d62a5f9a14f: Pull complete
Digest: sha256:ce2ae3bd3e9f001435c4671cf073d1d5ae55d138b16927268474fc54ba09ed79
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真實地址
# 指定版本下載
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists # 聯合檔案下載,已經存在的資源可以共用
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 刪除映象
[root@localhost ~]# docker rmi -f 映象id # 刪除指定的映象
[root@localhost ~]# docker rmi -f 映象id 映象id 映象id # 刪除多個映象(空格分隔)
[root@localhost ~]# docker rmi -f $(docker images -aq) # 刪除全部的映象
docker inspect 獲取映象的詳細資訊
[root@localhost ~]# docker inspect 映象名:標籤
docker tag 新增映象別名,類似於別名
[root@localhost ~]# docker tag 映象名:標籤 新映象名:新標籤
# 範例:
[root@localhost ~]# docker tag mysql:5.7 mysql:alone
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 3147495b3a5c 8 days ago 431MB
mysql alone 3147495b3a5c 8 days ago 431MB
說明:我們有了映象才可以建立容器,下載一個centos 映象來測試學習。
docker pull centos
容器建立命令
docker create 建立新容器
[root@localhost ~]# docker create 映象名
# 範例:
[root@localhost ~]# docker create centos
1f8c0d836c2751fd39b46922d256505626925a7519154e2d0b811ede561bb097
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f8c0d836c27 centos "/bin/bash" 10 seconds ago Created jovial_chaum
docker run 容器建立並執行
docker run [可選引數] image
# 引數說明
--name="name" 容器名字:用來區分容器
-d 後臺方式執行:相當於nohup
-it 使用互動式執行:進入容器檢視內容
-p 指定容器的埠(四種方式)小寫字母p
-p ip:主機埠:容器埠
-p 主機埠:容器埠
-p 容器埠
容器埠
-P 隨機指定埠(大寫字母P)
#使用centos映象啟動一個名為centos0的容器
[root@localhost ~]# docker run --name centos0 centos
# 使用centos映象啟動容器並分配一個bash shell的終端進入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@6c39cc898c6c /]# ls # 檢視容器內的centos(基礎版本,很多命令都是不完善的)
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@6c39cc898c6c /]# exit
exit
# 注意:
1.指定-it選項為容器分配shell後,啟動容器時執行的命令將會被shell替代
2.不加-d選項的容器一旦使用exit退出容器shell,容器就終止執行;ctrl+p+q可以退出shell,容器仍將繼續執行
# 使用 mysql映象啟動一個名為 mysql1的容器並在後臺執行
[root@localhost ~]# docker run --name mysql1 -d mysql
867c0734a5f21ae1fb607f5cdf2eb03bb4494eb5dc1056caa164689d0a2dc76f
#使用 mysql映象啟動一個名為 mysql2的容器,該容器在後臺執行,存取宿主機的8080埠可以存取到容器的80埠
[root@localhost ~]# docker run --name mysql2 -d -p 8080:80 mysql
c07b515d0041fbb6905990c9377971fd0353cdb63e1adb80f5f05648d850baf8
容器檢視命令
docker ps 檢視容器執行狀態
# 選項:
-a //顯示所有的容器,包括未執行的
-q //只顯示容器id
-l //顯示最近建立的容器。
-f "篩選條件" //根據條件過濾顯示的內容
# 範例:
範例:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8af463c6e52 hello-world "/hello" 14 seconds ago Exited (0) 13 seconds ago strange_cartwright
# 解釋
CONTAINER ID //容器 ID
IMAGE //使用的映象
COMMAND //啟動容器時執行的命令
CREATED //容器的建立時間
STATUS //容器狀態
# 容器狀態有7種:
created(已建立)
restarting(重啟中)
running(執行中)
removing(遷移中)
paused(暫停)
exited(停止)
dead(死亡)
PORTS //容器的埠資訊和使用的連線型別(tcp\udp)。
NAMES //容器名稱
docker inspect 檢視容器詳細資訊
# 範例:
[root@localhost ~]# docker inspect test
......略........
容器刪除命令
docker rm 刪除容器
docker rm 容器名 //刪除容器,無法刪除執行狀態下的容器
選項:
-f //強制,可以刪除執行狀態下的容器
# 範例:
//刪除mysql1容器
[root@localhost ~]# docker rm nginx01
mysql1
//批次刪除所有容器
[root@localhost ~]# docker rm $(docker ps -qa)
9b2fa686b4ae
a4f41fb35ac3
容器生命週期管理命令
docker start 容器名 //開啟容器
docker stop 容器名 //停止容器
docker kill 容器名 //殺死容器
docker restart 容器名 //重啟容器
docker pause 容器名 //暫停容器中所有的程序
docker unpause 容器名 //恢復容器中所有的程序
容器佔用資源檢視命令
docker stats 容器名 //檢視容器使用資源資訊
docker top 容器名 //檢視容器中執行的程序資訊,支援ps命令引數
docker port 容器名 //檢視宿主機埠和容器埠之間的埠對映
容器紀錄檔檢視命令
# 當容器建立失敗時,因為容器沒有啟動成功則無法看到錯誤紀錄檔,無法判斷問題所在,下面命令可以檢視紀錄檔,不管容器時候啟動成功
docker logs 容器名 //獲取容器的紀錄檔資訊
選項:
-f //跟隨列印最新的紀錄檔追加在最後面
-t //顯示紀錄檔列印的時間戳
--tail 數量 //只顯示最新的指定數量的幾條紀錄檔資訊
容器內程序連線和命令執行
docker attach 連線到正在執行的容器程序中,預設連線到容器啟動時啟動的程序
# 連線到httpd03容器中的nginx程序,此時可以看到httpd03工作紀錄檔
[root@localhost ~]# docker attach httpd03
172.17.0.1 - - [04/Aug/2022:09:06:29 +0000] "GET / HTTP/1.1" 304 -
# 注意:使用attach連線到容器容器程序,一旦終止容器內的程序,容器就終止執行
# 如果容器啟動時執行的命令是shell程序,則連線shell終端
[root@localhost ~]# docker attach httpd04
root@6b830320e24a:/usr/local/apache2# exit
exit
docker exec 不進入容器執行容器中的命令
# docker exec 容器名 執行命令
選項:
-d //後臺執行,不顯示結果
-it //為容器分配一個始終執行的偽終端,需要指定shell;-i保持執行狀態,-t是分配偽終端
# 範例:
#不進入容器執行容器中的ls命令
[root@localhost ~]# docker exec httpd04 ls
bin
build
cgi-bin
......
# 使用docker exec命令開啟一個shell進入到容器中,使用exit退出shell,容器也不會終止執行
[root@localhost ~]# docker run --name httpd05 -it -d httpd /bin/bash
1b656ba8a5b5689c0b2e688537358779964a9e43f174ce3ab5ff7196dac4e402
[root@localhost ~]# docker exec -it httpd05 /bin/bash
root@1b656ba8a5b5:/usr/local/apache2# exit
exit
注意:
# docker exex # 進入容器後開啟一個新的終端,可以再裡面操作(常用)
# docker attach # 進入容器正在執行的終端,不會啟動新的程序。