Docker是可以將任何應(yīng)用包裝在Linux Contain中運行的工具,基于Docker的沙箱環(huán)境可以實現(xiàn)輕型隔離,多個容器之間不會相互影響,Docker可以實現(xiàn)自動化打包和部署任何應(yīng)用,方便的創(chuàng)建一個輕量級私有Pass云,也困意用于搭建開發(fā)測試環(huán)境以及部署可擴(kuò)展的Web應(yīng)用。
docker結(jié)構(gòu)
dockerFile:docker鏡像通過該配置文件進(jìn)行配置
倉庫:用來存儲docker鏡像,已經(jīng)弄好的鏡像文件
鏡像:一個可以運行的程序
容器:一個已經(jīng)跑起來的實例
tar文件:一個鏡像可以保存為tar文件

Docker和VM
VM是一個運行在宿主之上的完整的操作系統(tǒng),VM運行自身操作系統(tǒng)會占用較多的CPU,內(nèi)存和硬盤資源。
Docker只包含應(yīng)用程序以及依賴庫,基于libContainer運行在宿主機上,并處于一個隔離的環(huán)境,使得Docker更加輕量高效,啟動容器只需幾秒之內(nèi)完成,由于Docker輕量資源占用少,使得Docker可以輕易的應(yīng)用到構(gòu)建標(biāo)準(zhǔn)化的應(yīng)用中,但是Docker目前還不夠完善,比如隔離效果不如VM,共享主機操作系統(tǒng)的基礎(chǔ)庫,網(wǎng)絡(luò)配置簡單,主要以橋接的方式為主,查看日志也不方便
橋接:SOI模型中數(shù)據(jù)鏈路層的數(shù)據(jù)交換
Docker網(wǎng)絡(luò)
Docker的網(wǎng)絡(luò)功能相對簡單,沒有過多復(fù)雜的配置,Docker默認(rèn)使用birdge橋接方式與容器通信,啟動Docker后,宿主機上會產(chǎn)生Docker0這樣一個虛擬網(wǎng)絡(luò)接口, docker0不是一個普通的網(wǎng)絡(luò)接口, 它是一個虛擬的以太網(wǎng)橋,可以為綁定到docker0上面的網(wǎng)絡(luò)接口自動轉(zhuǎn)發(fā)數(shù)據(jù)包,這樣可以使容器與宿主機之間相互通信。每次Docker創(chuàng)建一個容器,會產(chǎn)生一對虛擬接口,在宿主機上執(zhí)行ifconfig,會發(fā)現(xiàn)多了一個類似veth***這樣的網(wǎng)絡(luò)接口,它會綁定到docker0上,由于所有容器都綁定到docker0上,容器之間也就可以通信。
在宿主機上執(zhí)行ifconfig,會看到docker0這個網(wǎng)絡(luò)接口, 啟動一個container,再次執(zhí)行ifconfig, 會有一個類似veth**的interface,每個container的缺省路由是宿主機上docker0的ip,在container中執(zhí)行netstat -r**可以看到如下圖所示內(nèi)容:

dokcer設(shè)置
systemctl enable docker.service //設(shè)置開機啟動
systemctl disable docker.service //關(guān)閉開機啟動
systemctl start docker //啟動docker
systemctl daemon-reload //重新加載deamon.json配置文件
systemctl restart docker //重新啟動
dokcer systemctl status docker //查看docker運行狀態(tài)
啟動docker
service docker start //docker啟動
service docker stop //docker停止
service docker restart //docker重啟
問題:docker start 啟動不了 Failed to start Docker Application Container Engine
一般是 docker的 daemon.json 文件的問題改完后systemctl daemon-reload 在啟動
docker命令補全
yum -y install bash-completion
source /usr/share/bash-completion /bash_completion
Docker使用
docker版本查看
docker version
查看當(dāng)前系統(tǒng)信息
docker info
查看docker宿主機上的鏡像 鏡像保存在var/lib/docker目錄下
docker image
查找鏡像
docker search +名稱

