docker能干嘛
虛擬機(jī)技術(shù)缺點(diǎn):
- 資源占用十分多
- 冗余步驟多
- 啟動(dòng)很慢
容器化技術(shù)
容器化技術(shù)不是模擬的一個(gè)完整的操作系統(tǒng)
比較docker和虛擬機(jī)技術(shù)的不同
- 傳統(tǒng)虛擬機(jī)匣椰,虛擬出一套硬件,運(yùn)行一個(gè)完整的操作系統(tǒng)渐溶,然后在這個(gè)系統(tǒng)上安裝和運(yùn)行軟件
- 容器內(nèi)的應(yīng)用直接運(yùn)行在宿主機(jī)的內(nèi)部毕泌,容器是沒(méi)有自己的內(nèi)核的,也沒(méi)有虛擬我們的硬件碳柱,所以就輕便了
- 每個(gè)容器間是互相隔離的藤滥,每個(gè)容器內(nèi)都有一個(gè)屬于自己的文件系統(tǒng)梗搅,互不影響
應(yīng)用更快速的交付和部署
傳統(tǒng):一堆幫助文檔蠢络,安裝程序
docker:打包鏡像發(fā)布測(cè)試衰猛,一鍵運(yùn)行
更便捷的升級(jí)和擴(kuò)縮容
使用了docker之后,我們部署應(yīng)用就和搭積木一樣
項(xiàng)目打包為一個(gè)鏡像刹孔,擴(kuò)展 服務(wù)器A啡省,服務(wù)器B
更簡(jiǎn)單的系統(tǒng)運(yùn)維
在容器化之后,我們的開(kāi)發(fā)髓霞,測(cè)試環(huán)境都是高度一致的
更高效的計(jì)算資源利用
docker是內(nèi)核級(jí)別的虛擬化卦睹,可以在一個(gè)物理機(jī)上可以運(yùn)行很多的容器實(shí)例,服務(wù)器的性能可以被壓榨到極致
docker安裝
docker基本組成
鏡像(image)
docker鏡像就好比是一個(gè)模板方库,可以通過(guò)這個(gè)模板來(lái)創(chuàng)建容器服務(wù)结序,通過(guò)這個(gè)鏡像可以創(chuàng)建多個(gè)容器(最終服務(wù)運(yùn)行或者項(xiàng)目運(yùn)行就是在容器中的)
容器(container)
docker利用容器技術(shù),獨(dú)立運(yùn)行一個(gè)或者一個(gè)組應(yīng)用纵潦,通過(guò)鏡像來(lái)創(chuàng)建的
啟動(dòng)笼痹,停止,刪除酪穿,基本命令
目前就可以把這個(gè)容器理解為就是一個(gè)簡(jiǎn)易的linux系統(tǒng)
倉(cāng)庫(kù)(repository)
倉(cāng)庫(kù)就是存放鏡像的地方
倉(cāng)庫(kù)分為共有倉(cāng)庫(kù)和私有倉(cāng)庫(kù)
Docker Hub(默認(rèn)是國(guó)外的)
阿里云。晴裹。都有容器服務(wù)器(配置鏡像加速)
安裝docker
環(huán)境查看
# 系統(tǒng)內(nèi)核是3.10 以上的
uname -r
# 系統(tǒng)版本
cat /etc/os-release
# 是centos7
安裝
參考幫助文檔
# 1. 卸載舊的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2. 需要的安裝包
sudo yum install -y yum-utils
# 3. 設(shè)置鏡像的倉(cāng)庫(kù)
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默認(rèn)是國(guó)外的
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推薦使用阿里云的被济,十分快
# 更新yum軟件包索引
yum makecache fast
# 4. 安裝docker docker-ce 社區(qū)版 ee 企業(yè)版
yum install docker-ce docker-ce-cli containerd.io
# 5. 啟動(dòng)docker
systemctl start docker
# 6. 使用 docker vesion查看
# 7. hello-world
docker run hello-world
# 8. 查看一下下載的這個(gè)hello-world
docker images
了解:卸載docker
# 1. 卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
# 2. 刪除資源
rm -rf /var/lib/docker
# /var/lib/docker docker的默認(rèn)工作路徑
阿里云鏡像加速
登錄阿里云找到鏡像服務(wù)
找到鏡像加速器
配置使用
回顧helloworld流程
底層原理
docker是怎么工作的?
docker是一個(gè)Client-Server
結(jié)構(gòu)的系統(tǒng)涧团,docker的守護(hù)進(jìn)程運(yùn)行在主機(jī)上只磷,通過(guò)socket從客戶端訪問(wèn)经磅!DockerServer接收到Docker-Client的指令,就會(huì)執(zhí)行這個(gè)命令钮追!
docker為什么比VM快
- docker有著比虛擬機(jī)更少的抽象層
- docker利用的是宿主機(jī)的內(nèi)核预厌,vm需要的是Guest OS
所以說(shuō),新建一個(gè)容器的時(shí)候元媚,docker不需要像虛擬機(jī)一樣重新加載一個(gè)操作系統(tǒng)內(nèi)核轧叽,避免引導(dǎo)。虛擬機(jī)是加載Guest OS刊棕,分鐘級(jí)別的炭晒,而docker是利用宿主機(jī)的操作系統(tǒng),省略了這個(gè)復(fù)雜的過(guò)程甥角,秒級(jí)
docker的常用命令
幫助命令
docker version # 顯示docker的版本信息
docker info # 顯示docker的系統(tǒng)信息网严,包括鏡像和容器的數(shù)量
docker 命令 --help # 幫助命令
幫助文檔的地址:https://docs.docker.com/engine/reference/commandline/
鏡像命令
docker images 查看所有本地的主機(jī)上的鏡像
docker images
# 解釋
REPOSITORY 鏡像的倉(cāng)庫(kù)源
TAG 鏡像的標(biāo)簽
IMAGE ID 鏡像的id
CREATED 鏡像的創(chuàng)建時(shí)間
SIZE 鏡像的大小
# 可選項(xiàng)
-a, --all # 列出所有鏡像
-q, --quiet # 只顯示鏡像的id
docker search 搜索鏡像
docker search mysql
# 可選項(xiàng),通過(guò)收藏來(lái)過(guò)濾
--filter=STARS=3000 # 搜索出來(lái)的鏡像就是STARS大于3000的
docker search mysql --filter=STARS=3000
docker pull 下載鏡像
# 下載鏡像 docker pull 鏡像名[:tag]
[root@muyi /]# docker pull mysql
Using default tag:latest # 如果不寫tag 默認(rèn)就是latest
latest:Pulling from library/mysql
5b54d594fba7:Pull complete # 分層下載 docker image的核心 聯(lián)合文件系統(tǒng)
...
Digest:xxxx # 簽名
...
docker.io/library/mysql:latest # 真實(shí)地址
# 等價(jià)于它
docker pull mysql
docker pull dokcer.io/library/mysql:latest
# 指定版本下載
docker pull mysql:5.7
docker rmi 刪除鏡像
# docker rmi -f 鏡像id # 刪除指定的鏡像
# docker rmi -f 鏡像id 鏡像id 鏡像id # 刪除多個(gè)鏡像
# docker rmi -f $(dokcer images -aq) # 刪除全部的鏡像
容器命令
說(shuō)明:我們有了鏡像才可以創(chuàng)建容器嗤无,下載一個(gè)centos來(lái)測(cè)試學(xué)習(xí)
docker pull centos
新建容器并啟動(dòng)
docker run [可選參數(shù)] image
# 參數(shù)說(shuō)明
--name="Name" 容器名字 用來(lái)區(qū)分容器
-d 后臺(tái)方式運(yùn)行
-it 使用交互方式運(yùn)行震束,進(jìn)入容器查看內(nèi)容
-p 指定容器的端口 -p 8080:8080
-P ip:主機(jī)端口:容器端口
-p 主機(jī)端口:容器端口 (常用)
-p 容器端口
容器端口
-P 隨機(jī)指定端口
# 測(cè)試,啟動(dòng)并進(jìn)入容器
docker run -it centos /bin/bash
ls # 查看容器內(nèi)的centos当犯,基礎(chǔ)版本垢村,很多命令都是不完善的
exit # 從容器中退回主機(jī)
列出所有的運(yùn)行的容器
# docker ps 命令
# 列出當(dāng)前正在運(yùn)行的容器
-a # 列出當(dāng)前正在運(yùn)行的容器+帶出歷史運(yùn)行過(guò)的容器
-n=? # 顯示最近創(chuàng)建的容器
-q # 之顯示容器的編號(hào)
docker ps
docker ps -a
退出容器
exit # 直接容器停止并推出
Ctrl + P +Q # 容器不停止退出
刪除容器
docker rm 容器id # 刪除指定的容器,不能刪除正在運(yùn)行的容器灶壶,如果要強(qiáng)制刪除 rm -f
docker rm -f $(docker ps -aq) # 刪除所有的容器
docker ps -a -q|xargs docker rm # 刪除所有的容器
啟動(dòng)和停止容器的操作
docker start 容器id # 啟動(dòng)容器
docker restart 容器id # 重啟容器
docker stop 容器id # 停止當(dāng)前正在運(yùn)行的容器
docker kill 容器id # 強(qiáng)制停止當(dāng)前容器
常用其他命令
后臺(tái)啟動(dòng)容器
# 命令 docker run -d 鏡像名
docker run -d centos
# 問(wèn)題docker ps 發(fā)現(xiàn)centos停止了
# 常見(jiàn)的坑:docker 容器使用后臺(tái)運(yùn)行肝断,就必須要有一個(gè)前臺(tái)進(jìn)程,docker發(fā)現(xiàn)沒(méi)有應(yīng)用驰凛,就會(huì)自動(dòng)停止
# nginx 容器啟動(dòng)后胸懈,發(fā)現(xiàn)自己沒(méi)有提供服務(wù),就會(huì)立刻停止恰响,就是沒(méi)有程序了
查看日志
# docker logs -f -t --tail 條數(shù) 容器id
# 顯示日志
-tf # 顯示日志
--tail number # 要顯示日志條數(shù)
docker logs -tf --tail 10 dce7b86171bf
查看容器中進(jìn)程信息
# 命令 docker top 容器id
docker top dce7b86171bf
查看鏡像的元數(shù)據(jù)
# docker inspect 容器id
docker inspect dce7b86171bf
進(jìn)入當(dāng)前正在運(yùn)行的容器
# 我們通常都是使用后臺(tái)方式運(yùn)行的 需要進(jìn)入容器趣钱,修改一些配置
# 命令
# docker exec -it 容器id bashShell
docker exec -it dce7b86171bf /bin/bash
# 方式2
# docker attach 容器id
docker attach dce7b86171bf
# docker exec # 進(jìn)入容器后開(kāi)啟一個(gè)新的終端,可以在里面操作(常用)
# docker attach # 進(jìn)入容器正在執(zhí)行的終端胚宦,不會(huì)啟動(dòng)新的進(jìn)程
從容器內(nèi)拷貝文件到宿主機(jī)上
# docker cp 容器id:容器內(nèi)路徑 目的地主機(jī)路徑
docker cp dce7b86171bf:/home/test.html /home
# 拷貝是一個(gè)手動(dòng)過(guò)程首有,我們以后會(huì)使用數(shù)據(jù)卷的技術(shù)來(lái)實(shí)現(xiàn)
# docker cp 容器id:容器內(nèi)路徑 目的地主機(jī)路徑
docker cp dce7b86171bf:/home/test.html /home
# 拷貝是一個(gè)手動(dòng)過(guò)程,我們以后會(huì)使用數(shù)據(jù)卷的技術(shù)來(lái)實(shí)現(xiàn)
commit鏡像
docker commit 提交一個(gè)容器成為一個(gè)新的副本
# 命令和git原理類似
docker commit -m="提交的描述信息" -a="作者" 容器id 目的鏡像名:[TAG]
容器數(shù)據(jù)卷
什么是容器數(shù)據(jù)卷
docker就是將應(yīng)用和環(huán)境打包成一個(gè)鏡像枢劝。
如果數(shù)據(jù)都在容器中井联,那么我們的容器刪除,數(shù)據(jù)就會(huì)丟失您旁! 需求:數(shù)據(jù)可以持久化
比如以mysql為例烙常,如果mysql容器刪了,等于就是刪庫(kù)跑路了鹤盒,需求:mysql數(shù)據(jù)可以存儲(chǔ)在本地
容器之間可以有一個(gè)數(shù)據(jù)共享的技術(shù)蚕脏!docker容器中產(chǎn)生的數(shù)據(jù)侦副,同步到本地
這就是卷技術(shù),就是目錄的掛載驼鞭,將我們?nèi)萜鲀?nèi)的目錄秦驯,掛載在Linux上面
總結(jié):容器的持久化和同步操作!容器間也是可以數(shù)據(jù)共享的
使用數(shù)據(jù)卷
方式一:直接使用命令來(lái)掛載 -v
docker run -it -v 宿主機(jī)目錄:容器內(nèi)目錄
# 測(cè)試
docker run -it -v /home/ceshi:/home centos /bin/bash
# 啟動(dòng)起來(lái)時(shí)候我們可以通過(guò) docker inspect 容器id
# 假如我們將容器刪除挣棕,發(fā)現(xiàn)译隘,我們掛載都本地的數(shù)據(jù)卷依舊沒(méi)有丟失,這就實(shí)現(xiàn)了容器數(shù)據(jù)持久化功能
具名掛載和匿名掛載
# 匿名掛載
-v 容器內(nèi)路徑
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情況
docker volume ls
# 這里發(fā)現(xiàn)穴张,這種就是匿名掛載细燎,我們?cè)?v 只寫了容器內(nèi)的路徑,沒(méi)有寫容器外的路徑
# 具名掛載
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls
# 通過(guò)-v 卷名:容器內(nèi)路徑
# 查看一下這個(gè)卷
docker volume inspect juming-nginx
所有的docker容器內(nèi)的卷皂甘,沒(méi)有指定目錄的情況下都是在/var/lib/docker/volumes/xxx/_data
我們通過(guò)具名掛載可以方便的找到我們的一個(gè)卷玻驻,大多數(shù)情況在使用的具名掛載
# 如何確定是具名掛載還是匿名掛載,還是指定路徑掛載
-v 容器內(nèi)路徑 # 匿名掛載
-v 卷名:容器內(nèi)路徑 # 具名掛載
-v /宿主機(jī)路徑:容器內(nèi)路徑 # 指定路徑掛載
擴(kuò)展:
通過(guò) -v 容器內(nèi)路徑 ro rw 改變讀寫權(quán)限
ro readonle # 只讀
rw readwrite # 可讀可寫
# 一旦這個(gè)設(shè)置了容器權(quán)限偿枕,容器對(duì)我們掛載出來(lái)的內(nèi)容就有限定了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就說(shuō)明這個(gè)路徑只能通過(guò)宿主機(jī)來(lái)操作璧瞬,容器內(nèi)部是無(wú)法操作的
# 默認(rèn)是rw