# Docker概述 ## Docker為何要出現 由於傳統的方式,不能打包環境,而環境的配置也及其繁瑣,及其耗費時間,而docker就可以非常有效的解決這個問題 **docker的思想來源於集裝箱,docker的核心思想!打包裝箱,也就是說每個箱子都是隔開的,docker通過這種機制可以吧伺服器利 ...
Docker概述
Docker為何要出現
由於傳統的方式,不能打包環境,而環境的配置也及其繁瑣,及其耗費時間,而docker就可以非常有效的解決這個問題
docker的思想來源於集裝箱,docker的核心思想!打包裝箱,也就是說每個箱子都是隔開的,docker通過這種機制可以吧伺服器利用到極致
docker為什麼這麼多人喜歡用
在類似docker這種技術出現之前,我們用的都是虛擬機,而虛擬機和docker都稱為虛擬化技術,不同的則是:
- 虛擬機安裝和啟動相當於一個全新的操作系統,體積十分的大
- docker則是直接運行在宿主機的,而且每個容器是相互隔離的,每個容器都有屬於自己的文件系統,而每個容器相同的東西是共用的,互不影響,也十分的小巧
docker是基於go語言開發的,是一個開源項目
docker官網:https://www.docker.com/
docker的官方文檔:https://docs.docker.com/
docker的鏡像倉庫:https://hub.docker.com/
- 應用更快熟的交付和部署
- 更便利的升級的擴展,刪減
- 更簡單的系統運維
- 更高效的電腦資源利用
Docker安裝
參考官方文檔和百度以及Google
Docker的基本組成
-
鏡像(images)
可以通過鏡像來創建多個容器
-
容器(container)
利用容器化技術,獨立運行應用,通過鏡像來創建,目前可以理解為一個簡易的linux
-
倉庫(repository)
存放鏡像的地方,分為私有和公有,國內結合阿裡雲的容器的鏡像加速服務使用
Docker的常用命令
幫助命令
docker version # 查看docker的版本信息
docker info # 查看docker的系統信息,包含鏡像和容器的數量
docker 命令 --help #幫助命令,幫助文檔:https://docs.docker.com/engine/reference/commandline/build/
鏡像命令
docker images # 查看本地主機上的所有鏡像,也可以用docker image ls
# 解釋
#REPOSITORY # 鏡像的倉庫源
#TAG # 鏡像的標簽
#IMAGE ID # 鏡像的id
#CREATED # 鏡像的創建時間
#SIZE # 鏡像的大小
docker search # 搜索鏡像
docker pull #下載鏡像
docker rmi # 刪除鏡像
docker pull下載鏡像
#下載鏡像 docker pull 鏡像名[:tag]
❯ docker pull gcc
Using default tag: latest
latest: Pulling from library/gcc #不寫tag預設就是latest
b9a857cbf04d: Already exists # 分層下載 docker images的核心,聯和文件系統
d557ee20540b: Already exists
3b9ca4f00c2e: Already exists
667fd949ed93: Already exists
4ad46e8a18e5: Already exists
6b12d912e8a1: Pull complete
469a7950a2b4: Pull complete
b0ef12232a36: Pull complete
c261ba6eb26c: Pull complete
Digest: sha256:f418921b872c4831dfc9bc33aaec2a8480d37e46190da766c3497cd8d5fedb75 # 防偽簽名
Status: Downloaded newer image for gcc:latest
docker.io/library/gcc:latest # 真實地址
docker rmi刪除鏡像
docker rmi -f 鏡像id #刪除指定的鏡像
docker rmi -f 鏡像id 鏡像id 鏡像id 鏡像id#刪除指定的鏡像
docker rmi -f $(docker images -aq) #刪除全部的鏡像
容器命令
docker run 鏡像id # 新建容器並啟動
docker ps # 列出所有運行的容器 docker container list
docker rm 容器id # 刪除指定容器
docker start 容器id # 啟動容器
docker restart 容器id # 重啟容器
docker stop 容器id # 停止當前正在運行的容器
docker kill 容器id # 強制停止當前容器
註:我們有了鏡像才可以創建容器,linux
> docker container
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a running container # 當前shell下 attach連接指定運行的鏡像
commit Create a new image from a container's changes # 提交當前容器為新的鏡像
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
exec Run a command in a running container
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Run a command in a new container
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
Run 'docker container COMMAND --help' for more information on a command.
新建容器並啟動
docker run [可選參數] images | docker container run [可選參數] image
#參數說明書
--name="Name" # 容器名字 tomcat01 tomcat02 用來區分容器
-d # 後臺方式運行
-it # 使用交互方式運行,進入容器查看內容
-p # 指定容器的埠 -p 8080(宿主機):8080(容器)
-p ip:主機埠:容器埠
-p 主機埠:容器埠(常用)
-p 容器埠
-P(大寫) 隨機指定埠
# 測試
❯ docker run -it centos
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
7a0437f04f83: Already exists
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
i[root@8f62df7602af /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@8f62df7602af /]# exit # 退出容器到主機
exit
查看當前正在運行的容器
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
565c3e0b43ca centos "/bin/bash" 12 seconds ago Up 11 seconds
practical_hermann
退出容器
exit # 直接退出容器
ctrl+p+Q # 容器不停止退出
刪除容器
docker rm 容器id # 刪除指定容器,不能刪除正在運行的容器,可以使用rm -rf強行刪除
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
0a739d000eafcb8e190e890ed06832de1b7ee2f1544d59fcd60390699f1612fe
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 常見的坑,docker容器使用後臺運行,就必須要有一個前端進程,docker發現沒有應用,就會自動停止
查看日誌
# 顯示日誌
-tf # 顯示日誌信息(一直更新)
--tail number # 需要顯示日誌條數
docker logs -t --tail n 容器id # 查看n行日誌
docker logs -ft 容器id # 跟著日誌
查看鏡像的元數據
❯ docker inspect centos #centos為容器id或名稱
[
{
"Id": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
..........
}
]
進入當前正在運行的容器
docker exec -it 容器id bashshell # 進入當前容器重開一個終端,可以在裡面操作
docker attach 容器id # 進入當前容器正在執行的終端
從容器拷貝到主機上
docker cp 容器id:容器內路徑 主機
Docker鏡像講解
鏡像是什麼
鏡像其實就是一種輕量級,可執行的獨立軟體包,用來打包軟體運行環境和基於運行環境開發的軟體,它包含運行某個軟體所需的所有內容,將所有的應用和環境打包成docker鏡像,即可直接運行
Docker鏡像載入原理
-
UnionFs(聯合文件系統)
我們下載的時候看見的一層層的就是這個
也就是一種分層,輕量級並且高性能的文件系統,支持對文件系統修改作為一次提交來一層層疊加,同時可以將不同的目錄掛載在同一個虛擬文件系統下,是docker鏡像的基礎,鏡像可以分層繼承
特性:可以一次載入多個文件系統,但總體就一個文件系統,聯和載入會把各層文件系統疊加起來,最終的文件系統就會包含底層的所有文件和目錄
分層
最大的好處就是資源共用,查看鏡像分層的方式可以通過docker images inspect
來查看
理解
所有的docker都起始於一個基礎的鏡像層,當進行修改的或者新加內容時,就會在當前的鏡像層之上新建鏡像層,類似於游戲打補丁
Docker通過存儲引擎(新版本採用快照機制)的方式來實現鏡像層堆棧,並保證多鏡像層對外展示為統 一的文件系統
Linux上可用的存儲引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎都基於 Linux中對應的文件系統或者塊設備技術,井且每種存儲引擎都有其獨有的性能特點
Docker在 Windows上僅支持 windowsfilter 一種存儲引擎,該引擎基於NTFS文件系統之上實現了分層 和CoW
docker鏡像都是只讀的,當容器啟動的時候,一個新的可寫層載入到鏡像的頂部,這一層就是我們常說的容器層,容器之下的都叫鏡像
commit鏡像
# 和git的原理類似
docker commit -m="描述" -a="作者" 容器id 目標鏡像名[:TAG]