一、安裝docker
#加載docker-ce鏡像源并安裝docker
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl start docker
docker run hello-world
#配置鏡像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://3q8h3768.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker run hello-world
二、常用命令
1.幫助啟動(dòng)類命令
啟動(dòng)docker: systemctl start docker
停止docker: systemctl stop docker
重后docker: systemctl restart docker
查看docker狀態(tài): systemctl status docker
開(kāi)機(jī)啟動(dòng): systemctl enable docker
查看docker概要信息:docker info
查看docker總體幫助文檔: docker --help
查看docker命令幫助文檔:docker 具體命令 --help
2.鏡像命令
①docker images:列出本地主機(jī)上的鏡像
-a:列出本地所有的鏡像
-q :只顯示鏡像ID
②docker search 某個(gè)xxx鏡像名字:云端鏡像查找
#--limit:只列出N個(gè)鏡像,默認(rèn)25個(gè)
docker search --limit 5 redis
③docker pull 鏡像名字:下載鏡像
docker pull 某個(gè)xxx鏡像名字
docker pull 鏡像名字[:TAG] #(TAG版本號(hào),不寫默認(rèn)latest)
④docker system df查看鏡像/容器/數(shù)據(jù)卷所占的空間
⑤docker rmi 某個(gè)xxx鏡像名字ID:刪除鏡像
-f 強(qiáng)制刪除
docker rmi -f 鏡像ID #刪除單個(gè)
docker rmi-f 鏡像名1:TAG 鏡像名2:TAG #刪除多個(gè)
docker rmi -f $(docker images) -qa #刪除全部
面試題:
談?wù)刣ocker虛懸鏡像是什么?
答:倉(cāng)庫(kù)名、標(biāo)簽都是<none>的鏡像,俗稱虛懸鏡像dangling image
后續(xù)Dockerfile章節(jié)再介紹
如何查看當(dāng)前機(jī)器下有多少個(gè)容器,多少個(gè)鏡像?
答:docker system df
3.容器命令
①新建+啟動(dòng)容器:docker run [OPTIONS]IMAGE[COMMAND][ARG...]
OPTIONS說(shuō)明(常用)
--name="容器新名字"
為容器指定一個(gè)名稱;
-d:后臺(tái)運(yùn)行容器并返回容器D,也即啟動(dòng)守護(hù)式容器(后臺(tái)運(yùn)行):
-i:以交互模式運(yùn)行容器,通常與t同時(shí)使用 #interactive
-t:為容器重新分配一個(gè)偽輸入終端,通常與-ⅰ同時(shí)使用;也即啟動(dòng)交互式容器(前臺(tái)有偽終端,等待交互) #tty
-P:隨機(jī)端口映射,大寫P
-p:指定端口映射,小寫p
②啟動(dòng)交互式容器(前臺(tái)命令行)
docker run -it centos /bin/bash
參數(shù)說(shuō)明:
-i: 交互式操作。
-t: 終端。
centos:centos 鏡像。
/bin/bash: 放在鏡像名后的是命令,這里我們希望有個(gè)交互式 Shell,因此用的是/bin/bash。
要退出終端,直接輸入 exit
③列出當(dāng)前所有正在運(yùn)行的容器:docker ps
④退出容器
exit
run進(jìn)去容器,exit退出,容器停止run進(jìn)去容器
ctrl+p+q退出,容器不停止
⑥啟動(dòng)己停止運(yùn)行的容器:docker start 容器id或者容器名
⑦重啟容器:docker restart 容器id或者容器名
⑧停止容器:docker stop 容器id或者容器名
⑨強(qiáng)制停止容器:docker kill 容器id或者容器名
⑩刪除己停止的容器:docker rm 容器id或者容器名
#強(qiáng)制刪除所有容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
重要
①啟動(dòng)守護(hù)式容器(后臺(tái)服務(wù)器):docker run -d redis
若使用-d開(kāi)啟centos會(huì)自動(dòng)秒關(guān)閉,因?yàn)闆](méi)有前臺(tái)守護(hù)進(jìn)程,redis則有
②查看容器日志:docker logs 容器id
③查看容器內(nèi)運(yùn)行的進(jìn)程:docker top 容器
④查看容器內(nèi)部細(xì)節(jié):docker inspect 容器,可以查看容器數(shù)據(jù)卷掛載信息
⑤進(jìn)入正在運(yùn)行的容器并以命令行交互docker exec -it 容器ID /bash/shell
重新進(jìn)入docker attach 容器ID
上述兩個(gè)區(qū)別
attach 直接進(jìn)入容器啟動(dòng)命令的終端,不會(huì)啟動(dòng)新的進(jìn)程用exit退出,會(huì)導(dǎo)致容器的停止。
exec 是在容器中打開(kāi)新的終端,并且可以啟動(dòng)新的進(jìn)程用exit退出,不會(huì)導(dǎo)致容器的停止。
推薦大家使用 docker exec 命令,因?yàn)橥顺鋈萜鹘K端,不會(huì)導(dǎo)致容器的停止
進(jìn)入redis容器
docker exec-it 容器ID /bin/bash
docker exec-it 容器ID redis-cli
一般用-d后臺(tái)啟動(dòng)的程序,再用exec進(jìn)入對(duì)應(yīng)容器實(shí)例