NAME: 鏡像倉庫源的名稱
DESCRIPTION: 鏡像的描述
OFFICIAL: 是否 docker 官方發(fā)布
stars: 類似 Github 里面的 star,表示點贊、喜歡的意思。
AUTOMATED: 自動構(gòu)建
從docker hub上下載某個鏡像
docker pull 名字:版本
這樣就會把鏡像下載到本地倉庫
docker導(dǎo)入鏡像
docker load -i + 鏡像的tar包
docker查看鏡像
docker images //查找某些
docker images | grep +鏡像名
啟動一個容器
//啟動一個容器
docker run -i -t 名稱 /bin/bash
//退出后立即刪除該容器
docker run -i -t --rm ubuntu /bin/bash
//--name執(zhí)行容器名稱,否則會隨機分配一個名稱
docker run -t -i --name test_container 名稱 /bin/bash
//端口映射
dokcer run -d -p 本地端口:容器端口 +容器名
docker run -d -P + 容器名 隨機端口映射
docker run -i -t +容器 +交互命令
-i: 交互式操作。
-t: 終端
-d :讓容器在后臺運行
-p:指定端口
-P:將容器內(nèi)部使用的網(wǎng)絡(luò)端口隨機映射到我們使用的主機上
docker run -d -P +容器 +
#例子
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-v 為掛載目錄和被掛載目錄
--restart 失敗后重啟
docker run --name mysql5.7.25 --restart=always -v /data/nfs/privtorrent/mysql:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=blockchain -d mysql:5.7.25
查看容器(可以看端口映射情況)
docker ps //只能看見啟動的容器
docker ps -a //查看所有容器(啟動和關(guān)閉的容器都能看見)
啟動或者停止某個Container
docker start/stop + 容器id
docker進(jìn)入容器(exit退出)
(不建議使用)
docker attach + 容器id
docker -it exec + 容器id +/bin/bash (或 sh 或bash)三選一·
將當(dāng)前容器作為一個新的容器進(jìn)行提交
docker commit -m =" " 容器id
停止正在運行的容器
docker stop docker stop $(docker ps -aq) //停止正在運行的所有容器
重新啟動容器(不會改變?nèi)萜鱥d)
docker restart +容器id
刪除已經(jīng)停止的容器
dokcer rm + 容器id(前幾位即可)
//刪除停止運行的所有容器 -q 顯示容器id
docker rm $(docker ps -aq)
//強制刪除容器
docker rm -f + 容器id(前幾位即可)
刪除鏡像
docker rmi + 鏡像id
//強制刪除容器
docker rmi -f + 鏡像id
//強制刪除鏡像
docker rmi -f $(docker images|grep +指定哪些鏡像)
查看運行容器的日志
docker logs + 容器名
//實時輸出
docker logs -f+ 容器名
導(dǎo)出鏡像
docker save + 容器id > 名稱.tar
導(dǎo)出容器
docker exoprt + 運行容器id > 名稱.tar
導(dǎo)入容器快照
cat docker/容器名.tar | docker import - +容器名:標(biāo)簽
docker import + 目錄或者url
查看容器運行端口
docker port + 容器名/容器Id
改變?nèi)萜髅Q及標(biāo)簽
docker tag 容器名:tag/容器id 容器名:tag
新建網(wǎng)絡(luò)
docker network create -d bridge + 名稱
docker network ls 查看網(wǎng)絡(luò)情況
-d:參數(shù)指定 Docker 網(wǎng)絡(luò)類型,有 bridge、overlay
登錄自己的倉庫
//登錄
docker login
//登出
docker logout
構(gòu)建自己私有倉庫
https://www.cnblogs.com/edisonchou/p/docker_registry_repository_setup_introduction.html
#下載Registry鏡像并啟動
docker pull registry
(這個就相當(dāng)于啟動一個倉庫,別人訪問需要在daemon文件中配置即可拉取你的鏡像
docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name xdp-registry registry
#在客戶端查看鏡像倉庫中的所有鏡像
curl http://your-server-ip:5000/v2/_catalog
/etc/docker/daemon.json加上下面這一句,這里的"your-server-ip"請換為你的服務(wù)器的外網(wǎng)IP地址:
{
"insecure-registries" : [ "your-server-ip:5000" ]
}
為要上傳的鏡像打Tag
docker push your-registry-server-ip:5000/your-image-name:tagname
下載鏡像就很簡單了,使用pull命令即可:
docker pull your-server-ip:5000/your-image-name:tagname
如果想要知道要下載的鏡像都有哪些tag(或版本),可以通過下面這個api來獲?。?/p>
curl http://your-server-ip:5000/v2/your-image-name/tags/list
docker通過DockerFile創(chuàng)建容器
docker build -f + 文件 -t + 打包的鏡像名 .(表示當(dāng)前目錄)
docker 啟動鏡像
docker run -itd-p(端口映射) 主機端口:鏡像內(nèi)部端口 鏡像名
docker 查看容器掛載目錄
docker inspect +容器id 獲取容器/鏡像的元數(shù)據(jù)
docker inspect +容器ID|grep Mounts -A 20
docker復(fù)制文件
docker cp 容器Id:/etc/mysql/my.cnf(容器目錄) .(當(dāng)前目錄)
docker下的文件夾信息(var/lib/docker)
---containers : 存放容器信息
---images :存放鏡像的中間件信息大小以及依賴信息
---volumes :docker的掛載信息
---overlay2
--
--diff 存放docker容器內(nèi)的文件信息
下面是存放在容器內(nèi)部的信息

docker掛載問題
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused “process_linux.go:430: container init caused “write /proc/self/attr/keycreate: permission denied””: unknown.
修改文件/etc/selinux/config 將SELINUX屬性改為disabled 重啟即可
