操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    、引入Docker數(shù)據(jù)卷的必然性

    為了實(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ù)卷

    目前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)。
    三種方式掛載圖解

    三、bind mounts的基本使用

    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ù)持久化。

    四、volumes的基本使用

    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ù)持久化的效果。

    五、擴(kuò)展(-volume)

    高于17.06的docker可以將--mount用于為單一容器創(chuàng)建數(shù)據(jù)卷,兩者的差別如下:

    5.1、-v或是-volume包括三個(gè)區(qū)域,以分號(hào)分割

    • 第一個(gè)區(qū)域用于定義卷的名稱(chēng),如果不指定,表明使用匿名卷,實(shí)名卷的名稱(chēng)在一臺(tái)主機(jī)上唯一
    • 第二個(gè)區(qū)域指定卷對(duì)應(yīng)容器中的哪個(gè)文件
    • 第三個(gè)區(qū)域是可選的,是用逗號(hào)分割的選項(xiàng)列表

    5.2、-mount使用鍵值對(duì)=,以逗號(hào)分割,對(duì)應(yīng)的值如下

    • type:可以是bind、volume、tmpfs,創(chuàng)建數(shù)據(jù)卷使用volume
    • source:掛載點(diǎn)的名字,對(duì)于實(shí)名卷,為實(shí)名卷的名字,匿名卷不需要使用這個(gè)關(guān)鍵字
    • destination:指定卷對(duì)應(yīng)容器中的哪個(gè)文件
    • readonly:指定數(shù)據(jù)卷只可讀
    • volume-opt:可以出現(xiàn)多次,其值為一個(gè)鍵值對(duì)(有什么用我還不知道)

    -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ù)卷

    六、tmpfs mounts的基本使用(很少用,稍微了解就行)

    如果在 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 掛載的局限性

    • 不同于卷和綁定掛載,不能在容器之間共享 tmpfs 掛載。
    • 這個(gè)功能只有在 Linux 上運(yùn)行 Docker 時(shí)才可用。

    6.2、--tmpfs 和 --mount 行為之間的差異

    • --tmpfs 標(biāo)記不允許指定任何可配置選項(xiàng)。
    • --tmpfs 標(biāo)記不能用于集群服務(wù)。對(duì)于集群服務(wù),您必須使用 --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命令分類(lèi)

    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]

    常用命令

    Docker安裝

    阿里云開(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)

    部分演示

    安裝阿里云鏡像加速器

    inspect命令

    tag命令

    標(biāo)記本地鏡像,將其歸入某一倉(cāng)庫(kù)

    rmi命令

    總結(jié) 推薦通過(guò)image的名稱(chēng)刪除鏡像 image的ID在終端長(zhǎng)度未完全顯示,ID值會(huì)出現(xiàn)重復(fù)

    docker ps

    容器創(chuàng)建、啟動(dòng)、停止

    exec命令

    Docker網(wǎng)絡(luò)

    docker安裝后會(huì)自動(dòng)創(chuàng)建3種網(wǎng)絡(luò):

    • bridge
    • host
    • none

    docker network ls

    docker網(wǎng)絡(luò)理論部分

    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ò)

    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

    運(yùn)行鏡像

    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

    容器創(chuàng)建時(shí)IP地址的分配

    查看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)。

    查看容器內(nèi)的網(wǎng)絡(luò)

    第一種方式:

    docker exec -it nginx1 sh

    ip a

    第二種方式:

    docker exec -it nginx1 ip a

    安裝brctl

    查看橋接網(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ā)生變化

    新建bridge網(wǎng)絡(luò)

    docker network create -d bridge my-bridge
    ## 上面命令參數(shù)-d 是指DRIVER的類(lèi)型,后面的my-bridge是network的自定義名稱(chēng),這個(gè)和docker0是
    ##類(lèi)似的。

    如何把容器連接到my-bridge這個(gè)網(wǎng)絡(luò)

    docker run -itd --name nginx3 --network my-bridge nginx:1.19.3-alpine

    如何把已運(yùn)行的容器綁定到my-bridge

    ## 將運(yùn)行著的nginx2容器 連接到新網(wǎng)絡(luò) my-bridge
    docker network connect my-bridge nginx2

    nginx2 橫跨my-bridge docker0 兩個(gè)網(wǎng)絡(luò)

    加入相同網(wǎng)絡(luò)my-bridge后,可通過(guò)容器名ping 通

    none網(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)容器里查看。

    host網(wǎng)絡(luò)

    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)端口被占用的情況

    網(wǎng)絡(luò)命令匯總

    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ò)

    查看網(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ò)

    創(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ò)刪除

    網(wǎng)絡(luò)刪除 – docker network rm
    # 作用:
    刪除一個(gè)或多個(gè)網(wǎng)絡(luò)
    # 命令格式:
    docker network rm NETWORK [NETWORK...]
    # 命令參數(shù)(OPTIONS):
    無(wú)

    查看網(wǎng)絡(luò)詳細(xì)信息

    查看網(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ò)

    使用網(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)

    網(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)

    獲取所有容器名稱(chēng)及其IP地址

    docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

    實(shí)戰(zhàn)

    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

    固定容器ip

    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不變

    Docker數(shù)據(jù)卷

    數(shù)據(jù)卷

    當(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ù)卷,最好是通過(guò)run而非create/start創(chuàng)建啟動(dòng)容器,create/start命令創(chuàng)建啟動(dòng)容器 后,再掛載數(shù)據(jù)卷相當(dāng)麻煩,要修改很多配置文件,但并非不可以。
    • docker官網(wǎng)推薦盡量進(jìn)行目錄掛載,不要進(jìn)行文件掛載

    數(shù)據(jù)卷類(lèi)型

    有三種數(shù)據(jù)卷類(lèi)型:

    1. 宿主機(jī)數(shù)據(jù)卷:直接在宿主機(jī)的文件系統(tǒng)中但是容器可以訪(fǎng)問(wèn)(bind mount)
    1. 命名的數(shù)據(jù)卷:磁盤(pán)上Docker管理的數(shù)據(jù)卷,但是這個(gè)卷有個(gè)名字。
    1. 匿名數(shù)據(jù)卷:磁盤(pán)上Docker管理的數(shù)據(jù)卷,因?yàn)闆](méi)有名字想要找到不容易,Docker來(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ù)卷

    • bind mounts:容器內(nèi)的數(shù)據(jù)被存放到宿主機(jī)文件系統(tǒng)的任意位置,甚至存放到一些重要的系統(tǒng)目錄或 文件中。除了docker之外的進(jìn)程也可以任意對(duì)他們進(jìn)行修改。
    • 當(dāng)使用bind mounts時(shí),宿主機(jī)的目錄或文件被掛載到容器中。容器將按照掛載目錄或文件的絕對(duì)路徑 來(lái)使用或修改宿主機(jī)的數(shù)據(jù)。宿主機(jī)中的目錄或文件不需要預(yù)先存在,在需要的使用會(huì)自動(dòng)創(chuàng)建。
    • 使用bind mounts在性能上是非常好的,但這依賴(lài)于宿主機(jī)有一個(gè)目錄妥善結(jié)構(gòu)化的文件系統(tǒng)。
    • 使用bind mounts的容器可以在通過(guò)容器內(nèi)部的進(jìn)程對(duì)主機(jī)文件系統(tǒng)進(jìn)行修改,包括創(chuàng)建,修改和刪除 重要的系統(tǒng)文件和目錄,這個(gè)功能雖然很強(qiáng)大,但顯然也會(huì)造成安全方面的影響,包括影響到宿主機(jī)上 Docker以外的進(jìn)程

    數(shù)據(jù)覆蓋問(wèn)題

    • 如果掛載一個(gè)空的數(shù)據(jù)卷到容器中的一個(gè)非空目錄中,那么這個(gè)目錄下的文件會(huì)被復(fù)制到數(shù)據(jù)卷中
    • 如果掛載一個(gè)非空的數(shù)據(jù)卷到容器中的一個(gè)目錄中,那么容器中的目錄會(huì)顯示數(shù)據(jù)卷中的數(shù)據(jù)。
    • 如 果原來(lái)容器中的目錄有數(shù)據(jù),那么原始數(shù)據(jù)會(huì)被隱藏掉

    語(yǔ)法

    docker run -v /宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄 鏡像名

    運(yùn)行鏡像mysql

    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

    • 使用該參數(shù),container內(nèi)的root擁有真正的root權(quán)限。
    • 否則,container內(nèi)的root只是外部的一個(gè)普通用戶(hù)權(quán)限。
    • privileged啟動(dòng)的容器,可以看到很多host上的設(shè)備,并且可以執(zhí)行mount。
    • 甚至允許你在docker容器中啟動(dòng)docker容器

    容器目錄權(quán)限

    通過(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ú)法操作!

    宿主機(jī)數(shù)據(jù)卷

    maven私服搭建

    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)。

    命名的數(shù)據(jù)卷

    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

    匿名數(shù)據(jù)卷

    ## 運(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

    清理數(shù)據(jù)卷

    刪除上面創(chuàng)建的容器后會(huì),發(fā)現(xiàn)數(shù)據(jù)卷仍然存在,我們就需要去清理它,不然會(huì)占用我們的資源

    docker volume ls
    清理數(shù)據(jù)卷
    docker volume prune
    docker volume ls

    數(shù)據(jù)卷容器

    如果用戶(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)。

    基礎(chǔ)鏡像

    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)修改

    Docker-Compose

    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ǔ)和管理。

    docker compose安裝

    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

    ##docker-compose卸載只需要?jiǎng)h除二進(jìn)制文件就可以了。
    rm -rf /usr/local/bin/docker-compose
    ## 重啟
    reboot

    yml配置文件及常用指令

    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

    • version 是必須指定的,而且總是位于文件的第一行。它定義了 Compose 文件格式(主要是 API)的版本。注意,version 并非定義 Docker Compose 或 Docker 引擎的版本號(hào)。
    • services 用于定義不同的應(yīng)用服務(wù)。上邊的例子定義了兩個(gè)服務(wù):一個(gè)名為 lagou-mysql數(shù)據(jù)庫(kù)服 務(wù)以及一個(gè)名為lagou-eureka的微服。Docker Compose 會(huì)將每個(gè)服務(wù)部署在各自的容器中。
    • networks 用于指引 Docker 創(chuàng)建新的網(wǎng)絡(luò)。默認(rèn)情況下,Docker Compose 會(huì)創(chuàng)建 bridge 網(wǎng)絡(luò)。 這是一種單主機(jī)網(wǎng)絡(luò),只能夠?qū)崿F(xiàn)同一主機(jī)上容器的連接。當(dāng)然,也可以使用 driver 屬性來(lái)指定不 同的網(wǎng)絡(luò)類(lèi)型。
    • volumes 用于指引 Docker 來(lái)創(chuàng)建新的卷
    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]

    反向代理案例

    運(yùn)行鏡像

    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

    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 *;
    }
    }

    docker-compose

    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

    私服搭建

    官網(wǎng)私服

    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

    添加私服倉(cāng)庫(kù)地址

    編輯配置文件 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

    瀏覽器測(cè)試

    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

    harbor私服搭建

    harbor官網(wǎng)地址

    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

    安裝harbor

    HTTP方式安裝

    ##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

    新建項(xiàng)目

    在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

    harbor企業(yè)級(jí)部署

    默認(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

    Dockerfile

    基于已有的鏡像創(chuàng)建

    修改現(xiàn)有nginx鏡像

    ## 從私服拉取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

    創(chuàng)建新鏡像

    commit命令

    docker commit :從容器創(chuàng)建一個(gè)新的鏡像

    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

    常用參數(shù)

    • -a :提交的鏡像作者;
    • -c :使用Dockerfile指令來(lái)創(chuàng)建鏡像;
    • -m :提交時(shí)的說(shuō)明文字;
    • -p :在commit時(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

    官網(wǎng)地址

    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的基本結(jié)構(gòu)

    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í)行指令 。

    Dockerfile文件說(shuō)明

    Docker以從上到下的順序運(yùn)行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個(gè)聲 明以 # 字符開(kāi)頭則被視為注釋。可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指 令。

    修改mysql官網(wǎng)鏡像時(shí)區(qū)

    FROM mysql:8.0
    MAINTAINER mysql from date UTC by Asia/Shanghai "C.X.L"
    ENV TZ Asia/Shanghai

    build命令

    docker build 命令用于使用 Dockerfile 創(chuàng)建鏡像。

    語(yǔ)法

    docker build [OPTIONS] PATH | URL | -

    常用參數(shù)

    build命令參數(shù)特別多。這里只給大家介紹幾個(gè)常用的參數(shù),如果小伙伴們想了解更多內(nèi)容,請(qǐng)參考 docker官網(wǎng)手冊(cè)。

    • --build-arg=[] :設(shè)置鏡像創(chuàng)建時(shí)的變量;
    • -f :指定要使用的Dockerfile路徑;
    • --rm :設(shè)置鏡像成功后刪除中間容器(刪除構(gòu)建鏡像時(shí)所依賴(lài)的容器);
    • --tag, -t: 鏡像的名字及標(biāo)簽,通常 name:tag 或者 name 格式;可以在一次構(gòu)建中為一個(gè)鏡像設(shè)置 多個(gè)標(biāo)簽。

    制作鏡像

    docker build --rm -t 8.135.3.67:5000/xl/mysql:8.0 .
    ## .指運(yùn)行當(dāng)前目錄下的Dockerfile

    運(yùn)行鏡像

    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í)間一致。

    idea集成docker

    修改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

    配置idea

    配置插件

    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)操作。

網(wǎng)站首頁(yè)   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶(hù)案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話(huà):010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有