⑥從容器內(nèi)拷貝文件到主機(jī)上:docker cp 容器ID:容器內(nèi)路徑目的主機(jī)路徑
⑦導(dǎo)入和導(dǎo)出容器:
export 導(dǎo)出容器的內(nèi)容留作為一個(gè)tar歸檔文件[對(duì)應(yīng)import命令]
import 從tar包中的內(nèi)容創(chuàng)建一個(gè)新的文件系統(tǒng)再導(dǎo)入為鏡像[對(duì)應(yīng)export]
docker export 容器ID>文件名.tar
cat 文件名.tar | docker import - 鏡像用戶/鏡像名:鏡像版本號(hào)
4.自定義鏡像
1.安裝自定義軟件
agt-get update
apt-get -y install vim
2.封裝為鏡像
docker commit -m="備注內(nèi)容" -a="作者" 容器id 構(gòu)建的鏡像名稱:[標(biāo)簽名]
[root@lizj ~]# docker commit -m="vim cmd add ok" -a=" lizj" c1839f522391 atlizj/
sha256:741af495beca86a010862bddbcc852c4c4cc22ca2814b931095d41d2a43d8d65
3.鏡像發(fā)布到阿里云容器鏡像服務(wù)
命名空間>鏡像倉(cāng)庫(kù)
① 登錄阿里云Docker Registry
$ docker login --username=lzj952809310 registry.cn-hangzhou.aliyuncs.com
用于登錄的用戶名為阿里云賬號(hào)全名,密碼為開(kāi)通服務(wù)時(shí)設(shè)置的密碼。
您可以在訪問(wèn)憑證頁(yè)面修改憑證密碼。
②從Registry中拉取鏡像
$ docker pull registry.cn-hangzhou.aliyuncs.com/atlizj/mycentos:[鏡像版本號(hào)]
③將鏡像推送到Registry
$ docker login --username=lzj952809310 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/atlizj/mycentos:[鏡像版本號(hào)]
$ docker push registry.cn-hangzhou.aliyuncs.com/atlizj/mycentos:[鏡像版本號(hào)]
請(qǐng)根據(jù)實(shí)際鏡像信息替換示例中的[ImageId]和[鏡像版本號(hào)]參數(shù)。
3.構(gòu)建本地私有倉(cāng)庫(kù)
docker pull registry
docker run -d -p 5000:5000 -v /lizjuse/myregistry/:/tmp/registry --privileged=true registry
-v /lizjuse/myregistry/:/tmp/registry指定目錄。默認(rèn)情況,倉(cāng)庫(kù)被創(chuàng)建在容器的/var/lib/registry目錄下建議自行用容器卷映射,方便于宿主機(jī)聯(lián)調(diào)
查看當(dāng)前本地倉(cāng)庫(kù)下的存儲(chǔ)情況curl -XGET http://172.21.55.100:5000/v2/_catalog
復(fù)制鏡像并修改名稱docker tag 鏡像:Tag Host:Port/Repository:Tag
[root@lizj ~]# docker tag atlizj/myubuntu:1.3 172.21.55.100:5000/myubuntu:1.3
[root@lizj ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
172.21.55.100:5000/myubuntu 1.3 741af495beca About an hour ago 188MB
atlizj/myubuntu 1.3 741af495beca About an hour ago 188MB
registry.cn-hangzhou.aliyuncs.com/atlizj/mycentos 1.3 741af495beca About an hour ago 188MB
取消https限制:
[root@lizj ~]# vim /etc/docker/daemon.json
[root@lizj ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://3q8h3768.mirror.aliyuncs.com"],
"insecure-registries": ["172.21.55.100:5000"]
}
上傳
[root@lizj ~]# docker push 172.21.55.100:5000/myubuntu:1.3 The push refers to repository [172.21.55.100:5000/myubuntu]
130e2e093af5: Pushed
9f54eef41275: Pushed
1.3: digest: sha256:d974a028cd47ddb69094df75e8ebfce6d70e2092600bbdd530af4b69a895de18 size: 741
[root@lizj ~]# curl -XGET http://172.21.55.100:5000/v2/_catalog
{"repositories":["myubuntu"]}
4.容器數(shù)據(jù)卷
指的是服務(wù)器指定文件夾掛載到容器中
docker run -d -p 50 0:5000 -v /lizjuse/myregistry/:/tmp/registry:ro --privileged=true --name u1 registry
docker run -it --privileged=true -v /宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄:讀寫權(quán)限 鏡像名
容器內(nèi)讀寫權(quán)限限制
rw:讀寫(默認(rèn))、ro:read only只讀
Docker掛載主機(jī)目錄訪問(wèn)如果出現(xiàn)cannot open directory.: Permission denied
解決辦法: 在掛載目錄后多加一個(gè)--privileged=true參數(shù)即可
不同容器的數(shù)據(jù)卷的繼承:docker run -it --privileged=true -- volumes- from u1 --name u2 ubuntu
三、理論知識(shí)
1.解析hello-world鏡像運(yùn)行
[root@lizj ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
步驟如下:
1.查找是否有hello-world鏡像,無(wú)則下載,有則運(yùn)行為容器
2.運(yùn)行結(jié)束后關(guān)閉hello-world鏡像容器

2.容器比虛擬化快的原因
(1)docker有著比虛擬機(jī)更少的抽象層
由于docker不需要Hypervisor(虛擬機(jī))實(shí)現(xiàn)硬件資源虛擬化,運(yùn)行在docker容器上的程序直接使用的都是實(shí)際物理機(jī)的硬件資源因此在CPU、內(nèi)存利用率上docker將會(huì)在效率上有明顯優(yōu)勢(shì)。
(2)docker利用的是宿主機(jī)的內(nèi)核,而不需要加載操作系統(tǒng)OS內(nèi)核
當(dāng)新建一個(gè)容器時(shí),docker不需要和虛擬機(jī)一樣重新加載一個(gè)操作系統(tǒng)內(nèi)核。進(jìn)而避免引尋、加載操作系統(tǒng)內(nèi)核返回等比較費(fèi)時(shí)費(fèi)資源的過(guò)程,當(dāng)新建一個(gè)虛擬機(jī)時(shí),虛擬機(jī)軟件需要加載OS,返回新建過(guò)程是分鐘級(jí)別的。而docker由于直接利用宿主機(jī)的操作系統(tǒng),則省略了返回過(guò)程.因此新建一個(gè)docker突器只需要幾秒鐘。

3.鏡像
①UnionFS(聯(lián)合文件系統(tǒng)):分層、輕量、可聚合的鏡像基礎(chǔ),支持對(duì)文件系統(tǒng)的修改作為一次疊加來(lái)一層層提交。
②鏡像加載原理:一層層的文件系統(tǒng)組成(UnionFS)
docker鏡像層只是可讀的,容器層是可寫的。當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層(rootfs)”
4.面試題
①談?wù)刣ocker虛懸鏡像是什么?
答:倉(cāng)庫(kù)名、標(biāo)簽都是<none>的鏡像,俗稱虛懸鏡像dangling image
②如何查看當(dāng)前機(jī)器下有多少個(gè)容器,多少個(gè)鏡像?
答:docker system df
③進(jìn)入真正在運(yùn)行的容器的兩種方式是什么?區(qū)別是什么?一般用哪個(gè)?
答:docker exec -it 容器ID /bash/shell和docker attach 容器ID
attach 直接進(jìn)入容器啟動(dòng)命令的終端,不會(huì)啟動(dòng)新的進(jìn)程用exit退出,會(huì)導(dǎo)致容器的停止。
exec 是在容器中打開(kāi)新的終端,并且可以啟動(dòng)新的進(jìn)程用exit退出,不會(huì)導(dǎo)致容器的停止。
推薦大家使用 docker exec 命令,因?yàn)橥顺鋈萜鹘K端,不會(huì)導(dǎo)致容器的停止。