整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          配置Kubernetes動態存儲卷遇坑記錄


          ,配置的過程

          1. 創建RBAC授權
          wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/rbac.yaml
          kubectl apply -f rbac.yaml
          
          1. 創建StorageClass

          sotrageclass.yaml:

          
          apiVersion: storage.k8s.io/v1
          kind: StorageClass
          metadata:
            name: nfs-storage
          provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
          parameters:
            archiveOnDelete: "false"
          reclaimPolicy: Delete
          
          1. 創建provisioner

          該provisioner將會自動創建pv,以 ?namespace?{pvcName}-${pvName} 的命名格式創建在 NFS 服務器的 /mnt/storage 目錄上。

          nfs-provisioner-deploy.yaml:

          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: nfs-provisioner
            labels:
              app: nfs-provisioner
            # replace with namespace where provisioner is deployed
            namespace: default
          spec:
            replicas: 1
            strategy:
              type: Recreate
            selector:
              matchLabels:
                app: nfs-provisioner
            template:
              metadata:
                labels:
                  app: nfs-provisioner
              spec:
                serviceAccountName: nfs-provisioner
                containers:
                  - name: nfs-provisioner
                    image: quay.io/external_storage/nfs-client-provisioner:latest
                    volumeMounts:
                      - name: nfs-root
                        mountPath: /persistentvolumes
                    env:
                      - name: PROVISIONER_NAME
                        value: fuseim.pri/ifs
                      - name: NFS_SERVER
                        value: 10.1.36.89
                      - name: NFS_PATH
                        value: /mnt/storage
                volumes:
                  - name: nfs-root
                    nfs:
                      server: 10.1.36.89
                      path: /mnt/storage
          
          1. 創建有狀態應用

          nfs-statefulset.yaml:

          apiVersion: v1
          kind: Service
          metadata:
            name: nginx
            labels:
              app: nginx
          spec:
            ports:
            - port: 80
              name: web
            clusterIP: None
            selector:
              app: nginx
          ---
          apiVersion: apps/v1
          kind: StatefulSet
          metadata:
            name: nfs-web
          spec:
            serviceName: "nginx"
            replicas: 3
            selector:
              matchLabels:
                app: nfs-web # has to match .spec.template.metadata.labels
            template:
              metadata:
                labels:
                  app: nfs-web
              spec:
                terminationGracePeriodSeconds: 10
                containers:
                - name: nginx
                  image: nginx:1.7.9
                  ports:
                  - containerPort: 80
                    name: web
                  volumeMounts:
                  - name: www
                    mountPath: /usr/share/nginx/html
            volumeClaimTemplates:
            - metadata:
                name: www
                annotations:
                  volume.beta.kubernetes.io/storage-class: nfs-storage
              spec:
                accessModes: [ "ReadWriteOnce" ]
                resources:
                  requests:
                    storage: 1Gi
          

          二,遇到的問題

          啟動后,發現創建的PVC狀態一直處于pending狀態。

          排查步驟:

          1. Kubectl describe pvc,發現報錯信息:waiting for a volume to be created, either by external provisioner “fuseim.pri/ifs” or manually created by system administrator
          2. Kubectl log pod,發現報錯信息:unexpected error getting claim reference: selfLink was empty, can’t make reference

          利用以上信息,找到相關線索:

          kubernetes版本在v1.20起,默認禁止使用SelfLinks。

          三,解決的方法

          想辦法開啟SelfLinks。這里提供三種思路

          1. Yaml部署-修改 kube-apiserver.yaml 文件

          一般在 /etc/kubernetes 下,可以 find / -name kube-apiserver.yaml 全局搜索,添加如下內容,然后重啟kube-apiserver服務即可

          1. 二進制部署-修改kube-apiserver.service

          如果沒有找到kube-apiserver.yaml文件,比如通過二進制部署的,可以全局搜索 kube-apiserver.service (一般在 /etc/systemd/system/kube-apiserver.service),添加如下內容即可。修改完記得systemctl daemon-reload一下,并重啟kube-apiserver服務

          1. Rancher部署-修改cluster.yml

          如果是用rancher部署的,那么需要修改其cluster.yml文件如下,然后更新配置:./rke up

          問題解決

          四,阿里云部署

          以上是基于本地部署的k8s進行的動態存儲配置,如果是在阿里云上,可以參考:

          https://help.aliyun.com/document_detail/204404.html#title-g3c-55i-xs6

          眾號:滲透師老A
          專注分享滲透經驗,干貨技巧...
          .

          進入內網之后、是一種由點到線再到面的測試,先弄清楚當前機器的情況,如在域中角色、提供的服務等信息;

          再以此為跳板收集其它機器的信息,當收集的信息足夠多,拿下域控的可能型也就越高。

          一.本機信息收集


          為了后續的提權等操作,首先要盡可能拿下當前機器的權限,所以對當前機器的信息收集也是必要的。


          |查看系統配置信息

          ssysteminfo 查看系統信息,但是內容太多在某些時刻無法通過菜刀等工具看到返回的結果

          可以將內容輸出到某個文件,也可以結合findstr 查詢指定內容

          如查詢操作系統即軟件的信息 systeminfo | findstr /B /C:"OS"

          該指令輸入的內容是比較多的,除了使用finder選擇輸出外,部分信息可以使用其它指令單獨顯示

          比如echo %processor_architecture%查看系統架構,net statistics workstation查看系統啟動時間

          其中的補丁信息可以使用wmic qfe get caption,description,hotfixid,installedon獲取

          WMIC擴展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了從命令行接口和批命令腳本執行系統管理的支持。

          在cmd中有些時候查到的數據不全,如某些進程的pid,這時可以使用wmic進行操作,WMIC提供了大量的全局開關、別名、動詞、命令和豐富的命令行幫助增強用戶接口。

          wmic product get name,version,查看系統安裝的軟件版本等內容。

          wmic /node:localhost /namespace:\root\securitycenter2 path antivirusproduct get displayname /format:list查殺軟

          初次之外,還可以使用netsh firewall show confignetsh advfirewall firewall show config查看防火墻配置信息

          |查看系統服務信息

          wmic startup get command,caption,查看啟動程序信息

          wmic service list brief,查詢本機服務信息

          還可以使用tasklist 查詢進程信息
          schtasks /query /fo LIST /V,查看計劃任務

          netstat -ano查看端口列表

          注意,一般查看進程端口,先查進程pid,在根據pid查端口

          |查看系統登錄信息

          query user,登錄到系統的用戶信息


          net session,列出連接會話信息,但是一般需要高權限才能執行

          |自動信息收集

          很多后滲透模塊都可以進行信息收集,這里不談,分享個嫖到的腳本

          for /f "delims=" %%A in ('dir /s /b %WINDIR%\system32\*htable.xsl') do set "var=%%A"
          
          wmic process get CSName,Description,ExecutablePath,ProcessId /format:"%var%" >> out.html
          wmic service get Caption,Name,PathName,ServiceType,Started,StartMode,StartName /format:"%var%" >> out.html
          wmic USERACCOUNT list full /format:"%var%" >> out.html
          wmic group list full /format:"%var%" >> out.html
          wmic nicconfig where IPEnabled='true' get Caption,DefaultIPGateway,Description,DHCPEnabled,DHCPServer,IPAddress,IPSubnet,MACAddress /format:"%var%" >> out.html
          wmic volume get Label,DeviceID,DriveLetter,FileSystem,Capacity,FreeSpace /format:"%var%" >> out.html
          wmic netuse list full /format:"%var%" >> out.html
          wmic qfe get Caption,Description,HotFixID,InstalledOn /format:"%var%" >> out.html
          wmic startup get Caption,Command,Location,User /format:"%var%" >> out.html
          wmic PRODUCT get Description,InstallDate,InstallLocation,PackageCache,Vendor,Version /format:"%var%" >> out.html
          wmic os get name,version,InstallDate,LastBootUpTime,LocalDateTime,Manufacturer,RegisteredUser,ServicePackMajorVersion,SystemDirectory /format:"%var%" >> out.html
          wmic Timezone get DaylightName,Description,StandardName /format:"%var%" >> out.html
          

          復制為bat文件,結果為out.html保存在c盤根目錄,名稱路徑可自行修改。

          二.域內信息收集

          |判斷是否存在域

          whoami,如果當前賬戶為域用戶,則返回結果通常為域名\用戶名


          ipconfig,如果是雙網卡,一般存在內網


          systeminfo,如果在域中,則如圖,否則為workgroup


          net config workstation,在域中,通常計算機全名為計算機名.域名

          不在域中如下圖

          net time /domain,查看時間服務器,域中機器的dns服務器和時間服務器通常為域控機。

          如下圖則是存在域且當前登錄用戶為域用戶

          如下圖則表示不在域中

          如下圖則表示在域中,但當前用戶非域用戶


          除此之外,收集其它內容的時候都能看到,比如系統信息,用戶信息等

          |探測域內存主機&端口

          探測存活主機和端口平時最容易想到的工具是nmap,但這個工具太大,直接安裝存在風險,端口轉發受限于網絡環境,這里聊聊其它方法

          powershell

          powershell可以在滲透中提供強大的助力,下面這些腳本使用的時候記得修改 ip地址

          掃描存活ip,最前面的1..255是ip地址的d段,最后范圍是192.168.0.1-255,判斷和修改方式下同

          1..255 | % {echo "192.168.0.$_"; ping -n 1 -w 100 192.168.0.$_} | Select-String ttl
          

          判斷主機類型,根據ttl值判斷,范圍192.168.0.1-255

          1..255 | % {echo "192.168.0.$_"; ping -n 1 -w 100 192.168.0.$_} | Select-String ttl |% { if ($_ -match "ms") { $ttl = $_.line.split('=')[2] -as [int]; if ($ttl -lt 65) { $os = "linux"} elseif ($ttl -gt 64 -And $ttl -lt 129) { $os = "windows"} else {$os = "cisco"}; write-host "192.168.0.$_ OS:$os" ; echo "192.168.0.$_" >> scan_results.txt }}
          

          掃描端口

          24..25 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.1.119",$_)) "Port $_ is open!"} 2>$null
          
          24..25 |% {echo "$_ is "; Test-NetConnection -Port $_ -InformationLevel "Quiet" 192.168.1.119}2>null
          

          掃描指定端口的ip

          foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.0.$ip}
          

          arp掃描

          在內網里通常使用mac地址進行機器尋找,其可以通過arp協議實現

          小工具

          由很多免安裝的小工具也可以進行掃描,比如nbtscan,直接傳到目標服務器上運行即可,工具下載地址:http://www.unixwiz.net/tools/nbtscan.html

          用法:nbtscan.exe 網段更多用法參考:nbgtscam.exe /?


          含義如下:
          |Token|含義|
          |——|——|
          SHARING|機器正在運行的文件和打印共享服務,但這并不一定有內容共享
          DC|機器可能是Windows NT域控制器,無論是主域還是輔助域。
          U=user |機器可能有一個具有指定名稱的登錄用戶
          IIS |機器可能安裝了Microsoft的Internet信息服務器(IIS)
          EXCHANGE |機器可能安裝Microsoft Exchange
          NOTES |單機器可能安裝Lotus Notes電子郵件客戶端
          ? |沒有識別出NETBIOS資源

          telnet

          telnet常規使用是和服務器建立連接,也開業用來探測端口是否開放
          用法:
          telnet 主機 端口telnet dc 3389

          注意:不是所有機器都安裝了此服務。

          |查看用戶&機器&會話相關信息

          查看機器相關信息

          net view /domain,查詢域信息,判斷當前機器加入的域


          net view /domain:域名,查詢域內所有主機


          在域中,有一類至關重要的機器叫域控制器,簡稱域控,機器名通常為DC,在實際環境中,域控為一主一備用兩臺。

          netdom query pdc,查看域控名稱

          查看用戶相關信息

          net user查詢當前機器所有用戶net user /domain查看域用戶

          net user 用戶名查看當前機器內的用戶信息


          net user 用戶名 /domain查看當前機器內的域用戶信息


          注意對比上述結果的區別,此外net user localgroup,net user localgroup /domainnet group /domain也是有區別的

          wmic useraccount get /all,獲取域內用戶的詳細信息

          、基礎概念理解

          1.1、鏡像 image

          1.2、容器 container

          1.3、倉庫 repository

          2、docker安裝

          參考鏈接:

          https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11FUZo7g


          系統環境:docker最低支持centos7且在64位平臺上,內核版本在3.10以上。

          可以通過命令 uname -a 查看版本情況,通過 cat /etc/issue 查看操作系統

          [root@node6 ~]# uname -a
          Linux node6 3.10.0-1062.4.1.el7.x86_64 #1 SMP Fri Oct 18 17:15:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
          [root@node6 ~]# cat /etc/issue
          \S
          Kernel \r on an \m

          安裝、運行、停止

          # 安裝docker
          yum install -y docker  或者  yum install -y docker-io
          # 啟動docker 
          systemctl start docker 
          # 重啟docker
          systemctl restart docker
          # 停止docker 
          systemctl stop docker
          # 查看docker啟動狀態
          docker version 

          如果安裝完成后啟動報如下錯誤:

          Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service"

          按以下步驟解決:

          第一步:yum remove docker-* 卸載docker。

          第二步:yum update 更新linux系統內核的版本。

          然后按照上面的安裝步驟重新安裝啟動即可。

          配置鏡像加速器

          國內從 Docker Hub 拉取鏡像有時會遇到困難,此時可以配置鏡像加速器。找個國內可使用的鏡像加速器地址,以centos為例來看怎們進行配置,鏡像加速器可以配置多個:

          #國內加速地址
          #Docker中國區官方鏡像
          https://registry.docker-cn.com
          #網易
          http://hub-mirror.c.163.com
          #ustc
          https://docker.mirrors.ustc.edu.cn
          #中國科技大學
          https://docker.mirrors.ustc.edu.cn
          #阿里云容器服務
          https://cr.console.aliyun.com/
          vi /etc/docker/daemon.json
          然后編輯輸入:
          {
            "registry-mirrors": [
              "https://hub-mirror.c.163.com"
            ]
          }

          3、docker容器基本操作命令

          3.1、常用命令

          docker search hello-world  # 搜索hello-world的鏡像
          docker pull hello-docker # 獲取centos鏡像
          docker run  hello-world   #運行一個docker鏡像,產生一個容器實例(也可以通過鏡像id前三位運行)
          docker image ls  # 查看本地所有鏡像
          docker images  # 查看docker鏡像
          docker image rmi hello-docker # 刪除centos鏡像
          docker ps  #列出正在運行的容器(如果創建容器中沒有進程正在運行,容器就會立即停止)
          docker ps -a  # 列出所有運行過的容器記錄
          docker ps -l #查看最新創建的容器
          docker ps -n=xxx #查看最新創建的n個容器
          docker save centos > /opt/centos.tar.gz  # 導出docker鏡像至本地
          docker load < /opt/centos.tar.gz   #導入本地鏡像到docker鏡像庫
          docker stop  `docker ps -aq`  # 停止所有正在運行的容器
          docker  rm `docker ps -aq`    # 一次性刪除所有容器記錄
          docker rmi  `docker images -aq`   # 一次性刪除所有本地的鏡像記錄

          3.2、容器創建、啟動、重啟、停止、刪除

          3.2.1、先創建、在啟動

          創建容器如下:

          docker create nginx   #創建一個nginx容器,這個時候創建的容器處于停止狀態,未啟動,這種創建方式容器名稱隨機生成,也可以自定義容器名稱,如下:
          docker create --name=nginx nginx

          啟動容器如下:

          使用 `docker start` 命令結合容器 id 或者容器 name 可以啟動一個容器。
          一般來說,第一次可以使用 docker run 啟動一個容器,以后直接使用 docker start 即可。

          3.2.2、創建啟動一步到位

          3.2.2.1、后臺型容器

          docker run --name nginx1 -d -p 8080:80 nginx

          --name 表示創建的容器的名字,-d 表示容器在后臺運行,-p 表示將容器的 80 端口映射到宿主機的 8080 端口。

          3.2.2.2、交互型容器

          docker run --name ubuntu -it ubuntu /bin/bash

          參數含義和后臺型容器描述一致,除了 -it,-it 參數,i 表示開發容器的標準輸入(STDIN),t 則表示告訴docker,為容器創建一個命令行終端。

          想要退出該終端,只需要輸入 exit命令即可。

          3.2.3、重啟容器

          容器在運行過程中,會不可避免的出問題,出了問題時,需要能夠自動重啟,在容器啟動時使用 –restart 參數可以實現這一需求。根據 docker 官網的解釋,docker 的重啟策略可以分為 4 種,如下圖:

          四種的含義分別如下:

          no表示不自動重啟容器,默認即此。

          on:failure:[max-retries]表示在退出狀態為非0時才會重啟(非正常退出),有一個可選擇參數:最大重啟次數,可以設置最大重啟次數,重啟次數達到上限后就會放棄重啟。

          always表示始終重啟容器,當docker守護進程啟動時,也會無論容器當時的狀態為何,都會嘗試重啟容器。

          unless-stopped表示始終重啟容器,但是當docker守護進程啟動時,如果容器已經停止運行,則不會去重啟它。

          3.2.4、停止容器

          使用 `docker stop` 命令結合容器 id 或者容器 name 可以終止一個容器。

          3.2.5、刪除容器

          3.2.5.1、單個刪除

          docker rm 命令結合容器 id 或者容器 name 可以刪除一個容器。刪除容器時,只能刪除已經停止運行的容器,不能刪除正在運行的容器。
          如果非要刪除一個正在運行的容器,可以通過 -f 參數實現,例如 docker rm -f nginx

          3.2.5.2、批量刪除

          容器也可以批量刪除,命令如下:

          docker rm $(docker ps -a -q)

          docker ps -a -q 會列出所有容器的 id ,供 rm 命令刪除。

          如下命令也支持刪除已退出的孤立的容器:

          docker container prune

          3.3、參考實戰

          摘自方志朋博客,參考地址:https://www.fangzhipeng.com/docker/2018/09/12/docker-action.html

          docker run -p 80:80 -d  docker.io/nginx
          docker cp index.html containerId://usr/share/nginx/html #用于主機和容器之間拷貝數據
          docker exec -it containeId /bin/bash
          docker images
          docker ps [-a -q]
          docker stop containerId
          docker rm containerId
          docker rmi imagesId
          
          docker commit –m ’msg’ containerId [name] 
          docker build
          docker pull
          docker push
          docker login

          4、docker容器高級操作命令

          4.1、容器內執行命令

          docker exec -it ubuntu /bin/bash

          4.2、查看容器信息

          容器創建成功后,用戶可以通過 `docker inspect` 命令查看容器的詳細信息,這些詳細信息包括容器的id 、容器名、環境變量、運行命令、主機配置、網絡配置以及數據卷配置等信息。
          例如查看unbutu的容器信息, docker inspect ubuntu

          使用 format 參數可以只查看用戶關心的數據,例如:

          #查看容器運行狀態
          docker inspect -f='{{.State.Running}}' ubuntu 
          #查看容器IP地址
          docker inspect -f='{{.NetworkSettings.IPAddress}}' ubuntu 
          #查看容器名稱、ID
          docker inspect -f='{{.Name}} {{.ID}}' ubuntu 
          #查看容器主機信息
          docker inspect -f='{{.HostConfig}}' ubuntu

          4.3、查看容器進程

          #使用 docker top 命令可以查看容器中正在運行的進程,首先確保容器已經啟動,然后執行 docker top 命令,例如:
          docker top ubuntu

          4.4、查看容器日志

          #交互型容器查看日志很方便,因為日志就直接在控制臺打印出來了,但是對于后臺型容器,如果要查看日志,則可以使用docker提供的 docker logs 命令來查看,例如:
          docker logs ubuntu
          #默認情況下只能查看到歷史日志,無法查看實時日志。使用 -f 參數后,就可以查看實時日志,使用 --tail 參數可以精確控制日志的輸出行數, -t 參數則可以顯示日志的輸出時間,示例:
          docker logs -f --tail=3 -t ubuntu 
          

          4.5、導出容器

          #參考命令,將nginx容器導出到/home/docker目錄下
          docker export nginx > /home/docker/nginx.tar

          4.6、導入容器

          #通過執行如下命令可以導入容器(如果自己重新導入,需要記得將 docker 中和 nginx 相關的容器和鏡像刪除):
          cat nginx.tar | docker import - importednginx:ilatest
          #這里需要注意nginx.tar所在目錄
          #導入成功后就可以使用 docker run命令進行運行了。

          5、docker鏡像基本操作

          5.1、鏡像查看

          #查看本地所有鏡像
          docker images
          #如果鏡像過多,可以通過通配符進行匹配
          docker images n*

          5.2、鏡像下載

          #可以首先通過命令查找鏡像,例如:
          docker search nginx
          #然后可以根據查詢的結果,拉取鏡像到本地
          docker pull nginx

          5.3、鏡像刪除

          #鏡像可以通過 docker rmi 命令進行刪除,參數為鏡像的id或者鏡像名,參數可以有多個,多個參數之間用空格隔開。例如:
          docker rmi nginx
          #如果無法刪除一個鏡像,大部分原因是因為該鏡像被一個容器所依賴,此時需要先刪除容器,然后就可以刪除鏡像了

          5.4、鏡像創建

          # 一般采用Dockerfile方式,或者使用Jib方式去構建鏡像。
          # 如果是用單獨Dockerfile文件方式構建鏡像,可以使用如下命令:
          docker build -t mk/nginx1:v2 .
          # -t 參數用來指定鏡像的命名空間,倉庫名以及 TAG 等信息。
          # 最后面的 . 是指鏡像構建上下文。也就是要打包的所有內容所在路徑

          6、DockerHub 與容器網絡

          6.1、簡介、登錄、上傳、下載鏡像

          Docker Hub 提供鏡像托管服務,類似GitHub,Docker Hub 地址為 https://hub.docker.com/

          利用 Docker Hub 讀者可以搜索、創建、分享和管理鏡像。Docker Hub 上的鏡像分為兩大類,一類是官方鏡像,例如nginx、mysql 等,還有一類是普通用戶鏡像,普通用戶鏡像由用戶自己上傳。對于國內用戶,如果覺得 Docker Hub 訪問速度過慢,可以使用國內一些公司提供的鏡像。

          例如網易:https://c.163yun.com/hub#/m/home/

          接下來以Docker Hub官方鏡像站來做演示如下:

          # 先注冊一個賬戶
          https://hub.docker.com/
          # 然后在命令行輸入以下命令進行登錄,提示Login Succeeded,說民登錄成功
          docker login
          # 接下來就可以使用 push 命令上傳我們自制的鏡像了。注意,自制的鏡像要能夠上傳,命名必須滿足規范,即 namespace/name 格式,其中 namespace 必須是注冊的用戶名,例如:
          docker push mk809311844265/nginx2:v2
          # 然后在https://hub.docker.com/官方的Repositories中就可以看到上傳的鏡像了,之后可以通過pull拉下來上傳的鏡像文件,例如:
          docker pull mk809311844265/nginx2:v2

          6.2、自動化構建鏡像

          自動化構建,就是使用 Docker Hub 連接一個包含 Dockerfile 文件的 GitHub 倉庫或者 BitBucket 倉庫, Docker Hub 則會自動構建鏡像,通過這種方式構建出來的鏡像會被標記為 Automated Build ,也稱之為受信構建 (Trusted Build) ,這種構建方式構建出來的鏡像,其他人在使用時可以自由的查看 Dockerfile 內容,知道該鏡像是怎么來的,同時,由于構建過程是自動的,所以能夠確保倉庫中的鏡像都是最新的。實際意義不大,因為一般的公司環境鏡像都是需要保密私有的有知識產權的,所以構建本地鏡像倉庫就成為一個企業應用的必選方案。

          6.3、構建自己的 DockerHub

          Docker 官方已經將 Docker 注冊服務器做成鏡像了,我們直接 pull 下來運行即可。

          # 第一步:拉取鏡像
          docker pull registry
          # 第二步:實例化容器運行起來
          docker run -itd --name registry -p 5000:5000 docker.io/registry
          # 第三步:標記本地鏡像,以nginx為例
          docker tag docker.io/nginx:latest 127.0.0.1:5000/docker.io/nginx:latest
          # 第四步:上傳本地鏡像,以nginx為例
          docker push 127.0.0.1:5000/docker.io/nginx:latest
          # 第五步: 查看本地倉庫中的鏡像
          curl 127.0.0.1:5000/v2/_catalog
          # 第六步: 下載本地倉庫的鏡像,實現使用 docker images命令查看,發現剛才push的鏡像已經在本地鏡像存在了,所以需要 docker rmi 命令先去刪除該鏡像,然后在從本地鏡像倉庫中下載
          docker rmi 127.0.0.1:5000/docker.io/nginx
          docker pull 127.0.0.1:5000/docker.io/nginx
              
          # 特別說明,如果要在外網可以訪問,需要對外開放端口訪問
          /sbin/iptables -I INPUT -p tcp --dport 5000 -j ACCEPT
          

          設置私有倉庫的用戶名、密碼(該內容不完善,未完待續)

          參考如下地址:https://blog.csdn.net/qq_38637558/article/details/99603071

          # 第一步:掛載相關的配置,這里注意/docker/registry/auth目錄在根目錄下,和home目錄平級
          mkdir -p  /docker/registry/auth
          # 第二步:生成賬號密碼
          docker run --entrypoint htpasswd registry:latest -Bbn mk192837 mk_own_123  >> /docker/registry/auth/htpasswd
          # 第三步:設置配置文件
          mkdir -p  /docker/registry/config
          vi  /docker/registry/config/config.yml     ,然后輸入以下內容:
          
          ================================start===================================
          version: 0.1
          log:
            fields:
              service: registry
          storage:
            delete:
              enabled: true
            cache:
              blobdescriptor: inmemory
            filesystem:
              rootdirectory: /var/lib/registry
          http:
            addr: :5000
            headers:
              X-Content-Type-Options: [nosniff]
          health:
            storagedriver:
              enabled: true
              interval: 10s
          threshold: 3
          ==================================end===================================    
          
          # 第四步:啟動registry容器
          docker run -d -p 5000:5000 --restart=always  --name=registry \
          -v /docker/registry/config/:/etc/docker/registry/ \
          -v /docker/registry/auth/:/auth/ \
          -e "REGISTRY_AUTH=htpasswd" \
          -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
          -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
          -v /docker/registry/:/var/lib/registry/ \
          registry
          
          # 第五步:開啟 http 形式訪問私有倉庫模式
          vi /etc/docker/daemon.json
          # 然后添加如下內容:
          {
            "insecure-registries": [
              "192.168.42.105:5000"
            ]
          }
          # 然后執行如下命令,使配置立刻生效
          systemctl daemon-reload
          # 重啟docker
          systemctl restart docker


          6.3.1、暴露網絡端口(補充知識)

          # 暴露網絡端口的參數有兩個,分別是 `-p` 和 `-P` 。
          
          # 使用 -P,Docker 會在宿主機上隨機為應用分配一個未被使用的端口,并將其映射到容器開放的端口,以 Nginx 為例,例如:
          docker run -itd --name nginx -P nginx
          # 這個時候docker為應用分配了一個隨機端口
          
          # -p 參數則有幾種不同的用法:
          # 第一種: hostPort:containerPort  這種用法是將宿主機端口和容器端口綁定起來,示例:
          docker run -itd --name nginx -p 80:80 nginx
          # 第二種: ip:hostPort:containerPort  這種是將指定的 ip 地址的端口和容器的端口進行映射,將 192.168.42.1 地址的80端口映射到容器的80端口上,示例:
          docker run -itd --name nginx -p 192.168.42.1:80:80 nginx
          # 第三種:ip::containerPort  這種是將指定 ip 地址的隨機端口映射到容器的開放端口上,示例:
          docker run -itd --name nginx -p 192.168.42.1::80 nginx

          7、Docker 數據卷操作

          7.1、指定數據卷

          # 運行nginx容器,并指定一個nginx數據卷
          docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 nginx
          # 查看數據卷映射目錄
          docker inspect nginx
          # 如下結果,查看Mounts里的Source即可。
          "Mounts": [
              {
                  "Type": "volume",
                  "Name": "eab348836a0c996cdf23aea6983cf5601ec4a571b92f9e610aa19f869d09e653",
                  "Source": "/var/lib/docker/volumes/eab348836a0c996cdf23aea6983cf5601ec4a571b92f9e610aa19f869d09e653/_data",
                  "Destination": "/usr/share/nginx/html",
                  "Driver": "local",
                  "Mode": "",
                  "RW": true,
                  "Propagation": ""
              }
          ]

          7.2、結合宿主機目錄

          上文中對于數據卷的用法還不是最佳方案,一般來說,我們可能需要明確指定將宿主機中的一個目錄掛載到容器中,這種指定方式如下:

          docker run -itd --name nginx -v /home/docker/html:/usr/share/nginx/html/ -p 80:80 nginx

          這樣便是將宿主機中的 /home/docker/html 目錄掛載到容器的 /usr/share/nginx/html/ 目錄下。接下來只需要在 /home/docker/html 目錄下添加 html 文件,或者修改 html 文件,都能在 nginx 訪問中立馬看到效果。

          這種用法對于開發測試非常方便,不用重新部署,重啟容器等。

          注意:宿主機地址是一個絕對路徑

          7.3、Dockerfile中的數據卷

          如果開發者使用了 Dockerfile 去構建鏡像,也可以在構建鏡像時聲明數據卷,例如下面這樣:

          FROM nginx
          ADD https://www.baidu.com/img/bd_logo1.png /usr/share/nginx/html/
          RUN echo "hello docker volume!">/usr/share/nginx/html/index.html
          VOLUME /usr/share/nginx/html/

          這樣就配置了一個匿名數據卷,運行過程中,將數據寫入到 /usr/share/nginx/html/ 目錄中,就可以實現容器存儲層的無狀態變化。

          7.4、查看所有數據卷

          # 采用如下命令
          docker volume ls

          7.5、查看數據卷詳情

          # 根據 volume name 可以查看數據詳情
          docker volume inspect f38d71202a6d55234417cede029dfa465884746c2dd4d4119a40770435950829

          7.6、刪除數據卷

          # 可以使用 docker volume rm 命令刪除一個數據卷,也可以使用 docker volume prune 批量刪除數據卷,如下:
          docker volume rm f38d71202a6d55234417cede029dfa465884746c2dd4d4119a40770435950829
          # 或者
          docker volume prune
          # 批量刪除時,如果未能刪除掉所有的數據卷,因為該數據卷還在使用中,將相關的容器停止并移除,再次刪除數據卷就可以成功刪除了

          7.7、數據卷容器

          數據卷容器是一個專門用來掛載數據卷的容器,該容器主要是供其他容器引用和使用。所謂的數據卷容器,實際上就是一個普通的容器,舉例如下:

          • 創建數據卷容器
          # 使用如下方式創建數據卷容器:
          docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu
          • 引用容器
          # 使用如下命令引用數據卷容器:
          docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginx
          docker run -itd --volumes-from mydata -p 81:80 --name nginx2 nginx

          此時, nginx1 和 nginx2 都掛載了同一個數據卷到 /usr/share/nginx/html/ 目錄下,三個容器中,任意一個修改了該目錄下的文件,其他兩個都能看到變化。

          此時,使用 docker inspect 命令查看容器的詳情,發現三個容器關于數據卷的描述都是一致的。

          7.8、數據卷容器實現數據的備份與恢復

          7.8.1、數據備份

          docker run --volumes-from mydata --name backupcontainer -v $(pwd):/backup/ ubuntu tar cvf /backup/backup.tar /usr/share/nginx/html/
          # 首先使用 --volumes-from 連接待備份容器。
          # -v 參數用來將當前目錄掛載到容器的 /backup 目錄下。
          # 接下來,將容器中 /usr/share/nginx/html 目錄下的內容備份到 /backup 目錄下的 backup.tar 文件中,由于已經設置將當前目錄映射到容器的 /backup 目錄,因為備份在容器 /backup 目錄下的壓縮文件在當前目錄下可以立馬看到。

          備份完成后,在當前目錄下就可以看到 /backup 文件,打開壓縮文件,發現就是 /usr/share/nginx/html 目錄及內容。

          7.8.2、數據恢復

          # 步驟一:創建容器
          # 首先創建一個容器,這個容器就是要使用恢復的數據的容器,這里創建一個 nginx 容器,如下:
          docker run -itd -p 80:80 -v /usr/share/nginx/html/ --name nginx3 nginx
          # 創建一個名為 nginx3 的容器,并且掛載一個數據卷。
          
          # 步驟二:恢復
          # 數據恢復需要一個臨時容器,如下:
          docker run --volumes-from nginx3 -v $(pwd):/backup nginx tar xvf /backup/backup.tar
          
          # 命令解釋:
          # 首先還是使用 --volumes-from 參數連接上備份容器,即第一步創建出來的 nginx3 。
          # 然后將當前目錄映射到容器的 /backup 目錄下。
          # 然后執行解壓操作,將 backup.tar 文件解壓。解壓文件位置描述是一個容器內的地址,但是該地址已經映射到宿主機中的當前目錄了,因此這里要解壓縮的文件實際上就是宿主機當前目錄下的文件。

          8、Docker 容器連接

          一般來說,容器啟動后,我們都是通過端口映射來使用容器提供的服務,實際上,端口映射只是使用容器服務的一種方式,除了這種方式外,還可以使用容器連接的方式來使用容器服務。

          例如,有兩個容器,一個容器運行一個 SpringBoot 項目,另一個容器運行著 mysql 數據庫,可以通過容器連接使 SpringBoot 直接訪問到 Mysql 數據庫,而不必通過端口映射來訪問 mysql 服務。

          舉另外一個例子:

          有兩個容器,一個 nginx 容器,另一個 ubuntu ,我啟動 nginx 容器,但是并不分配端口映射,然后再啟動 ubuntu ,通過容器連接,在 ubuntu 中訪問 nginx

          具體操作步驟如下:

          • 首先啟動一個 nginx 容器,但是不分配端口,命令如下:
          docker run -d --name nginx1 nginx

          容器啟動成功后,在宿主機中是無法訪問的。如下:

          [root@node5 ~]# curl http://localhost:80
          curl: (7) Failed connect to localhost:80; Connection refused
          • 啟動ubuntu

          接下來,啟動一個 ubuntu ,并且和 nginx 建立連接,如下:

          docker run -dit --name ubuntu --link nginx1:mylink ubuntu bash

          這里使用 –link 建立連接,nginx1 是要建立連接的容器,后面的 mylink 則是連接的別名。

          運行成功后,進入到 ubuntu 命令行:

          docker exec -it ubuntu bash

          然后,有兩種方式查看 nginx 的信息:

          第一種

          在 ubuntu 控制臺直接輸入 env ,查看環境變量信息:

          MYLINK_ENV_NJS_VERSION=0.3.9
          HOSTNAME=96efd0f2f329
          MYLINK_PORT=tcp://172.17.0.4:80
          MYLINK_NAME=/ubuntu/mylink
          PWD=/
          MYLINK_PORT_80_TCP=tcp://172.17.0.4:80
          MYLINK_PORT_80_TCP_PORT=80
          HOME=/root
          MYLINK_PORT_80_TCP_PROTO=tcp
          LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
          TERM=xterm
          SHLVL=1
          MYLINK_PORT_80_TCP_ADDR=172.17.0.4
          MYLINK_ENV_PKG_RELEASE=1~buster
          PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
          MYLINK_ENV_NGINX_VERSION=1.17.10
          _=/usr/bin/env

          可以看到 docker 為 nginx 創建了一系列環境變量。每個前綴變量是 MYLINK ,這就是剛剛給連接取得別名。開發者可以使用這些環境變量來配置應用程序連接到 nginx 。該連接是安全、私有的。 訪問結果如下:

          root@96efd0f2f329:/# curl http://172.17.0.4:80
          <!DOCTYPE html>
          <html>
          <head>
          <title>Welcome to nginx!</title>
          <style>
              body {
                  width: 35em;
                  margin: 0 auto;
                  font-family: Tahoma, Verdana, Arial, sans-serif;
              }
          </style>
          </head>
          <body>
          <h1>Welcome to nginx!</h1>
          <p>If you see this page, the nginx web server is successfully installed and
          working. Further configuration is required.</p>
          
          <p>For online documentation and support please refer to
          <a href="http://nginx.org/">nginx.org</a>.<br/>
          Commercial support is available at
          <a href="http://nginx.com/">nginx.com</a>.</p>
          
          <p><em>Thank you for using nginx.</em></p>
          </body>
          </html>

          第二種

          另一種方式則是查看 ubuntu 的 hosts 文件: cat /etc/hosts,如下:

          root@96efd0f2f329:/# cat  /etc/hosts
          127.0.0.1   localhost
          ::1 localhost ip6-localhost ip6-loopback
          fe00::0 ip6-localnet
          ff00::0 ip6-mcastprefix
          ff02::1 ip6-allnodes
          ff02::2 ip6-allrouters
          172.17.0.4  mylink a918eb2fdfbc nginx1
          172.17.0.3  96efd0f2f329

          可以看到,在 ubuntu 的 hosts 文件中已經給 nginx1 取了幾個別名,可以直接使用這些別名來訪問 nginx1

          root@96efd0f2f329:/# curl http://mylink 
          <!DOCTYPE html>
          <html>
          <head>
          <title>Welcome to nginx!</title>
          <style>
              body {
                  width: 35em;
                  margin: 0 auto;
                  font-family: Tahoma, Verdana, Arial, sans-serif;
              }
          </style>
          </head>
          <body>
          <h1>Welcome to nginx!</h1>
          <p>If you see this page, the nginx web server is successfully installed and
          working. Further configuration is required.</p>
          
          <p>For online documentation and support please refer to
          <a href="http://nginx.org/">nginx.org</a>.<br/>
          Commercial support is available at
          <a href="http://nginx.com/">nginx.com</a>.</p>
          
          <p><em>Thank you for using nginx.</em></p>
          </body>
          </html>

          默認情況下,ubuntu 容器中沒有安裝 curl 命令,需要手動安裝下,安裝命令如下: apt-get update apt-get install curl

          9、Docker 容器編排入門案例

          在實際的開發環境或者生產環境,容器往往都不是獨立運行的,經常需要多個容器一起運行,此時,如果繼續使用 run 命令啟動容器,就會非常不便,在這種情況下,docker-compose 是一個不錯的選擇,使用 docker-compose 可以實現簡單的容器編排,本文就來看看 docker-compose 的使用。

          本文以 jpress 這樣一個開源網站的部署為例,向讀者介紹 docker-compose 的使用。jpress 是 Java 版的 wordPress ,不過我們不必關注 jpress 的實現,在這里我們只需要將之當作一個普通的應用即可,完成該項目的部署工作。

          步驟一:編寫Dockerfile文件

          FROM tomcat
          ADD jpress-v3.1.0.war /usr/local/tomcat/webapps/
          RUN cd /usr/local/tomcat/webapps/ \
              && mv jpress-v3.1.0.war jpress.war
          # 這里要特別注意:jpress-v3.1.0.war文件需要放在和Dockerfile同一個目錄下才可以,否則build時候會報錯。
          # 命令解釋如下:
          # 1、容器基于 Tomcat 創建。
          # 2、下載 jpress 項目的 war 包到 tomcat 的 webapps 目錄下。
          # 3、給 jpress 項目重命名。

          步驟二:編寫 docker-compose.yml

          version: "3.1"
          services:
            web:
              build: .
              container_name: jpress
              ports:
                - "8080:8080"
              volumes:
                - /usr/local/tomcat/
              depends_on:
                - db
            db:
              image: mysql
              container_name: mysql
              command: --default-authentication-plugin=mysql_native_password
              restart: always
              ports:
                - "3306:3306"
              environment:
                MYSQL_ROOT_PASSWORD: 123
                MYSQL_DATABASE: jpress
          # 這里同樣要注意,需要將docker-compose.yml文件放在和Dockerfile文件相同目錄下
          # 命令解釋如下:
          # 1、首先聲明了 web 容器,然后聲明db容器。
          # 2、build . 表示 web 容器項目構建上下文為 . ,即,將在當前目錄下查找 Dockerfile 構建 web 容器。
          # 3、container_name 表示容器的名字。
          # 4、ports 是指容器的端口映射。
          # 5、volumes 表示配置容器的數據卷。
          # 6、depends_on 表示該容器依賴于 db 容器,在啟動時,db 容器將先啟動,web 容器后啟動,這只是啟動時機的先后問題,并不是說 web 容器會等 db 容器完全啟動了才會啟動。
          # 7、對于 db 容器,則使用 image 來構建,沒有使用 Dockerfile 。
          # 8、restart 描述了容器的重啟策略。
          # 9、environment 則是啟動容器時的環境變量,這里配置了數據庫 root 用戶的密碼以及在啟動時創建一個名為 jpress 的庫,environment 的配置可以使用字典和數組兩種形式。

          步驟三:運行

          # 運行命令如下:  
          docker-compose up -d  # -d 表示在后臺運行

          步驟四:查看已運行的容器

          # 運行命令如下:
          docker-compose ps

          步驟五:重啟容器

          # 運行命令如下:
          docker restart jpress   # jpress為容器名稱

          步驟六:停止容器

          # 運行命令如下:
          docker-compose down
          更多使用命令可以采用   docker-compose --help 來查看幫助進行使用。

          特別補充:如果使用docker-compose提示“-bash: docker-compose: command not found”,那么請按照以下說明進行docker-compose安裝即可

          # 方式1:
          curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
              
          chmod +x /usr/local/bin/docker-compose
          
          # 方式2:
          1)先安裝 pip ,檢查是否已有: pip -V 
          報錯:
          -bash: pip: command not found
          安裝  pip :
          yum -y install epel-release
          yum -y install python-pip
          #升級
          pip install --upgrade pip
          2) 安裝Docker-Compose:
          pip install docker-compose
          檢查是是否成功:
          docker-compose -version

          10、Dockerfile 命令

          可以參考以下鏈接進行詳細學習:

          1、Dockerfile 指令詳解

          https://yeasy.gitbook.io/docker_practice/image/dockerfile

          2、Dockerfile指令詳解 && ENTRYPOINT 指令

          https://www.cnblogs.com/reachos/p/8609025.html

          命令用途WORKDIRRUN ENTRYPINT CMD執行的工作目錄ENV添加環境變量ADD添加文件,會解壓壓縮包COPY復制文件ONBUILD觸發器VOLUME掛載卷FROM基礎鏡像ENTRYPOINT基礎命令RUN執行命令CMD啟動程序命令,拼接在基礎命令后EXPOSE暴露端口MAINTAINER維護者


          11、參考地址

          1、https://www.runoob.com/docker/docker-tutorial.html

          2、http://www.javaboy.org/categories/docker/


          主站蜘蛛池模板: 一区二区三区影院| 国产aⅴ精品一区二区三区久久| 国产精品第一区揄拍| 麻豆国产一区二区在线观看 | 亚洲国产综合精品一区在线播放| 偷拍激情视频一区二区三区| 国产成人无码精品一区不卡| 精品伦精品一区二区三区视频 | 视频一区在线播放| 国产免费一区二区三区不卡| 清纯唯美经典一区二区| 一区二区免费视频| 国产在线无码一区二区三区视频| 精品一区二区久久| 亚洲日韩一区精品射精| 免费观看一区二区三区| 国产一区二区三区精品视频 | 亚洲av成人一区二区三区| 亚洲国产精品第一区二区| 国产aⅴ一区二区| 国产suv精品一区二区6| 无码av人妻一区二区三区四区| 日本免费一区尤物| 无码午夜人妻一区二区不卡视频| 在线精品亚洲一区二区三区| 国产精品一区不卡| 国产一区在线视频观看| 亚洲av日韩综合一区久热| 韩国福利一区二区美女视频| 国产在线不卡一区二区三区| 制服丝袜一区二区三区| 鲁丝片一区二区三区免费| 国产在线不卡一区二区三区| 日本中文字幕一区二区有码在线| 亚洲国产高清在线一区二区三区 | 久久精品无码一区二区三区日韩 | 亚洲AV日韩综合一区尤物| 精品无码人妻一区二区三区| 无码人妻精品一区二区| 亚洲熟女乱色一区二区三区 | 国产成人无码AV一区二区|