為了實(shí)現(xiàn)容器與主機(jī)之間、容器與容器之間共享文件,容器中數(shù)據(jù)的持久化,將容器中的數(shù)據(jù)備份、遷移、恢復(fù)等,Docker加入了數(shù)據(jù)卷(volumes)機(jī)制。簡(jiǎn)單的講,就是做了一個(gè)文件夾的實(shí)時(shí)共享,有點(diǎn)像局域網(wǎng)的文件共享。
目前Docker提供了三種不同的方式將數(shù)據(jù)從宿主機(jī)掛載到容器中:bind mounts、tmpfs mounts、Volumes三種方式。其實(shí)嚴(yán)格來(lái)講tmpfs mounts不會(huì)掛載到宿主機(jī)上的。下面有講解。
2.1、方式一:bind mounts
意為著可以存儲(chǔ)在宿主機(jī)系統(tǒng)的任意位置。
但是,bind mount在不同的宿主機(jī)系統(tǒng)時(shí)不可移植的,比如Windows和Linux的目錄結(jié)構(gòu)是不一樣的,bind mount所指向的host目錄也不能一樣。這也是為什么bind mount不能出現(xiàn)在Dockerfile中的原因,因?yàn)檫@樣Dockerfile就不可移植了。
2.3、方式三:volumes
Docker管理宿主機(jī)文件系統(tǒng)的一部分,默認(rèn)位于 /var/lib/docker/volumes 目錄中;最常用的方式。
2.3、方式二:tmpfs mounts
其中tmpfs是一種基于內(nèi)存的臨時(shí)文件系統(tǒng)。tmpfs mounts掛載存儲(chǔ)在宿主機(jī)系統(tǒng)的內(nèi)存中,而不會(huì)寫(xiě)入宿主機(jī)的文件系統(tǒng)。
三種方式掛載圖解
2.1、示例講解
這里指定了將宿主機(jī)上的 /opt/wwwroot目錄掛載到/usr/share/nginx/html
$ mkdir -p /opt/wwwroot
$ docker run -itd --name=nginx-v1 -v /opt/wwwroot:/usr/share/nginx/html nginx
-v指定具體路徑,如果不指定,那就在默認(rèn)路徑下/var/lib/docker/volumes/目錄下隨機(jī)產(chǎn)生一個(gè)掛載目錄
可以看到,bind mounts的方式會(huì)隱藏掉被掛載目錄里面的初始內(nèi)容,這里是/usr/share/nginx/html目錄下的內(nèi)容被隱藏掉了,因此我們看不到。
然后我們創(chuàng)建新文件,就可以在容器里看到新創(chuàng)建的文件了。
宿主機(jī):
容器里
2.2、查看容器詳情,就可以看到我們綁定的路徑
$ docker inspect nginx-v1
2.3、清理
$ docker stop nginx-v1
$ docker rm nginx-v1
# 查看掛在目錄
$ ll /opt/wwwroot/
通過(guò)圖上所示,掛載目錄里面的文件仍然還在,不會(huì)隨著容器的結(jié)束而消失,從而實(shí)現(xiàn)數(shù)據(jù)持久化。
4.1、管理卷
# 創(chuàng)建一個(gè)自定義容器卷,在/var/lib/docker/volumes/目錄下創(chuàng)建
$ docker volume create nginx-vol1
# 查看所有容器卷
$ docker volume ls
# 查看指定容器卷詳情信息
$ docker volume inspect nginx-vol1
4.2、創(chuàng)建使用指定卷的容器
有了自定義容器卷,我們可以創(chuàng)建一個(gè)使用這個(gè)數(shù)據(jù)卷的容器,這里我們以nginx為例:
$ docker run -itd --name=nginx-v1 -p 8080:80 -v nginx-vol1:/usr/share/nginx/html nginx
其中,-v代表掛載數(shù)據(jù)卷,這里使用自定數(shù)據(jù)卷nginx-vol1,并且將數(shù)據(jù)卷掛載到 /usr/share/nginx/html。
與bind mounts的區(qū)別在于不用自己創(chuàng)建目錄,只有創(chuàng)建卷就行,卷其實(shí)也是目錄,還有一點(diǎn)volumes就是可以查看/usr/share/nginx/html自帶文件。
4.3、如果不加-v,則不會(huì)在默認(rèn)路徑下掛載目錄
$ docker run -itd --name=nginx-v2 -p 8081:80 nginx
$ ls -l /var/lib/docker/volumes/
4.3、如果加-v,但是不指定宿主機(jī)的掛載目錄,則會(huì)自動(dòng)創(chuàng)建一個(gè)隨機(jī)的掛載目錄,這種方式是bind mounts,也看不到默認(rèn)文件
$ docker run -itd --name=nginx-v4 -p 8084:80 -v :/usr/share/nginx/html nginx
4.4、刪除容器
$ docker stop nginx-v1
$ docker rm nginx-v1
數(shù)據(jù)也不會(huì)因?yàn)槿萜鞅粍h除而刪除,達(dá)到數(shù)據(jù)持久化的效果。
高于17.06的docker可以將--mount用于為單一容器創(chuàng)建數(shù)據(jù)卷,兩者的差別如下:
5.1、-v或是-volume包括三個(gè)區(qū)域,以分號(hào)分割
5.2、-mount使用鍵值對(duì)=,以逗號(hào)分割,對(duì)應(yīng)的值如下
-mount參數(shù)的值用單引號(hào)包含起來(lái),將關(guān)鍵字對(duì)應(yīng)值中出現(xiàn)的volume-opt用雙引號(hào)括起來(lái),如下:
$ docker service create \
--mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
--name myservice \
<IMAGE>
5.2、-v與-mount的區(qū)別
-mount可以支持創(chuàng)建集群服務(wù)的數(shù)據(jù)卷,而-v不行,其余基本沒(méi)差;怎么創(chuàng)建集群的話(huà),會(huì)面寫(xiě)docker swarm會(huì)講到。
5.3、創(chuàng)建、查看、刪除數(shù)據(jù)卷:
# 創(chuàng)建實(shí)名數(shù)據(jù)卷
$ docker volume create my-vol
# 創(chuàng)建匿名卷
$ docker volume create
# 查看數(shù)據(jù)卷列表
$ docker volume ls
# 查看具體的數(shù)據(jù)卷
$ docker volume inspect my-vol
# 刪除數(shù)據(jù)卷
$ docker volume rm my-vol
5.4、示例,數(shù)據(jù)卷會(huì)自動(dòng)創(chuàng)建
1)在創(chuàng)建容器時(shí)指定數(shù)據(jù)卷
# 創(chuàng)建容器
$ docker run -d \
--name devtest \
--mount source=myvol1,target=/usr/share/nginx/html \
nginx:latest
2)使用只讀數(shù)據(jù)卷
#ro表示只讀(readonly),-v==--mount
$ docker run -d \
--name=nginxtest \
-v nginx-vol:/usr/share/nginx/html:ro \
nginx:latest
# 等價(jià)于下面命令
$ docker run -d \
--name=nginxtest2 \
--mount source=nginx-vol2,destination=/usr/share/nginx/html,readonly \
nginx:latest
5.5、刪除數(shù)據(jù)卷
$ docker volume ls
$ docker volume rm nginx-vol1
$ docker volume ls
# 刪除所有卷,慎用
$ docker volume prune
注意:docker規(guī)定,沒(méi)有容器正在使用數(shù)據(jù)卷后才允許刪除該數(shù)據(jù)卷
如果在 Linux 上運(yùn)行 Docker,那么還有第三種選擇:tmpfs 掛載。不會(huì)持久化到宿主機(jī)。目的是為了避免寫(xiě)入數(shù)據(jù)到容器存儲(chǔ)層還有一個(gè)方案。
與卷和綁定掛載不同,tmpfs 掛載是臨時(shí)的,只存留在主機(jī)內(nèi)存中。當(dāng)容器停止時(shí),tmpfs 掛載將被刪除,在那里寫(xiě)入的文件不會(huì)被持久化。
6.1、tmpfs 掛載的局限性
6.2、--tmpfs 和 --mount 行為之間的差異
6.3、在容器中使用 tmpfs 掛載
要在容器中使用 tmpfs 掛載, 請(qǐng)使用 --tmpfs 標(biāo)記, 或者使用帶有 type=tmpfs 和 destination 選項(xiàng)的 --mount 標(biāo)記。沒(méi)有用于 tmpfs 掛載的源(source)。
示例1:(--mount),在 Nginx 容器中的 /usr/share/nginx/html 創(chuàng)建一個(gè) tmpfs 掛載
$ docker run -d \
-it \
--name tmptest \
--mount type=tmpfs,destination=/usr/share/nginx/html \
nginx:latest
$ docker exec -it tmptest /bin/bash
$ df -h
示例2:(--tmpfs)
$ docker run -d \
-it \
--name tmptest2 \
--tmpfs /usr/share/nginx/html \
nginx:latest
通過(guò)運(yùn)行 docker inspect tmptest 來(lái)驗(yàn)證掛載是否是 tmpfs 掛載,查看 Mounts 部分:
$ docker inspect tmptest|grep -i -C3 Tmpfs
6.4、指定 tmpfs 選項(xiàng)
tmpfs 掛載允許兩個(gè)配置選項(xiàng),兩個(gè)選項(xiàng)都不是必需的。 如果需要指定這些選項(xiàng),則必須使用 --mount 標(biāo)記,因?yàn)?--tmpfs 標(biāo)記不支持。
tmpfs-size tmpfs 掛載的大小(以字節(jié)為單位)。默認(rèn)無(wú)限制。
tmpfs-mode tmpfs 的八進(jìn)制文件模式。例如,700 或 0770。默認(rèn)為 1777 或全局可寫(xiě)。
示例:下面的示例將 tmpfs-mode 設(shè)置為 1770,因此在容器中它不是全局可讀的。
小伙伴兒們,如果覺(jué)得文章干貨滿(mǎn)滿(mǎn),歡迎加入公眾號(hào)【編程識(shí)堂】,更多干貨等著你們來(lái)哦!
docker官網(wǎng)命令
地址
Docker環(huán)境信息 — docker [info|version]
容器生命周期管理 — docker
[create|exec|run|start|stop|restart|kill|rm|pause|unpause]
容器操作管理 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]
容器rootfs命令 — docker [commit|cp|diff]
鏡像倉(cāng)庫(kù) — docker [login|pull|push|search]
本地鏡像管理 — docker [build|images|rmi|tag|save|import|load]
容器資源管理 — docker [volume|network]
系統(tǒng)日志信息 — docker [events|history|logs]
阿里云開(kāi)發(fā)者平臺(tái)
開(kāi)發(fā)者平臺(tái)官網(wǎng)地址:可以參考阿里云官網(wǎng)提供的docker安裝教程進(jìn)行安裝。
https://www.aliyun.com/
安裝docker前置條件
yum install -y yum-utils device-mapper-persistent-data lvm2
##添加源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
##查看docker版本
yum list docker-ce --showduplicates | sort -r
##安裝最新版:推薦大家安裝最新版本
yum -y install docker-ce
##安裝指定版本:
語(yǔ)法規(guī)則:yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING>
containerd.io
yum -y install docker-ce-18.06.3.ce-3.el7 docker-ce-cli.x86_64
yum install -y docker-ce-19.03.9-3.el7 docker-ce-cli-19.03.9-3.el7
## docker降級(jí)操作,20.10降級(jí)到19.03版本
yum downgrade --setopt=obsoletes=0 -y docker-ce-19.03.13-3.el7 docker-ce-cli-19.03.13-3.el7 containerd.io
##開(kāi)啟dock而服務(wù)
systemctl start docker
systemctl status docker
##安裝阿里云鏡像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://復(fù)制自己的加速器地址.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
##官網(wǎng)鏡像地址
https://hub.docker.com/
##拉取鏡像
docker pull centos:7.8.2003
##常用參數(shù)
-a, --all-tags=true|false : ##是否獲取倉(cāng)庫(kù)中所有鏡像,默認(rèn)為否;
--disable-content-trust : ##跳過(guò)鏡像內(nèi)容的校驗(yàn),默認(rèn)為 true;
##images命令
##通過(guò)使用如下兩個(gè)命令,列出本機(jī)已有的鏡像:
docker images
docker image ls
##各個(gè)選項(xiàng)說(shuō)明:
REPOSITORY:表示鏡像的倉(cāng)庫(kù)源
TAG:鏡像的標(biāo)簽
IMAGE ID:鏡像ID
CREATED:鏡像創(chuàng)建時(shí)間
SIZE:鏡像大小
##save命令 將鏡像保存到虛擬機(jī)上,避免docker容器銷(xiāo)毀后,再次下載鏡像速度慢問(wèn)題
mkdir -p /data
cd /data
docker save tomcat:9.0.20-jre8-alpine -o tomcat9.tar
docker save tomcat:9.0.20-jre8-slim > tomcat9.slim.tar
##常用參數(shù)
-o :輸出到的文件
#多個(gè)鏡像
# 推薦開(kāi)發(fā)崗的小伙伴使用idea開(kāi)發(fā)工具中的列編輯模式制作docker save命令
mkdir -p /data
cd /data
docker save \
ubuntu:20.04 \
alpine:3.12.1 \
debian:10.6-slim \
centos:7.8.2003 \
-o linux.tar
docker save \
tomcat:9.0.20-jre8-alpine \
tomcat:9.0.20-jre8-slim \
tomcat:9.0.20-jre8 \
-o tomcat9.0.20.tar
# 將tar 包還原成鏡像 load命令
mkdir -p /data
cd /data
docker load -i linux.tar
docker load < tomcat9.0.20.tar
## 常用參數(shù)
--input , -i : 指定導(dǎo)入的文件。
--quiet , -q : 精簡(jiǎn)輸出信息。
# inspect命令
## 通過(guò) docker inspect 命令,我們可以獲取鏡像的詳細(xì)信息,其中,包括創(chuàng)建者,各層的數(shù)字摘要等。
##docker inspect 返回的是 JSON格式的信息,如果您想獲取其中指定的一項(xiàng)內(nèi)容,可以通過(guò) -f 來(lái)指定,如獲取鏡像大小
docker inspect tomcat:9.0.20-jre8-alpine
docker inspect -f {{".Size"}} tomcat:9.0.20-jre8-alpine
#tag命令
# 標(biāo)記本地鏡像,將其歸入某一倉(cāng)庫(kù)
docker tag tomcat:9.0.20-jre8-alpine test/tomcat:9
## rmi 刪除鏡像
docker rmi tomcat:9.0.20-jre8-alpine
docker image rm tomcat:9.0.20-jre8-alpine
## 常用參數(shù)
-f, -force : 強(qiáng)制刪除鏡像,即便有容器引用該鏡像;
-no-prune : 不要?jiǎng)h除未帶標(biāo)簽的父鏡像;
## 通過(guò)ID刪除鏡像
docker rmi ee7cbd482336
#新建并啟動(dòng)容器
##語(yǔ)法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine
docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine
##常用參數(shù)
docker run命令常用參數(shù)比較多,這里僅僅列出開(kāi)發(fā)崗常用參數(shù),請(qǐng)自行查找資料獲得更多參
數(shù)信息
-d, --detach=false: 后臺(tái)運(yùn)行容器,并返回容器ID
-i, --interactive=false: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用
-P, --publish-all=false: 隨機(jī)端口映射,容器內(nèi)部端口隨機(jī)映射到主機(jī)的端口。不推薦各位小伙伴
使用該參數(shù)
-p, --publish=[]: 指定端口映射,格式為:主機(jī)(宿主)端口:容器端口,推薦各位小伙伴們使用
-t, --tty=false: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用
--name="nginx-lb": 為容器指定一個(gè)名稱(chēng)
-h , --hostname="laosiji": 指定容器的hostname
-e , --env=[]: 設(shè)置環(huán)境變量,容器中可以使用該環(huán)境變量
--net="bridge": 指定容器的網(wǎng)絡(luò)連接類(lèi)型,支持 bridge/host/none/container: 四種類(lèi)型
--link=[]: 添加鏈接到另一個(gè)容器;不推薦各位小伙伴使用該參數(shù)
-v, --volume : 綁定一個(gè)卷
--privileged=false: 指定容器是否為特權(quán)容器,特權(quán)容器擁有所有的capabilities
--restart=no:指定容器停止后的重啟策略
no:容器退出時(shí)不重啟
on-failure:容器故障退出(返回值非零)時(shí)重啟
always:容器退出時(shí)總是重啟,推薦各位小伙伴們使用
--rm=false: 指定容器停止后自動(dòng)刪除容器,不能以docker run -d啟動(dòng)的容器
##容器日志
logs 命令
docker logs -f tomcat9
常用參數(shù)
-f : 跟蹤日志輸出
--tail :僅列出最新N條容器日志
##列出容器
##語(yǔ)法
docker ps [OPTIONS]
docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine
##查看運(yùn)行中的容器
docker ps tomcat9
##查看所有容器
docker ps -a tomcat9
##輸出詳情介紹:
CONTAINER ID: 容器 ID。
IMAGE: 使用的鏡像。
COMMAND: 啟動(dòng)容器時(shí)運(yùn)行的命令。
CREATED: 容器的創(chuàng)建時(shí)間。
STATUS: 容器狀態(tài)。
##狀態(tài)有7種:
created(已創(chuàng)建)
restarting(重啟中)
running(運(yùn)行中)
removing(遷移中)
paused(暫停)
exited(停止)
dead(死亡)
PORTS: 容器的端口信息和使用的連接類(lèi)型(tcp\udp)。
NAMES: 自動(dòng)分配的容器名稱(chēng)。
##常用參數(shù)
-a :顯示所有的容器,包括未運(yùn)行的。
-q :只顯示容器編號(hào)。
## 刪除容器
docker rm :刪除一個(gè)或多個(gè)容器。docker rm命令只能刪除處于終止或退出狀態(tài)的容器,并不能刪除
還處于運(yùn)行狀態(tài)的容器
##語(yǔ)法
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine
##需要先停止運(yùn)行中的容器再刪除,否則無(wú)法刪除容器
docker stop tomcat9
##按照容器名稱(chēng)刪除
docker rm tomcat9
##按照容器ID刪除
docker rm 8dd95a95e687
##常用參數(shù)
-f :通過(guò) SIGKILL 信號(hào)強(qiáng)制刪除一個(gè)運(yùn)行中的容器。
-l :移除容器間的網(wǎng)絡(luò)連接,而非容器本身。
-v :刪除與容器關(guān)聯(lián)的卷。
##停止所有運(yùn)行容器
docker stop $(docker ps -qa)
##刪除所有的容器
docker rm $(docker ps -aq)
docker rm $(docker stop $(docker ps -q))
##刪除所有的鏡像
docker rmi $(docker images -q)
##創(chuàng)建容器
docker create :創(chuàng)建一個(gè)新的容器但不啟動(dòng)它。用法同 docker run命令。
##語(yǔ)法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create -it --name tomcat9 -p 8080:8080 9.0.20-jre8-alpine
##常用參數(shù)
大部分參數(shù)用法與docker run命令參數(shù)相同
##啟動(dòng)、重啟、終止容器
docker start :啟動(dòng)一個(gè)或多個(gè)已經(jīng)被停止的容器
docker stop :停止一個(gè)運(yùn)行中的容器
docker restart :重啟容器
##語(yǔ)法
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
##實(shí)例
docker start tomcat9
docker stop tomcat9
docker restart tomcat9
##進(jìn)入容器
docker exec :在運(yùn)行的容器中執(zhí)行命令。早期有attach命令,對(duì)于阻塞命令會(huì)等待,所以不方便。在
Docker 1.3.0后提供了exec 可以在容器內(nèi)直接執(zhí)行任意命令
##語(yǔ)法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
##有bash命令的linux系統(tǒng):例如centos
docker run -it --name tomcat9.1 -p 8080:8080 tomcat:9.0.20-jre8-slim
docker exec -it tomcat9.1 /bin/bash
##沒(méi)有bash命令的linux系統(tǒng):例如alpine系統(tǒng)
docker run -it --name tomcat9.2 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker exec -it tomcat9.2 sh
##查看基礎(chǔ)鏡像linux 版本
cat /etc/issue
##更新容器
docker update :可以動(dòng)態(tài)地更新容器配置。可以更新一個(gè)或多個(gè)容器配置。多個(gè)容器名稱(chēng)或ID之間使
用空格分隔。但update命令不是很成熟,有很多配置項(xiàng)不能動(dòng)態(tài)更新。推薦大家還是rm容器后,再重
新run一個(gè)新的鏡像
##語(yǔ)法
docker update [OPTIONS] CONTAINER [CONTAINER...]
docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine
##更新容器restart策略
docker update --restart always tomcat9
##殺掉容器
docker kill :殺掉一個(gè)運(yùn)行中的容器
##語(yǔ)法
docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker kill tomcat9
docker ps
docker ps -a
docker start tomcat9
##常用參數(shù)
-s :向容器發(fā)送一個(gè)信號(hào)
## cp命令 用于容器與主機(jī)之間的數(shù)據(jù)拷貝
## 容器內(nèi)的文件拷貝到 宿主機(jī)
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp nginx:/etc/nginx/nginx.conf /data
## 宿主機(jī)文件復(fù)制到容器內(nèi)
docker cp [OPTIONS] SRC_PATH- CONTAINER:DEST_PATH
docker cp /data/index.html nginx:/usr/share/nginx/html/index.html
##常用參數(shù)
-L :保持源目標(biāo)中的鏈接
-a --archive Archive mode (copy all uid/gid information)
標(biāo)記本地鏡像,將其歸入某一倉(cāng)庫(kù)
總結(jié) :推薦通過(guò)image的名稱(chēng)刪除鏡像 image的ID在終端長(zhǎng)度未完全顯示,ID值會(huì)出現(xiàn)重復(fù)
docker安裝后會(huì)自動(dòng)創(chuàng)建3種網(wǎng)絡(luò):
docker network ls
docker使用Linux橋接網(wǎng)卡,在宿主機(jī)虛擬一個(gè)docker容器網(wǎng)橋(docker0),docker啟動(dòng)一個(gè)容器時(shí)會(huì)根 據(jù)docker網(wǎng)橋的網(wǎng)段分配給容器一個(gè)IP地址,稱(chēng)為Container-IP,同時(shí)docker網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng) 關(guān)。因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過(guò)容器的Container-IP直接 通信。
docker網(wǎng)橋是宿主機(jī)虛擬出來(lái)的,并不是真實(shí)存在的網(wǎng)絡(luò)設(shè)備,外部網(wǎng)絡(luò)是無(wú)法尋址到的,這也意味著 外部網(wǎng)絡(luò)無(wú)法通過(guò)直接Container-IP訪(fǎng)問(wèn)到容器。如果容器希望外部訪(fǎng)問(wèn)能夠訪(fǎng)問(wèn)到,可以通過(guò)映射容 器端口到宿主主機(jī)(端口映射),即docker run創(chuàng)建容器時(shí)候通過(guò) -p 或 -P 參數(shù)來(lái)啟用,訪(fǎng)問(wèn)容器的時(shí) 候就通過(guò)[宿主機(jī)IP]:[容器端口]訪(fǎng)問(wèn)容器。
使用命令查看docker網(wǎng)絡(luò)部分
docker info
bridge網(wǎng)絡(luò)表現(xiàn)形式就是docker0這個(gè)網(wǎng)絡(luò)接口。容器默認(rèn)都是通過(guò) docker0這個(gè)接口進(jìn)行通信。也可以通過(guò)docker0去和本機(jī)的以太網(wǎng)接口連接,這樣容器內(nèi)部才能訪(fǎng)問(wèn)互 聯(lián)網(wǎng)
##查看docker0網(wǎng)絡(luò),在默認(rèn)環(huán)境中,一個(gè)名為docker0的linux bridge自動(dòng)被創(chuàng)建好了,其上有一個(gè)
##docker0 內(nèi)部接口,IP地址為172.17.0.1/16
ip a
##查看docker 網(wǎng)絡(luò)
docker network ls
##查看bridge網(wǎng)絡(luò)詳情。主要關(guān)注Containers節(jié)點(diǎn)信息。
docker network inspect bridge
docker run -itd --name nginx1 nginx:1.19.3-alpine
##查看bridge網(wǎng)絡(luò)詳情。主要關(guān)注Containers節(jié)點(diǎn)信息。發(fā)現(xiàn)nginx1容器默認(rèn)使用bridge網(wǎng)絡(luò)
docker network inspect bridge
查看docker主機(jī)網(wǎng)絡(luò)。發(fā)現(xiàn)多出一塊網(wǎng)卡 veth8890dff@if8
ip a
Docker 創(chuàng)建一個(gè)容器的時(shí)候,會(huì)執(zhí)行如下操作:
? 創(chuàng)建一對(duì)虛擬接口/網(wǎng)卡,也就是veth pair,分別放到本地主機(jī)和新容器中;
? 本地主機(jī)一端橋接到默認(rèn)的 docker0 或指定網(wǎng)橋上,并具有一個(gè)唯一的名字,如 veth8890dff;
? 容器一端放到新容器中,并修改名字作為 eth0,這個(gè)網(wǎng)卡/接口只在容器的名字空間可見(jiàn);
? 從網(wǎng)橋可用地址段中(也就是與該bridge對(duì)應(yīng)的network)獲取一個(gè)空閑地址分配給容器的 eth0,并 配置默認(rèn)路由到橋接網(wǎng)卡 veth8890dff。 完成這些之后,容器就可以使用 eth0 虛擬網(wǎng)卡來(lái)連接其他容器和其他網(wǎng)絡(luò)。 如果不指定--network,創(chuàng)建的容器默認(rèn)都會(huì)掛到 docker0 上,使用本地主機(jī)上 docker0 接口的 IP 作為 所有容器的默認(rèn)網(wǎng)關(guān)。
第一種方式:
docker exec -it nginx1 sh
ip a
第二種方式:
docker exec -it nginx1 ip a
查看橋接網(wǎng)絡(luò)工具
yum install -y bridge-utils
brctl show
docker run -itd --name nginx1 nginx:1.19.3-alpine
docker run -itd --name nginx2 nginx:1.19.3-alpine
docker network inspect bridge
docker exec -it nginx1 sh
ping 172.17.0.2 ##可以ping 通
docker exec -it nginx2 sh
ping 172.17.0.2 ##可以ping 通
ping www.baidu.com
ping nginx1 ## 不可以
容器內(nèi)ip 是動(dòng)態(tài)分配的, 容器IP地址會(huì)發(fā)生變化
docker network create -d bridge my-bridge
## 上面命令參數(shù)-d 是指DRIVER的類(lèi)型,后面的my-bridge是network的自定義名稱(chēng),這個(gè)和docker0是
##類(lèi)似的。
docker run -itd --name nginx3 --network my-bridge nginx:1.19.3-alpine
## 將運(yùn)行著的nginx2容器 連接到新網(wǎng)絡(luò) my-bridge
docker network connect my-bridge nginx2
nginx2 橫跨my-bridge docker0 兩個(gè)網(wǎng)絡(luò)
環(huán)境準(zhǔn)備,先stop和rm掉全部之前開(kāi)啟的容器。并且把前面創(chuàng)建的my-bridge網(wǎng)絡(luò)也刪除。
[root@localhost ~]# docker rm -f $(docker ps -aq)
ade9d5129621
5f57299b3fe2
f98f7f4be1d5
2f68d03cbdfc
af4c25395fd9
[root@localhost ~]# docker network rm my-bridge
my-bridge
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5b0ad369d4e2 bridge bridge local
8555d88acdb2 host host local
f223f17c9cdc none null local
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#
啟動(dòng)一個(gè)ngnix的容器nginx1,并且連接到none網(wǎng)絡(luò)。然后執(zhí)行docker network inspect none,看看容 器信息
docker run -itd --name nginx1 --network none nginx:1.19.3-alpine
注: 容器使用none模式,是沒(méi)有物理地址和IP地址。我們可以進(jìn)入到nginx1容器里,執(zhí)行ip a命令看 看。只有一個(gè)lo接口,沒(méi)有其他網(wǎng)絡(luò)接口,沒(méi)有IP。也就是說(shuō),使用none模式,這個(gè)容器是不能被其他 容器訪(fǎng)問(wèn)。這種使用場(chǎng)景很少,只有項(xiàng)目安全性很高的功能才能使用到。例如:密碼加密算法容器,只需要進(jìn)容器里查看。
docker run -itd --name nginx2 --network host nginx:1.19.3-alpine
docker network inspect host
這里來(lái)看,也不顯示IP地址。那么是不是和none一樣,肯定不是,不然也不會(huì)設(shè)計(jì)none和host網(wǎng)絡(luò)進(jìn) 行區(qū)分。下面我們進(jìn)入nginx2容器,執(zhí)行ip a看看效果。我們?cè)谌萜骼飯?zhí)行ip a,發(fā)現(xiàn)打印內(nèi)容和在 linux本機(jī)外執(zhí)行ip a是一樣的
注: 容器使用了host模式,說(shuō)明容器和外層linux主機(jī)共享一套網(wǎng)絡(luò)接口。VMware公司的虛 擬機(jī)管理軟件,其中網(wǎng)絡(luò)設(shè)置,也有host這個(gè)模式,作用也是一樣,虛擬機(jī)里面使用網(wǎng)絡(luò)和你自己外層 機(jī)器是一模一樣的。這種容器和本機(jī)使用共享一套網(wǎng)絡(luò)接口,缺點(diǎn)還是很明顯的,例如我們知道web服 務(wù)器一般端口是80,共享了一套網(wǎng)絡(luò)接口,那么你這臺(tái)機(jī)器上只能啟動(dòng)一個(gè)nginx端口為80的服務(wù)器 了。否則,出現(xiàn)端口被占用的情況。
docker network --help
##Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
查看網(wǎng)絡(luò) – docker network ls
# 作用:
查看已經(jīng)建立的網(wǎng)絡(luò)對(duì)象
# 命令格式:
docker network ls [OPTIONS]
# 命令參數(shù)(OPTIONS):
-f, --filter filter 過(guò)濾條件(如 'driver=bridge')
--format string 格式化打印結(jié)果
--no-trunc 不縮略顯示
-q, --quiet 只顯示網(wǎng)絡(luò)對(duì)象的ID
# 注意:
默認(rèn)情況下,docker安裝完成后,會(huì)自動(dòng)創(chuàng)建bridge、host、none三種網(wǎng)絡(luò)驅(qū)動(dòng)
# 命令演示
docker network ls
docker network ls --no-trunc
docker network ls -f 'driver=host'
創(chuàng)建網(wǎng)絡(luò) – docker network create
# 作用:
創(chuàng)建新的網(wǎng)絡(luò)對(duì)象
# 命令格式:
docker network create [OPTIONS] NETWORK
# 命令參數(shù)(OPTIONS):
-d, --driver string 指定網(wǎng)絡(luò)的驅(qū)動(dòng)(默認(rèn) "bridge")
--subnet strings 指定子網(wǎng)網(wǎng)段(如192.168.0.0/16、172.88.0.0/24)
--ip-range strings 執(zhí)行容器的IP范圍,格式同subnet參數(shù)
--gateway strings 子網(wǎng)的IPv4 or IPv6網(wǎng)關(guān),如(192.168.0.1)
# 注意:
host和none模式網(wǎng)絡(luò)只能存在一個(gè)
docker自帶的overlay 網(wǎng)絡(luò)創(chuàng)建依賴(lài)于docker swarm(集群負(fù)載均衡)服務(wù)
192.168.0.0/16 等于 192.168.0.0~192.168.255.255192.168.8.0/24
172.88.0.0/24 等于 172.88.0.0~172.88.0.255
# 命令演示
docker network ls
docker network create -d bridge my-bridge
docker network ls
網(wǎng)絡(luò)刪除 – docker network rm
# 作用:
刪除一個(gè)或多個(gè)網(wǎng)絡(luò)
# 命令格式:
docker network rm NETWORK [NETWORK...]
# 命令參數(shù)(OPTIONS):
無(wú)
查看網(wǎng)絡(luò)詳細(xì)信息 docker network inspect
# 作用:
查看一個(gè)或多個(gè)網(wǎng)絡(luò)的詳細(xì)信息
# 命令格式:
docker network inspect [OPTIONS] NETWORK [NETWORK...]
或者 docker inspect [OPTIONS] NETWORK [NETWORK...]
# 命令參數(shù)(OPTIONS):
-f, --format string 根據(jù)format輸出結(jié)果
使用網(wǎng)絡(luò) – docker run –-network
# 作用:
為啟動(dòng)的容器指定網(wǎng)絡(luò)模式
# 命令格式:
docker run/create --network NETWORK
# 命令參數(shù)(OPTIONS):
無(wú)
# 注意:
默認(rèn)情況下,docker創(chuàng)建或啟動(dòng)容器時(shí),會(huì)默認(rèn)使用名為bridge的網(wǎng)絡(luò)
網(wǎng)絡(luò)連接與斷開(kāi) – docker network connect/disconnect
# 作用:
將指定容器與指定網(wǎng)絡(luò)進(jìn)行連接或者斷開(kāi)連接
# 命令格式:
docker network connect [OPTIONS] NETWORK CONTAINER
docker network disconnect [OPTIONS] NETWORK CONTAINER
# 命令參數(shù)(OPTIONS):
-f, --force 強(qiáng)制斷開(kāi)連接(用于disconnect)
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
docker network create -d bridge --subnet=172.172.0.0/24 --gateway 172.172.0.1 my-network
## 172.172.0.0/24: 24代表子碼掩碼是255.255.255.0
## 172.172.0.0/16: 16 代表子碼掩碼
## --subnet 可以定義網(wǎng)段 盡量避開(kāi)路由器網(wǎng)段 192.168
## --gateway 和 --subnet 前三網(wǎng)段 必須定義一致 172.172.0
docker run -itd --name nginx3 -p 8089:80 --network my-network --ip 172.172.0.100 nginx:1.19.3-alpine
## 固定容器nginx3 ip 為172.172.0.100
docker network inspect my-network
##--network my-network :選擇存在的網(wǎng)絡(luò)
##--ip 172.172.0.10:給nginx分配固定的IP地址
重啟容器后,ip不變
當(dāng)我們?cè)谑褂胐ocker容器的時(shí)候,會(huì)產(chǎn)生一系列的數(shù)據(jù)文件,這些數(shù)據(jù)文件在我們刪除docker容器時(shí)是 會(huì)消失的,但是其中產(chǎn)生的部分內(nèi)容我們是希望能夠把它給保存起來(lái)另作用途的,Docker將應(yīng)用與運(yùn)行 環(huán)境打包成容器發(fā)布,我們希望在運(yùn)行過(guò)程鐘產(chǎn)生的部分?jǐn)?shù)據(jù)是可以持久化的的,而且容器之間我們希 望能夠?qū)崿F(xiàn)數(shù)據(jù)共享 ;
數(shù)據(jù)卷(Data Volumes)是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,它將主機(jī)操作系統(tǒng)目錄直接映射進(jìn) 容器 。
注意事項(xiàng)
數(shù)據(jù)卷類(lèi)型
有三種數(shù)據(jù)卷類(lèi)型:
數(shù)據(jù)卷其實(shí)都在(如果沒(méi)有網(wǎng)絡(luò)文件系統(tǒng)等情況下)宿主機(jī)文件系統(tǒng)里面的,只是第一種是在宿主機(jī)內(nèi) 的特定目錄下,而后兩種則在docker管理的目錄下,這個(gè)目錄一般是 /var/lib/docker/volumes/ 推薦大家使用 宿主機(jī)數(shù)據(jù)卷 方式持久化數(shù)據(jù)
宿主機(jī)數(shù)據(jù)卷
數(shù)據(jù)覆蓋問(wèn)題
docker run -v /宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄 鏡像名
docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e
MYSQL_ROOT_PASSWORD=admin -v /data/mysql:/var/lib/mysql mysql:5.7.31 --
character-set-server=utf8 --collation-server=utf8_general_ci
https://hub.docker.com/_/mysql
--privileged==true
通過(guò) -v 容器內(nèi)路徑: ro rw 改變讀寫(xiě)權(quán)限
ro:readonly 只讀
rw:readwrite 可讀可寫(xiě)
docker run -it -v /宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄:ro 鏡像名
docker run -it -v /宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄:rw 鏡像名
例如:
docker run -d -P --name nginx05 -v lagouedu1:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v lagouedu2:/etc/nginx:rw nginx
ro 只要看到ro就說(shuō)明這個(gè)路徑只能通過(guò)宿主機(jī)來(lái)操作,容器內(nèi)部是無(wú)法操作!
https://hub.docker.com/r/sonatype/nexus3
拉取鏡像
docker pull sonatype/nexus3:3.28.1
備份鏡像
docker save sonatype/nexus3:3.28.1 -o sonatype.nexus3.3.28.1.tar
導(dǎo)入鏡像
docker load -i sonatype.nexus3.3.28.1.tar
運(yùn)行容器
docker run -d -p 8081:8081 --name nexus3 sonatype/nexus3:3.28.1
進(jìn)入容器查找初始化密碼
docker exec -it nexus3 /bin/bash
cd /nexus-data/
cat admin.password
瀏覽器端訪(fǎng)問(wèn)
http://192.168.198.100:8081/
docker rm $(docker stop $(docker ps -aq))
數(shù)據(jù)卷掛載
docker run -d -p 8081:8081 --name nexus3 -v /data/nexus3/:/nexus-data/
sonatype/nexus3:3.28.1
查看容器啟動(dòng)日志
docker logs -f nexus3
報(bào)錯(cuò)信息如下:
mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
OpenJDK 64-Bit Server VM warning: Cannot open file ../sonatypework/nexus3/log/jvm.log due to No such file or directory
Warning: Cannot open log file: ../sonatype-work/nexus3/log/jvm.log
Warning: Forcing option -XX:LogFile=/tmp/jvm.log
java.io.FileNotFoundException: ../sonatypework/nexus3/tmp/i4j_ZTDnGON8hezynsMX2ZCYAVDtQog=.lock (No such file or
directory)
....
刪除容器
docker rm -f nexus3
查看官網(wǎng)說(shuō)明文檔,需要為掛載目錄授權(quán)
chown -R 200 nexus3/
運(yùn)行容器
docker run -d -p 8081:8081 --name nexus3 -v /data/nexus3/:/nexus-data/
sonatype/nexus3:3.28.1
查看容器啟動(dòng)日志
docker logs -f nexus3
總結(jié):開(kāi)發(fā)環(huán)境中推薦各位小伙伴為掛載目錄授最高權(quán)限777;生產(chǎn)環(huán)境需要查看官網(wǎng)文檔,結(jié)合實(shí)際 生產(chǎn)環(huán)境進(jìn)行授權(quán)。
docker run -itd --name nginx -p 8080:8080 -v xl-nginx:/etc/nginx nginx:1.19.3-alpin
## xl-nginx 為自定義數(shù)據(jù)卷名稱(chēng)
##查看docker數(shù)據(jù)卷
docker volume ls
##查看lagouedu-nginx宿主機(jī)目錄
docker volume inspect xl-nginx
##進(jìn)入docker數(shù)據(jù)卷默認(rèn)目錄
cd //var/lib/docker/volumes/xl-nginx/_data
##查看文件
ls
##所有的文件docker默認(rèn)保存在_data目錄中
cd _data
##刪除容器
docker rm $(docker stop $(docker ps -aq))
##查看掛載數(shù)據(jù)是否還存在,通過(guò)查看數(shù)據(jù),發(fā)現(xiàn)刪除容器后,宿主機(jī)中的數(shù)據(jù)還存在
ls
## 運(yùn)行容器
docker run -itd --name nginx -p 80:80 -v /etc/nginx nginx:1.19.3-alpine
## 查看docker數(shù)據(jù)卷
docker volume ls
## 查看掛載到宿主機(jī)上的目錄
docker volume inspect b03d64f5701143238b71e68c5928710f745e9daf2aca554f9004f0913ffcc993
## 進(jìn)入docker數(shù)據(jù)卷默認(rèn)目錄
cd /var/lib/docker/volumes/b03d64f5701143238b71e68c5928710f745e9daf2aca554f9004f0913ffcc993/_data
##刪除容器
docker rm $(docker stop $(docker ps -aq))
##查看掛載數(shù)據(jù)是否還存在,通過(guò)查看數(shù)據(jù),發(fā)現(xiàn)刪除容器后,宿主機(jī)中的數(shù)據(jù)還存在
ls
刪除上面創(chuàng)建的容器后會(huì),發(fā)現(xiàn)數(shù)據(jù)卷仍然存在,我們就需要去清理它,不然會(huì)占用我們的資源
docker volume ls
清理數(shù)據(jù)卷
docker volume prune
docker volume ls
如果用戶(hù)需要在多個(gè)容器之間共享一些持續(xù)更新的數(shù)據(jù),最簡(jiǎn)單的方式是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器 也是一個(gè)容器,但是它的目的是專(zhuān)門(mén)用來(lái)提供數(shù)據(jù)卷供其他容器掛載。 發(fā)現(xiàn)創(chuàng)建好的數(shù)據(jù)卷容器是處于停止運(yùn)行的狀態(tài),因?yàn)槭褂?—volumes-from 參數(shù)所掛載數(shù)據(jù)卷的容器 自己并不需要保持在運(yùn)行狀態(tài)。
docker pull centos:7.8.2003
docker pull nginx:1.19.3-alpine
docker pull mysql:5.7.31
run命令
docker run
## 參數(shù)
--volumes-from:
docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html -v
/data/mysql:/var/lib/mysql centos:7.8.2003
docker run -itd --name nginx01 -p 80:80 --volumes-from data-volume nginx:1.19.3-
alpine
echo "lagouedu nginx" > /data/nginx/index.html
http://192.168.198.100
docker run -itd --name nginx02 -p 81:80 --volumes-from data-volume nginx:1.19.3-
alpine
http://192.168.198.100:81
##nginx01 nginx02 共享一個(gè)數(shù)據(jù)卷地址 /data/nginx
docker run -itd --name mysql01 --restart always --privileged=true -p 3306:3306
-e MYSQL_ROOT_PASSWORD=admin --volumes-from data-volume mysql:5.7.31 --
character-set-server=utf8 --collation-server=utf8_general_ci
docker run -itd --name mysql02 --restart always --privileged=true -p 3307:3306
-e MYSQL_ROOT_PASSWORD=admin --volumes-from data-volume mysql:5.7.31 --
character-set-server=utf8 --collation-server=utf8_general_ci
## 發(fā)現(xiàn)mysql02 啟動(dòng)會(huì)報(bào)錯(cuò)
注:有些基礎(chǔ)鏡像容器可以共享相同數(shù)據(jù)卷,有些不行,需要對(duì)應(yīng)修改
https://docs.docker.com/compose/compose-file/
部署和管理繁多的服務(wù)是困難的。而這正是 Docker Compose 要解決的問(wèn)題。Docker Compose 并不 是通過(guò)腳本和各種冗長(zhǎng)的 docker 命令來(lái)將應(yīng)用組件組織起來(lái),而是通過(guò)一個(gè)聲明式的配置文件描述整 個(gè)應(yīng)用,從而使用一條命令完成部署。應(yīng)用部署成功后,還可以通過(guò)一系列簡(jiǎn)單的命令實(shí)現(xiàn)對(duì)其完整聲 明周期的管理。甚至,配置文件還可以置于版本控制系統(tǒng)中進(jìn)行存儲(chǔ)和管理。
https://github.com/docker/compose
## 授權(quán)
mv /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
cp /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
## +x 指可執(zhí)行權(quán)限
##開(kāi)發(fā)環(huán)境可以授予最高權(quán)限
chmod 777 /usr/local/bin/docker-compose
##檢查安裝版本
docker-compose -v
docker-compose --version
docker-compose version
##docker-compose卸載只需要?jiǎng)h除二進(jìn)制文件就可以了。
rm -rf /usr/local/bin/docker-compose
## 重啟
reboot
Docker Compose 使用 YAML 文件來(lái)定義多服務(wù)的應(yīng)用。YAML 是 JSON 的一個(gè)子集,因此也可以使用 JSON。
Docker Compose 默認(rèn)使用文件名 docker-compose.yml。當(dāng)然,也可以使用 -f 參數(shù)指定具體文件。
Docker Compose 的 YAML 文件包含 4 個(gè)一級(jí) key:version、services、networks、volumes
Compose和Docker兼容性:
Compose 文件格式有3個(gè)版本,分別為1, 2.x 和 3.x
目前主流的為 3.x 其支持 docker 1.13.0 及其以上的版本
常用參數(shù):
version # 指定 compose 文件的版本
services # 定義所有的 service 信息, services 下面的第一級(jí)別的 key 既是一個(gè) service 的名稱(chēng)
build # 指定包含構(gòu)建上下文的路徑, 或作為一個(gè)對(duì)象,該對(duì)象具有 context 和指定的 dockerfile 文件以及 args 參數(shù)值
context # context: 指定 Dockerfile 文件所在的路徑
dockerfile # dockerfile: 指定 context 指定的目錄下面的 Dockerfile 的名稱(chēng)(默認(rèn)為 Dockerfile)
args # args: Dockerfile 在 build 過(guò)程中需要的參數(shù) (等同于 docker container build --build-arg 的作用)
cache_from # v3.2中新增的參數(shù), 指定緩存的鏡像列表 (等同于 docker container build --cache_from 的作用)
labels # v3.3中新增的參數(shù), 設(shè)置鏡像的元數(shù)據(jù) (等同于 docker container build --labels 的作用)
shm_size # v3.5中新增的參數(shù), 設(shè)置容器 /dev/shm 分區(qū)的大小 (等同于 docker container build --shm-size 的作用)
command # 覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令, 支持 shell 格式和 [] 格式
configs # 不知道怎么用
cgroup_parent # 不知道怎么用
container_name # 指定容器的名稱(chēng) (等同于 docker run --name 的作用)
credential_spec # 不知道怎么用
deploy # v3 版本以上, 指定與部署和運(yùn)行服務(wù)相關(guān)的配置, deploy 部分是 docker stack 使用的, docker stack 依賴(lài) docker swarm
endpoint_mode # v3.3 版本中新增的功能, 指定服務(wù)暴露的方式
vip # Docker 為該服務(wù)分配了一個(gè)虛擬 IP(VIP), 作為客戶(hù)端的訪(fǎng)問(wèn)服務(wù)的地址
dnsrr # DNS輪詢(xún), Docker 為該服務(wù)設(shè)置 DNS 條目, 使得服務(wù)名稱(chēng)的 DNS 查詢(xún)返回一個(gè) IP 地址列表, 客戶(hù)端直接訪(fǎng)問(wèn)其中的一個(gè)地址
labels # 指定服務(wù)的標(biāo)簽,這些標(biāo)簽僅在服務(wù)上設(shè)置
mode # 指定 deploy 的模式
global # 每個(gè)集群節(jié)點(diǎn)都只有一個(gè)容器
replicated # 用戶(hù)可以指定集群中容器的數(shù)量(默認(rèn))
placement # 不知道怎么用
replicas # deploy 的 mode 為 replicated 時(shí), 指定容器副本的數(shù)量
resources # 資源限制
limits # 設(shè)置容器的資源限制
cpus: "0.5" # 設(shè)置該容器最多只能使用 50% 的 CPU
memory: 50M # 設(shè)置該容器最多只能使用 50M 的內(nèi)存空間
reservations # 設(shè)置為容器預(yù)留的系統(tǒng)資源(隨時(shí)可用)
cpus: "0.2" # 為該容器保留 20% 的 CPU
memory: 20M # 為該容器保留 20M 的內(nèi)存空間
restart_policy # 定義容器重啟策略, 用于代替 restart 參數(shù)
condition # 定義容器重啟策略(接受三個(gè)參數(shù))
none # 不嘗試重啟
on-failure # 只有當(dāng)容器內(nèi)部應(yīng)用程序出現(xiàn)問(wèn)題才會(huì)重啟
any # 無(wú)論如何都會(huì)嘗試重啟(默認(rèn))
delay # 嘗試重啟的間隔時(shí)間(默認(rèn)為 0s)
max_attempts # 嘗試重啟次數(shù)(默認(rèn)一直嘗試重啟)
window # 檢查重啟是否成功之前的等待時(shí)間(即如果容器啟動(dòng)了, 隔多少秒之后去檢測(cè)容器是否正常, 默認(rèn) 0s)
update_config # 用于配置滾動(dòng)更新配置
parallelism # 一次性更新的容器數(shù)量
delay # 更新一組容器之間的間隔時(shí)間
failure_action # 定義更新失敗的策略
continue # 繼續(xù)更新
rollback # 回滾更新
pause # 暫停更新(默認(rèn))
monitor # 每次更新后的持續(xù)時(shí)間以監(jiān)視更新是否失敗(單位: ns|us|ms|s|m|h) (默認(rèn)為0)
max_failure_ratio # 回滾期間容忍的失敗率(默認(rèn)值為0)
order # v3.4 版本中新增的參數(shù), 回滾期間的操作順序
stop-first #舊任務(wù)在啟動(dòng)新任務(wù)之前停止(默認(rèn))
start-first #首先啟動(dòng)新任務(wù), 并且正在運(yùn)行的任務(wù)暫時(shí)重疊
rollback_config # v3.7 版本中新增的參數(shù), 用于定義在 update_config 更新失敗的回滾策略
parallelism # 一次回滾的容器數(shù), 如果設(shè)置為0, 則所有容器同時(shí)回滾
delay # 每個(gè)組回滾之間的時(shí)間間隔(默認(rèn)為0)
failure_action # 定義回滾失敗的策略
continue # 繼續(xù)回滾
pause # 暫停回滾
monitor # 每次回滾任務(wù)后的持續(xù)時(shí)間以監(jiān)視失敗(單位: ns|us|ms|s|m|h) (默認(rèn)為0)
max_failure_ratio # 回滾期間容忍的失敗率(默認(rèn)值0)
order # 回滾期間的操作順序
stop-first # 舊任務(wù)在啟動(dòng)新任務(wù)之前停止(默認(rèn))
start-first # 首先啟動(dòng)新任務(wù), 并且正在運(yùn)行的任務(wù)暫時(shí)重疊
注意:
支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子選項(xiàng)
security_opt container_name devices tmpfs stop_signal links cgroup_parent
network_mode external_links restart build userns_mode sysctls
devices # 指定設(shè)備映射列表 (等同于 docker run --device 的作用)
depends_on # 定義容器啟動(dòng)順序 (此選項(xiàng)解決了容器之間的依賴(lài)關(guān)系, 此選項(xiàng)在 v3 版本中 使用 swarm 部署時(shí)將忽略該選項(xiàng))
示例:
docker-compose up 以依賴(lài)順序啟動(dòng)服務(wù),下面例子中 redis 和 db 服務(wù)在 web 啟動(dòng)前啟動(dòng)
默認(rèn)情況下使用 docker-compose up web 這樣的方式啟動(dòng) web 服務(wù)時(shí),也會(huì)啟動(dòng) redis 和 db 兩個(gè)服務(wù),因?yàn)樵谂渲梦募卸x了依賴(lài)關(guān)系
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
dns # 設(shè)置 DNS 地址(等同于 docker run --dns 的作用)
dns_search # 設(shè)置 DNS 搜索域(等同于 docker run --dns-search 的作用)
tmpfs # v2 版本以上, 掛載目錄到容器中, 作為容器的臨時(shí)文件系統(tǒng)(等同于 docker run --tmpfs 的作用, 在使用 swarm 部署時(shí)將忽略該選項(xiàng))
entrypoint # 覆蓋容器的默認(rèn) entrypoint 指令 (等同于 docker run --entrypoint 的作用)
env_file # 從指定文件中讀取變量設(shè)置為容器中的環(huán)境變量, 可以是單個(gè)值或者一個(gè)文件列表, 如果多個(gè)文件中的變量重名則后面的變量覆蓋前面的變量, environment 的值覆蓋 env_file 的值
文件格式:
RACK_ENV=development
environment # 設(shè)置環(huán)境變量, environment 的值可以覆蓋 env_file 的值 (等同于 docker run --env 的作用)
expose # 暴露端口, 但是不能和宿主機(jī)建立映射關(guān)系, 類(lèi)似于 Dockerfile 的 EXPOSE 指令
external_links # 連接不在 docker-compose.yml 中定義的容器或者不在 compose 管理的容器(docker run 啟動(dòng)的容器, 在 v3 版本中使用 swarm 部署時(shí)將忽略該選項(xiàng))
extra_hosts # 添加 host 記錄到容器中的 /etc/hosts 中 (等同于 docker run --add-host 的作用)
healthcheck # v2.1 以上版本, 定義容器健康狀態(tài)檢查, 類(lèi)似于 Dockerfile 的 HEALTHCHECK 指令
test # 檢查容器檢查狀態(tài)的命令, 該選項(xiàng)必須是一個(gè)字符串或者列表, 第一項(xiàng)必須是 NONE, CMD 或 CMD-SHELL, 如果其是一個(gè)字符串則相當(dāng)于 CMD-SHELL 加該字符串
NONE # 禁用容器的健康狀態(tài)檢測(cè)
CMD # test: ["CMD", "curl", "-f", "http://localhost"]
CMD-SHELL # test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] 或者 test: curl -f https://localhost || exit 1
interval: 1m30s # 每次檢查之間的間隔時(shí)間
timeout: 10s # 運(yùn)行命令的超時(shí)時(shí)間
retries: 3 # 重試次數(shù)
start_period: 40s # v3.4 以上新增的選項(xiàng), 定義容器啟動(dòng)時(shí)間間隔
disable: true # true 或 false, 表示是否禁用健康狀態(tài)檢測(cè)和 test: NONE 相同
image # 指定 docker 鏡像, 可以是遠(yuǎn)程倉(cāng)庫(kù)鏡像、本地鏡像
init # v3.7 中新增的參數(shù), true 或 false 表示是否在容器中運(yùn)行一個(gè) init, 它接收信號(hào)并傳遞給進(jìn)程
isolation # 隔離容器技術(shù), 在 Linux 中僅支持 default 值
labels # 使用 Docker 標(biāo)簽將元數(shù)據(jù)添加到容器, 與 Dockerfile 中的 LABELS 類(lèi)似
links # 鏈接到其它服務(wù)中的容器, 該選項(xiàng)是 docker 歷史遺留的選項(xiàng), 目前已被用戶(hù)自定義網(wǎng)絡(luò)名稱(chēng)空間取代, 最終有可能被廢棄 (在使用 swarm 部署時(shí)將忽略該選項(xiàng))
logging # 設(shè)置容器日志服務(wù)
driver # 指定日志記錄驅(qū)動(dòng)程序, 默認(rèn) json-file (等同于 docker run --log-driver 的作用)
options # 指定日志的相關(guān)參數(shù) (等同于 docker run --log-opt 的作用)
max-size # 設(shè)置單個(gè)日志文件的大小, 當(dāng)?shù)竭_(dá)這個(gè)值后會(huì)進(jìn)行日志滾動(dòng)操作
max-file # 日志文件保留的數(shù)量
network_mode # 指定網(wǎng)絡(luò)模式 (等同于 docker run --net 的作用, 在使用 swarm 部署時(shí)將忽略該選項(xiàng))
networks # 將容器加入指定網(wǎng)絡(luò) (等同于 docker network connect 的作用), networks 可以位于 compose 文件頂級(jí)鍵和 services 鍵的二級(jí)鍵
aliases # 同一網(wǎng)絡(luò)上的容器可以使用服務(wù)名稱(chēng)或別名連接到其中一個(gè)服務(wù)的容器
ipv4_address # IP V4 格式
ipv6_address # IP V6 格式
示例:
version: '3.7'
services:
test:
image: nginx:1.14-alpine
container_name: mynginx
command: ifconfig
networks:
app_net: # 調(diào)用下面 networks 定義的 app_net 網(wǎng)絡(luò)
ipv4_address: 172.16.238.10
networks:
app_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
pid: 'host' # 共享宿主機(jī)的 進(jìn)程空間(PID)
ports # 建立宿主機(jī)和容器之間的端口映射關(guān)系, ports 支持兩種語(yǔ)法格式
SHORT 語(yǔ)法格式示例:
- "3000" # 暴露容器的 3000 端口, 宿主機(jī)的端口由 docker 隨機(jī)映射一個(gè)沒(méi)有被占用的端口
- "3000-3005" # 暴露容器的 3000 到 3005 端口, 宿主機(jī)的端口由 docker 隨機(jī)映射沒(méi)有被占用的端口
- "8000:8000" # 容器的 8000 端口和宿主機(jī)的 8000 端口建立映射關(guān)系
- "9090-9091:8080-8081"
- "127.0.0.1:8001:8001" # 指定映射宿主機(jī)的指定地址的
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp" # 指定協(xié)議
LONG 語(yǔ)法格式示例:(v3.2 新增的語(yǔ)法格式)
ports:
- target: 80 # 容器端口
published: 8080 # 宿主機(jī)端口
protocol: tcp # 協(xié)議類(lèi)型
mode: host # host 在每個(gè)節(jié)點(diǎn)上發(fā)布主機(jī)端口, ingress 對(duì)于群模式端口進(jìn)行負(fù)載均衡
secrets # 不知道怎么用
security_opt # 為每個(gè)容器覆蓋默認(rèn)的標(biāo)簽 (在使用 swarm 部署時(shí)將忽略該選項(xiàng))
stop_grace_period # 指定在發(fā)送了 SIGTERM 信號(hào)之后, 容器等待多少秒之后退出(默認(rèn) 10s)
stop_signal # 指定停止容器發(fā)送的信號(hào) (默認(rèn)為 SIGTERM 相當(dāng)于 kill PID; SIGKILL 相當(dāng)于 kill -9 PID; 在使用 swarm 部署時(shí)將忽略該選項(xiàng))
sysctls # 設(shè)置容器中的內(nèi)核參數(shù) (在使用 swarm 部署時(shí)將忽略該選項(xiàng))
ulimits # 設(shè)置容器的 limit
userns_mode # 如果Docker守護(hù)程序配置了用戶(hù)名稱(chēng)空間, 則禁用此服務(wù)的用戶(hù)名稱(chēng)空間 (在使用 swarm 部署時(shí)將忽略該選項(xiàng))
volumes # 定義容器和宿主機(jī)的卷映射關(guān)系, 其和 networks 一樣可以位于 services 鍵的二級(jí)鍵和 compose 頂級(jí)鍵, 如果需要跨服務(wù)間使用則在頂級(jí)鍵定義, 在 services 中引用
SHORT 語(yǔ)法格式示例:
volumes:
- /var/lib/mysql # 映射容器內(nèi)的 /var/lib/mysql 到宿主機(jī)的一個(gè)隨機(jī)目錄中
- /opt/data:/var/lib/mysql # 映射容器內(nèi)的 /var/lib/mysql 到宿主機(jī)的 /opt/data
- ./cache:/tmp/cache # 映射容器內(nèi)的 /var/lib/mysql 到宿主機(jī) compose 文件所在的位置
- ~/configs:/etc/configs/:ro # 映射容器宿主機(jī)的目錄到容器中去, 權(quán)限只讀
- datavolume:/var/lib/mysql # datavolume 為 volumes 頂級(jí)鍵定義的目錄, 在此處直接調(diào)用
LONG 語(yǔ)法格式示例:(v3.2 新增的語(yǔ)法格式)
version: "3.2"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- type: volume # mount 的類(lèi)型, 必須是 bind、volume 或 tmpfs
source: mydata # 宿主機(jī)目錄
target: /data # 容器目錄
volume: # 配置額外的選項(xiàng), 其 key 必須和 type 的值相同
nocopy: true # volume 額外的選項(xiàng), 在創(chuàng)建卷時(shí)禁用從容器復(fù)制數(shù)據(jù)
- type: bind # volume 模式只指定容器路徑即可, 宿主機(jī)路徑隨機(jī)生成; bind 需要指定容器和數(shù)據(jù)機(jī)的映射路徑
source: ./static
target: /opt/app/static
read_only: true # 設(shè)置文件系統(tǒng)為只讀文件系統(tǒng)
volumes:
mydata: # 定義在 volume, 可在所有服務(wù)中調(diào)用
restart # 定義容器重啟策略(在使用 swarm 部署時(shí)將忽略該選項(xiàng), 在 swarm 使用 restart_policy 代替 restart)
no # 禁止自動(dòng)重啟容器(默認(rèn))
always # 無(wú)論如何容器都會(huì)重啟
on-failure # 當(dāng)出現(xiàn) on-failure 報(bào)錯(cuò)時(shí), 容器重新啟動(dòng)
其他選項(xiàng):
domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir
上面這些選項(xiàng)都只接受單個(gè)值和 docker run 的對(duì)應(yīng)參數(shù)類(lèi)似對(duì)于值為時(shí)間的可接受的值:
2.5s
10s
1m30s
2h32m
5h34m56s
時(shí)間單位: us, ms, s, m, h
對(duì)于值為大小的可接受的值:
2b
1024kb
2048k
300m
1gb
單位: b, k, m, g 或者 kb, mb, gb
networks # 定義 networks 信息
driver # 指定網(wǎng)絡(luò)模式, 大多數(shù)情況下, 它 bridge 于單個(gè)主機(jī)和 overlay Swarm 上
bridge # Docker 默認(rèn)使用 bridge 連接單個(gè)主機(jī)上的網(wǎng)絡(luò)
overlay # overlay 驅(qū)動(dòng)程序創(chuàng)建一個(gè)跨多個(gè)節(jié)點(diǎn)命名的網(wǎng)絡(luò)
host # 共享主機(jī)網(wǎng)絡(luò)名稱(chēng)空間(等同于 docker run --net=host)
none # 等同于 docker run --net=none
driver_opts # v3.2以上版本, 傳遞給驅(qū)動(dòng)程序的參數(shù), 這些參數(shù)取決于驅(qū)動(dòng)程序
attachable # driver 為 overlay 時(shí)使用, 如果設(shè)置為 true 則除了服務(wù)之外,獨(dú)立容器也可以附加到該網(wǎng)絡(luò); 如果獨(dú)立容器連接到該網(wǎng)絡(luò),則它可以與其他 Docker 守護(hù)進(jìn)程連接到的該網(wǎng)絡(luò)的服務(wù)和獨(dú)立容器進(jìn)行通信
ipam # 自定義 IPAM 配置. 這是一個(gè)具有多個(gè)屬性的對(duì)象, 每個(gè)屬性都是可選的
driver # IPAM 驅(qū)動(dòng)程序, bridge 或者 default
config # 配置項(xiàng)
subnet # CIDR格式的子網(wǎng),表示該網(wǎng)絡(luò)的網(wǎng)段
external # 外部網(wǎng)絡(luò), 如果設(shè)置為 true 則 docker-compose up 不會(huì)嘗試創(chuàng)建它, 如果它不存在則引發(fā)錯(cuò)誤
name # v3.5 以上版本, 為此網(wǎng)絡(luò)設(shè)置名稱(chēng)
文件格式示例:
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role==manager]
docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
docker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine
mkdir -p /data/tomcat1 tomcat2
docker cp nginx:/etc/nginx/ /data
docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat1/webapps
docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat2/webapps
echo "tomcat1" > /data/tomcat1/webapps/ROOT/index.jsp
echo "tomcat2" > /data/tomcat2/webapps/ROOT/index.jsp
docker rm -f nginx tomcat
nginx.conf增加內(nèi)容
include vhost/*.conf;
mkdir -p /data/nginx/vhost
cd vhost
vi lagouedu.com.conf
upstream nginxlagouedu{
server 192.168.198.100:8081;
server 192.168.198.100:8082;
}
server{
listen 80;
server_name 192.168.198.100;
autoindex on;
index index.html index.htm index.jsp;
location / {
proxy_pass http://nginxlagouedu;
add_header Access-Control-Allow-Origin *;
}
}
version: '3'
services:
## 服務(wù)名稱(chēng)
xl-nginx:
image: nginx:1.19.3-alpine
## 容器名稱(chēng)
container_name: xl-nginx
restart: always
ports:
- 80:80
volumes:
- data/nginx:/etc/nginx
tomcat1:
image: tomcat:9.0.20-jre8-alpine
container_name: tomcat1
restart: always
ports:
- 8081:8080
volumes:
- /data/tomcat1/webapps:/user/local/tomcat/webapps
depends_on:
## 依賴(lài) xl-nginx 先啟動(dòng) 服務(wù)名稱(chēng)
- xl-nginx
tomcat2:
image: tomcat:9.0.20-jre8-alpine
container_name: tomcat2
restart: always
ports:
- 8082:8080
volumes:
- /data/tomcat2/webapps:/user/local/tomcat/webapps
depends_on:
## 依賴(lài) xl-nginx 先啟動(dòng) 服務(wù)名稱(chēng)
- xl-nginx
官網(wǎng) https://docs.docker.com/engine/reference/commandline/compose_build/
## 后臺(tái)啟動(dòng) 在docker-compose.yml當(dāng)前目錄下,并且名字為docker-compose.yml
docker-compose up -d
docker-compose -f my-docker-compose.yml up -d
## 停止并刪除服務(wù) -f
docker-compose down
## 僅停止服務(wù)
docker-compose stop
## 啟動(dòng)服務(wù)
docker-compose start
## 重啟服務(wù)
docker-compose restart
## 列出所有運(yùn)行容器
docker-compose ps
docker ps
## 查看服務(wù)日志 -f 指定yml文件
docker-compose logs
docker logs -f nginx
https://hub.docker.com/_/registry
docker pull registry:2.8.1
docker run -d --name registry --restart always -p 5000:500 registry:2.8.1
編輯配置文件 vi /etc/docker/daemon.json
增加倉(cāng)庫(kù)配置信息 { "insecure-registries":["18.135.3.67:5000"] }
重啟docker
systemctl daemon-reload
systemctl restart docker
查看docker信息確認(rèn)倉(cāng)庫(kù)是否添加
docker info
http://8.135.3.67:5000/v2/_catalog
docker tag nginx:1.19.3-alpine 8.135.3.67:5000/nginx:v2
docker push 8.135.3.67:5000/nginx
http://8.135.3.67:5000/v2/nginx/tags/list
https://goharbor.io/
##github官網(wǎng)地址:
https://github.com/goharbor/harbor
##官方幫助文檔:
https://github.com/goharbor/harbor/blob/v1.9.4/docs/installation_guide.md
注:搭建harbor 必須安裝docker-compose 環(huán)境
docker-compose -v
##1.解壓軟件
cd /data
tar zxf harbor-offline-installer-v1.9.4.tgz
##2.進(jìn)入安裝目錄
cd harbor
##3.修改配置文件
vi harbor.yml
##3.1修改私服鏡像地址
hostname: 8.135.3.67
##3.2修改鏡像地址訪(fǎng)問(wèn)端口號(hào)
port: 5000
##3.3harbor管理員登錄系統(tǒng)密碼
harbor_admin_password: Harbor12345
##3.4修改harbor映射卷目錄
data_volume: /data/harbor
##4.安裝harbor
##4.1執(zhí)行啟動(dòng)腳本,經(jīng)過(guò)下述3個(gè)步驟后,成功安裝harbor私服
./install.sh
4.2準(zhǔn)備安裝環(huán)境:檢查docker版本和docker-compose版本
4.3加載harbor需要的鏡像
4.4準(zhǔn)備編譯環(huán)境
4.5啟動(dòng)harbor。通過(guò)docker-compose方式啟動(dòng)服務(wù)
4.6google瀏覽器訪(fǎng)問(wèn)harbor私服
http://8.135.3.67:5000/
username: admin
password: Harbr12345
vi /etc/docker/daemon.json
"insecure-registries":["8.135.3.67:5000"]
重啟docker服務(wù):
systemctl daemon-reload
systemctl restart docker
在harbor中新建公共項(xiàng)目: xl
注:由于項(xiàng)目設(shè)置的非公開(kāi),所以上傳鏡像需先登陸
docker login -u admin -p Harbor12345 8.135.3.67:5000
退出私服
docker logout 8.135.3.67:5000
docker tag nginx:1.19.3-alpine 8.135.3.67:5000/xl/nginx:v1
docker push 8.135.3.67:5000/xl/nginx:v1
##刪除本地鏡像
docker rmi -f 8.135.3.67:5000/xl/nginx:v1
## 從私服拉取鏡像
docker pull 8.135.3.67:5000/xl/nginx:v1
默認(rèn)情況下,harbor不提供證書(shū)。可以在沒(méi)有安全性的情況下部署harbor,就可以通過(guò)HTTP方式連接 到harbor。但是,只有在沒(méi)有連接到外部internet的測(cè)試環(huán)境或開(kāi)發(fā)環(huán)境中才可以使用HTTP。在生產(chǎn)環(huán) 境中,始終使用HTTPS。要配置HTTPS,必須創(chuàng)建SSL證書(shū)。可以使用由受信任的第三方CA簽名的證 書(shū),也可以使用自簽名證書(shū)。本節(jié)介紹如何使用OpenSSL創(chuàng)建CA,以及如何使用CA簽署服務(wù)器證書(shū)和 客戶(hù)端證書(shū)。下面的過(guò)程假設(shè)harbor注冊(cè)表的主機(jī)名是harbor.lagouedu.com,并且它的DNS記錄指向 運(yùn)行harbor的主機(jī)。
官網(wǎng)文檔
官網(wǎng)https配置幫助文檔:
https://github.com/goharbor/harbor/blob/v1.9.4/docs/configure_https.md
解壓harbor
在harbor中創(chuàng)建一個(gè)目錄,用于存放證書(shū)
echo "192.168.150.141 harbor.xl.com" >> /etc/hosts
cat /etc/hosts
cd /data
tar zxf harbor-offline-installer-v1.9.4.tgz
cd harbor/
mkdir -p ssl
cd ssl
獲得證書(shū)頒發(fā)機(jī)構(gòu)
在生產(chǎn)環(huán)境中,應(yīng)該從CA官方獲取證書(shū)。在測(cè)試或開(kāi)發(fā)環(huán)境中,可以生成自己的CA。若要生成CA證 書(shū),請(qǐng)運(yùn)行以下命令。
cd /data/harbor/ssl
創(chuàng)建CA根證書(shū)
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 -subj
"/C=TW/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.xl.com" -key
ca.key -out ca.crt
獲取服務(wù)器證書(shū)
證書(shū)通常包含.crt文件和.key文件,例如harbor.xl.com.crt和harbor.xl.com.key。
創(chuàng)建自己的私鑰
openssl genrsa -out harbor.lagouedu.com.key 4096
生成證書(shū)簽名請(qǐng)求
調(diào)整-subj選項(xiàng)中的值以反映您的組織。如果使用域名方式連接harbor主機(jī),則必須將其指定為 common name(CN)屬性,并在key和CSR文件名中使用它。
openssl req -sha512 -new -subj
"/C=TW/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.xl.com" -key
harbor.xl.com.key -out harbor.xl.com.csr
生成注冊(cè)表主機(jī)的證書(shū)
無(wú)論是使用域名還是使用IP地址連接到您的Harbor主機(jī),都必須創(chuàng)建此文件,以便您可以為harbor主機(jī) 生成符合使用者替代名稱(chēng)(SAN)和x509 v3擴(kuò)展要求的證書(shū)。替換DNS條目以反映harbor的域
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names
[alt_names]
DNS.1=harbor.xl.com
EOF
使用v3.ext文件為harbor主機(jī)生成證書(shū)。
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -
CAcreateserial -in harbor.xl.com.csr -out harbor.xl.com.crt
為docker配置服務(wù)器證書(shū),密鑰和CA
生成ca.crt、harbor.xl.com.crt和harbor.xl.com.key文件后,必須將它們提供給Harbor 和Docker,并重新配置Harbor以使用它們。 將yourdomain.com.crt轉(zhuǎn)換為yourdomain.com.cert,供Docker使用。 Docker守護(hù)進(jìn)程將.crt文件解釋為CA證書(shū),.cert文件解釋為客戶(hù)端證書(shū)。
openssl x509 -inform PEM -in harbor.xl.com.crt -out
harbor.xl.com.cert
mkdir -p /etc/docker/certs.d/harbor.xl.com/
cp harbor.xl.com.cert /etc/docker/certs.d/harbor.xl.com/
cp harbor.xl.com.key /etc/docker/certs.d/harbor.xl.com/
cp ca.crt /etc/docker/certs.d/harbor.xl.com/
#重啟docker服務(wù):
systemctl daemon-reload
systemctl restart docker
修改harbor.yml文件
注釋掉http的配置信息
hostname: harbor.xl.com
https:
port: 443
certificate: /data/harbor/ssl/harbor.xl.com.crt
private_key: /data/harbor/ssl/harbor.xl.com.key
安裝harbor
docker pull goharbor/prepare:v1.9.4
cd /data/harbor
./prepared
./install.sh
訪(fǎng)問(wèn)UI
C:\Windows\System32\drivers\etc
192.168.198.101 harbor.xl.com
https://harbor.xl.com/
上傳鏡像
docker-100服務(wù)器:
將harbor服務(wù)器端生成的ca.crt文件復(fù)制到/etc/pki/ca-trust/source/anchors/中。
執(zhí)行命令更新ca證書(shū)授權(quán):update-ca-trust
重啟docker服務(wù):
systemctl restart docker
echo "192.168.198.101 harbor.xl.com" >> /etc/hosts
docker login harbor.xl.com
admin
Harbor12345
docker load -i nginx.1.19.3.alpine.tar
docker tag nginx:1.19.3-alpine harbor.xl.com/xl/nginx:v1
docker push harbor.xl.com/xl/nginx:v1
## 從私服拉取nginx 鏡像并運(yùn)行
docker run -itd --name nginx -p 80:80 8.135.3.67:5000/xl/nginx:v1
## 創(chuàng)建index.html 并追加內(nèi)容
echo 'C.X.L nginx' >/data/index.html
## 將宿主機(jī)上的index 文件復(fù)制到nginx1容器覆蓋其index.html
## 結(jié)合docker cp命令自定義nginx的index頁(yè)面
docker cp index.html nginx:/usr/share/nginx/html/index.html
commit命令
docker commit :從容器創(chuàng)建一個(gè)新的鏡像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
常用參數(shù)
## 創(chuàng)建新nginx 鏡像
docker commit -m 'update index.html' -a 'C.X.L' nginx 8.135.3.67:5000/xl/nginx:v2
## 將鏡像推至私服
docker push 8.135.3.67:5000/xl/nginx:v2
https://docs.docker.com/engine/reference/builder/
Dockerfile其實(shí)就是我們用來(lái)構(gòu)建Docker鏡像的源碼,當(dāng)然這不是所謂的編程源碼,而是一些命令的集 合,只要理解它的邏輯和語(yǔ)法格式,就可以很容易的編寫(xiě)Dockerfile。簡(jiǎn)單點(diǎn)說(shuō),Dockerfile可以讓用戶(hù) 個(gè)性化定制Docker鏡像。因?yàn)楣ぷ鳝h(huán)境中的需求各式各樣,網(wǎng)絡(luò)上的鏡像很難滿(mǎn)足實(shí)際的需求 。
Dockerfile是一個(gè)包含用于組合映像的命令的文本文檔。可以使用在命令行中調(diào)用任何命令。 Docker通 過(guò)讀取Dockerfile中的指令自動(dòng)生成映像。
docker build命令用于從Dockerfile構(gòu)建映像。可以在docker build命令中使用 -f 標(biāo)志指向文件系統(tǒng)中任 何位置的Dockerfile。
Dockerfile由一行行命令語(yǔ)句組成,并且支持以#開(kāi)頭的注釋行 Dockerfile分為四部分:基礎(chǔ)鏡像信息、維護(hù)者信息、 鏡像操作指令和容器啟動(dòng)時(shí)執(zhí)行指令 。
Docker以從上到下的順序運(yùn)行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個(gè)聲 明以 # 字符開(kāi)頭則被視為注釋。可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指 令。
FROM mysql:8.0
MAINTAINER mysql from date UTC by Asia/Shanghai "C.X.L"
ENV TZ Asia/Shanghai
docker build 命令用于使用 Dockerfile 創(chuàng)建鏡像。
docker build [OPTIONS] PATH | URL | -
常用參數(shù)
build命令參數(shù)特別多。這里只給大家介紹幾個(gè)常用的參數(shù),如果小伙伴們想了解更多內(nèi)容,請(qǐng)參考 docker官網(wǎng)手冊(cè)。
docker build --rm -t 8.135.3.67:5000/xl/mysql:8.0 .
## .指運(yùn)行當(dāng)前目錄下的Dockerfile
docker run -itd --name mysql -p 3306:3306 --restart always -e MYSQL_ROOT_PASSWORD=123456 8.135.3.67:5000/xl/mysql:8.0
docker logs -f mysql
docker exec -it mysql bash
date
##觀察時(shí)間是否與windows系統(tǒng)的時(shí)間一致。
修改docker-100服務(wù)器docker.service服務(wù)信息,允許其他主機(jī)遠(yuǎn)程訪(fǎng)問(wèn)100服務(wù)器的docker。
vi /usr/lib/systemd/system/docker.service
##在ExecStart行最后增加,開(kāi)放遠(yuǎn)程主機(jī)訪(fǎng)問(wèn)權(quán)限。
-H tcp://0.0.0.0:2375
##最后增加修改內(nèi)容如下: 0.0.0.0 允許所以ip都能訪(fǎng)問(wèn)
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
-H tcp://0.0.0.0:2375
##重啟docker
systemctl daemon-reload
systemctl restart docker
##查看docker進(jìn)程,發(fā)現(xiàn)docker守護(hù)進(jìn)程在已經(jīng)監(jiān)聽(tīng)2375的tcp端口
ps -ef|grep docker
##查看系統(tǒng)的網(wǎng)絡(luò)端口,檢查tcp的2375端口,docker的守護(hù)進(jìn)程是否監(jiān)聽(tīng)
netstat -tulp
配置插件
settings->build execution...->docker->點(diǎn)擊"+"按鈕,新增docker-100服務(wù)器docker配置信息
##配置內(nèi)容如下:
name:docker-100
TCP Socket:
Engine API URL:tcp://192.168.198.100:2375
##配置成功后,會(huì)在下方顯示connection successful
配置成功后,會(huì)在idea開(kāi)發(fā)工具下方窗口"8.services"里顯示信息,右鍵點(diǎn)擊connect。連接成功可以查 看到container和images等信息。可以對(duì)container和images進(jìn)行各種相關(guān)操作。
友情鏈接: 餐飲加盟
地址:北京市海淀區(qū) 電話(huà):010- 郵箱:@126.com
備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有