Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 在线成人精品国产区免费,九九久久99综合一区二区,久久精品国产亚洲精品2020

          整合營銷服務商

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

          免費咨詢熱線:

          nginx-3-默認網站和防盜鏈

          nginx-3-默認網站和防盜鏈

          默認網站及設置


          1 默認網站

          server {
              listen       80;
          
              server_name  localhost;
          
              location / {
          
                  root   html;
          
                  index  index.html index.htm;
          
                  #支持目錄瀏覽
                   autoindex  on;
          
              }
          
              error_page   500 502 503 504  /50x.html;
          
              location=/50x.html {
          
                  root   html;
          
              }
          
          }

          2 訪問控制

          [root@localhost ~]# mkdir /usr/local/nginx/html/a
          [root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
          location /a {
              autoindex on;
              deny 192.168.11.116;
              allow all;
              #基于客戶端IP做過濾,符合條件的允許訪問,不符合的禁止訪問
              }
          [root@localhost ~]# killall  -s HUP nginx

          3 登陸驗證

          [root@localhost ~]# mkdir /usr/local/nginx/html/c
          [root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
          location /c {
              auth_basic "登陸驗證";
              auth_basic_user_file /etc/nginx/htpasswd;
          
          }
          [root@localhost ~]# killall  -s HUP nginx

          4 日志管理

          Nginx訪問日志主要有兩個參數控制

          log_format #用來定義記錄日志的格式(可以定義多種日志格式,取不同名字即可)

          access_log #用來指定日志文件的路徑及使用的何種日志格式記錄日志

          access_log logs/access.log main;

          log_format格式變量:
              $remote_addr  #記錄訪問網站的客戶端地址
              $remote_user  #遠程客戶端用戶名
              $time_local  #記錄訪問時間與時區
              $request  #用戶的http請求起始行信息
              $status  #http狀態碼,記錄請求返回的狀態碼,例如:200、301、404等
              $body_bytes_sent  #服務器發送給客戶端的響應body字節數
              $http_referer  #記錄此次請求是從哪個連接訪問過來的,可以根據該參數進行防盜鏈設置。
              $http_user_agent  #記錄客戶端訪問信息,例如:瀏覽器、手機客戶端等
              $http_x_forwarded_for  #當前端有代理服務器時,設置web節點記錄客戶端地址的配置,此參數生效的前提是代理服務器也要進行相關的x_forwarded_for設置

          自定義一個json格式的訪問日志

          log_format main_json '{
                  "@timestamp":"$time_local",
                  "client_ip":"$remote_addr",
                  "request":"$request",
                  "status":"$status",
                  "bytes":"$body_bytes_sent",
                  "x_forwarded":"$http_x_forwarded_for",
                  "referer":"$http_referer"
                                                      }';
              access_log logs/access_json.log main_json;
          
          #重新啟動nginx服務查看訪問日志
          [root@localhost~]# tail -f /usr/local/nginx/logs/access_json.log

          5 防盜鏈

          [root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
          location / {
                      root   html;
                      index  index.html index.htm;
                  }
                  #定義訪問資源為圖片類型的
          location ~* \.(gif|jpg|png|bmp)$ {
                          #定義白名單  none代表直接訪問的,blocked表示被防火墻標記過的請求最后一個是網址
                     valid_referers none blocked *.baidu.com;
                           #如果不在白名單中則返回403
                           if ($invalid_referer) {
                                  return 403;
                                                  }
                  }
          [root@localhost ~]# killall  -s HUP nginx       
          #在另外一臺主機寫一個盜鏈測試頁面
          dnf install httpd -y
          vim /var/www/html/index.html
          <html>
                  <head>
                          <title>ce shi</title>
                          <body>
                                  <a href="http://192.168.11.16/1.png">daolian</a>
                          </body>
                  </head>
          </html>
          
          systemctl restart httpd

          總結

          nginx的默認網站

          訪問控制

          登錄驗證

          日志管理

          防盜鏈

          重點:nginx的基本功能如何實現

          難點:日志格式的定義和防盜鏈的實現



          3分鐘了解計算機發展歷史-組團學

          本人是一個程序員,職業是做網站開發。今天簡單教下大家怎么利用Windows7搭建一個屬于自己的網站,一起來感受一下動手創建一個屬于自己的網站是多么激動。

          話不多說,直接操作。首先打開控制面板,這步要是不會我就崩潰了。在控制面板中,找到程序,點進去,找到程序和功能,點開打開或關閉Windows功能

          下一步,點擊Internet信息服務,雙擊點開,然后勾選Web管理工具的所有選項,還有萬維網服務(我只勾選了重要的幾個,大家不懂可以全給勾上總不會錯)。如下圖:

          這一步就是配置,很簡單,大家有點耐心哈。繼續把我們的控制面板點開。點選系統和安全,點開管理工具,這是彈出一個框框,這里我們選擇Internet 信息服務(IIS)管理器。

          這時又彈出一個框框,我們鼠標放在網站上,右鍵選擇添加網站。這里網站名稱大家隨意發揮,物理路徑,我們可以隨意創建一個空的目錄,然后把路徑填上。(例如:我這里在D盤下創建一個Test目錄,然后物理路徑就是D:\Test)。點確定,這是彈出一個框提示80這個端口已經被占用了,這里我們不管他,繼續確定。

          做完這些步驟我們大概差不多弄好了,為了展示點東西,我們給網站加個首頁。這里,找到我們剛剛設置的物理路徑,我這里設置的是D:\Test。我在網站項目下新建一個index.html文檔,里面只有一句話Hello,World!。所有事情都弄好了,啟動我們的服務器吧。打開剛剛的Internet 信息服務(IIS)管理器,選擇Default Web Site,通過右邊的列選擇停止。這里再選我們的個人網站選擇啟動。(因為兩個默認都是使用80端口,所以不能同時啟動,為了啟動我們的網站先把其他的關了)。最后的狀態應該是我們的網站狀態是已啟動。這是打開瀏覽器訪問我們的網站看看吧,在瀏覽器中輸入localhost(或者127.0.0.1)。這兩個地址都表示本地地址,這時頁面就出現了剛剛我們建好的首頁(index.html)中輸入的Hello,World!.如果可以看到這些,恭喜大家都搭好了自己的個人網站。

          大家如果還想多學點相關的技術,歡迎關注我,咨詢討論。

          、Docker簡介

          1、背景

          物理機時代

          一個物理機上安裝操作系統,然后直接運行我們的軟件。也就是說你電腦上直接跑了一個軟件,并沒有開虛擬機什么的,資源極其浪費。

          缺點

          • 部署慢
          • 成本高

          虛擬機都不開,直接上物理機部署應用,那成本能不高嘛

          • 資源浪費

          硬件資源沒有合理利用

          • 不易遷移和增加機器

          每次遷移都要重新安裝一模一樣的運行環境等

          • 受限于硬件

          虛擬機時代

          一個物理機上虛擬化出來多個虛擬機,每個虛擬機上進行安裝操作系統,然后在虛擬機上直接運行我們的軟件。比如阿里云、騰訊云等云服務器都是虛擬機。

          特點

          • 多部署

          一個物理機上創建多個虛擬機,每個虛擬機的ip都不同,一個軟件可以在不同虛擬機上進行部署。

          • 資源隔離

          每個虛擬機都由獨立分配的內存磁盤等硬件資源,通過Hypervisor分配。

          • 易擴展

          隨時隨地都能在一個物理機上開出新的虛擬機。成本也低。

          • 成本相對較低

          缺點

          • 虛擬機需要安裝操作系統

          假設我們的應用程序只有幾KB,或者幾十MB,但是卻要在虛擬機上安裝一個幾百兆的操作系統來跑。

          容器化時代

          虛擬化技術是物理硬件的隔離,容器化技術是app層面的隔離,兩者不沖突。往往容器化時代都是基于虛擬機基礎之上做的資源隔離。它可以基于虛擬機的操作系統部署多服務,不再需要額外安裝操作系。

          特點

          • 標準化的遷移方式

          開發者將環境和程序打包給運維,運維直接執行就完事了。

          • 統一的參數配置
          • 自動化部署
          • 應用集群監控
          • 開發與運維之間的溝通橋梁

          傳統虛擬機和Docker的比較

          2、Docker是什么

          docker官方地址:https://www.docker.com/

          Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

          Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,于 2013 年 3 月以 Apache 2.0 授權協議開源,主要項目代碼在 GitHub 上進行維護。 Docker 使用 Google 公司推出的 Go 語言 進行開發實現。 ? Docker 是linux容器的一種封裝,提供簡單易用的容器使用接口。它是最流行的Linux容器解決方案。 ? Docker 的接口相當簡單,用戶可以方便的創建、銷毀容器。 ? Docker 將應用程序與程序的依賴,打包在一個文件里面。運行這個文件就會生成一個虛擬容器。程序運行在虛擬容器里,如同在真實物理機上運行一樣,有了Docker ,就不用擔心環境問題了。

          Docker concepts

          Docker is a platform for developers and sysadmins to build, run, and share applications with containers. The use of containers to deploy applications is called containerization. Containers are not new, but their use for easily deploying applications is.

          Containerization is increasingly popular because containers are:

          • Flexible: Even the most complex applications can be containerized.
          • 靈活:即使是最復雜的應用也可以集裝箱化。
          • Lightweight: Containers leverage and share the host kernel, making them much more efficient in terms of system resources than virtual machines.
          • 輕量級:容器利用并共享主機內核,使它們在系統資源方面比虛擬機效率更高
          • Portable: You can build locally, deploy to the cloud, and run anywhere.
          • 便攜式:您可以在本地構建,部署到云,并在任何地方運行
          • Loosely coupled: Containers are highly self sufficient and encapsulated, allowing you to replace or upgrade one without disrupting others.
          • 松耦合:容器是高度自給自足和封裝的,允許您更換或升級一個容器,而不會中斷其他容器。
          • Scalable: You can increase and automatically distribute container replicas across a datacenter.
          • 可擴展:您可以在數據中心增加并自動分發容器副本。
          • Secure: Containers apply aggressive constraints and isolations to processes without any configuration required on the part of the user.
          • 安全:容器對進程應用嚴格的約束和隔離,而不需要用戶進行任何配置。
          • 以上引自docker官方文檔:https://docs.docker.com/get-started/

          3、Docker應用場景

          • web應用的自動化打包和發布
          • 自動化測試和持續集成、發布
          • 在服務型環境中部署和調整數據庫或其他應用

          4、Docker三大概念

          Docker架構

          1. 鏡像  image
          2. docker鏡像就是一個只讀模板,比如,一個鏡像可以包含一個完整的centos,里面僅安裝apache或用戶的其他應用,鏡像可以用來創建docker容器,另外docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。
          3. 容器  container
          4. docker利用容器來運行應用,容器是從鏡像創建的運行實例,它可以被啟動,開始、停止、刪除、每個容器都是互相隔離的,保證安全的平臺,可以把容器看做是簡易版的linux環境(包括root用戶權限、鏡像空間、用戶空間和網絡空間等)和運行在其中的應用程序。
          5. 倉庫  repository
          6. 鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。 一個Docker Registry中可以包含多個倉庫( Repository) ; 每個倉庫可以包含多個標簽(Tag) ;每個標簽對應一個鏡像。通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本。我們可以通過<倉庫名>:<標簽>的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以latest作為默認標簽。
          7. 倉庫分為兩種,公有倉庫和私有倉庫,最大的公共倉庫是docker Hub,存放了數量龐大的鏡像供用戶下載,國內的docker pool,這里倉庫的概念與Git類似,registry可以理解為github這樣的托管服務。

          5、Docker優勢

          # 1. 更高效的利用系統資源
          由于容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統 資源的利用率更高。
          無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳 統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運 行更多數量的應用。
          # 2. 更快速的啟動時間
          傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由于直接 運行于宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟 動時間。大大的節約了開發、測試、部署的時間。
          # 3. 一致的運行環境
          開發過程中一個常見的問題是環境一致性問題。由于開發環境、測試環境、生產環 境不一致,導致有些 bug 并未在開發過程中被發現。
          而 Docker 的鏡像提供了除內 核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼 在我機器上沒問題啊” 這類問題。
          # 4. 持續交付和部署
          對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意 地方正常運行。
          使用 Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署。開發人員 可以通過 Dockerfile 來進行鏡像構建,并結合 持續集成(Continuous Integration) 系 統進行集成測試,
          而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
          而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環 境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。
          # 5. 更輕松的遷移
          由于 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在 很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運 行結果是一致的。
          因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一 個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況。

          二、Docker安裝

          1、 環境準備

          #系統環境:docker最低支持centos7且在64位平臺上,內核版本在3.10以上
          
          #版本:Docker Community Edition(CE)社區版,Enterprise Edition(EE) 企業版(包含了一些收費服務)

          2、安裝步驟

          step1:使用yum命令進行安裝

          老版本安裝方式 $ yum install -y docker 安裝的版本是1.13.1(2017-2-8更新),不推薦

          新版本安裝:Docker官方文檔:https://docs.docker.com/engine/install/centos/ 步驟摘要:

          #1.卸載舊版本
          $ sudo yum remove docker \
                            docker-client \
                            docker-client-latest \
                            docker-common \
                            docker-latest \
                            docker-latest-logrotate \
                            docker-logrotate \
                            docker-engine
          #2.安裝yum工具包包(-y 表示不詢問 使用默認配置進行安裝,等待提示安裝完畢!)
          $ sudo yum install -y yum-utils
          #3.設置鏡像的倉庫(默認是從國外的,推薦使用國內的)
          $ sudo yum-config-manager \
              --add-repo \
              https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
          #更新yum軟件包索引(可省略)
          #yum makecache fast
          #4.安裝docker相關的 docker-ce 社區版 而ee是企業版
          $ sudo yum install -y docker-ce docker-ce-cli containerd.io
          #5.啟動docker服務
          $ sudo systemctl start docker
          #6. 使用docker version查看docker版本
          $ sudo docker version
          #7. 測試
          $ sudo docker run hello-world

          step2:查看是否安裝成功

          yum list installed|grep docker

          備注:命令為 查看yum安裝完成文件列表 并 篩選docker安裝信息 如下

          step3:啟動docker服務

          systemctl start docker

          step4:查看是否啟動成功

          systemctl status docker

          如果沒有出現 active(running)說明啟動失敗

          解決方法:修改docker文件,具體命令:vi /etc/sysconfig/docker,在--selinux-enabled后面添加=false。如下圖所示:

          #再次執行
          systemctl start docker
          systemctl status docker

          Step5:查看docker版本

          docker version

          Step6:測試

          docker run hello-world

          3、配置鏡像加速

          方式一:阿里云鏡像加速

          A. 打開阿里云網址https://cr.console.aliyun.com

          B. 使用支付寶或淘寶賬號登錄

          C. 搜索容器鏡像服務

          D. 復制紅色區域內容

          E. 新建文件夾 mkdir -p /etc/docker

          F. 編輯文件 vim /etc/docker/daemon.json 把剛剛復制的內容寫進去保存

          G. 重啟docker

          sudo systemctl daemon-reload
          sudo systemctl restart docker

          方式二:騰訊云鏡像加速

          騰訊云為您提供如下 DockerHub 加速器,以方便您快速拉取 DockerHub 平臺上的容器鏡像。 ? 此加速器地址需在騰訊云云服務器中配置才可生效,請勿通過瀏覽器直接訪問,請參照以下教程進行配置。

          # 1.創建或修改 /etc/docker/daemon.json 文件,并寫入以下內容:
          {
             "registry-mirrors": [
                 "https://mirror.ccs.tencentyun.com"
            ]
          }
          # 2.依次執行以下命令,重新啟動 Docker 服務。
          $ sudo systemctl daemon-reload
          $ sudo systemctl restart docker
          # Ubuntu16.04 請執行 sudo systemctl restart dockerd 命令

          騰訊云容器服務官方地址:https://cloud.tencent.com/document/product/457/9113

          方式三:DaoCloud 加速器

          簡介:DaoCloud 加速器是廣受歡迎的 Docker工具,解決了國內用戶訪問 Docker Hub 緩慢的問題。DaoCloud 加速器結合國內的 CDN 服務與協議層優化,成倍的提升了下載速度。

          # 一條命令加速(記得重啟docker)
          curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

          注意:此時可能會導致啟動失敗,原因實在配置鏡像加速時在配置文件中多加了一個",",刪除重啟即可。

          三、Docker命令

          1、幫助命令

          docker version    #顯示docker的版本信息。
          docker info       #顯示docker的系統信息,包括鏡像和容器的數量
          docker 命令 --help #幫助命令

          2、鏡像命令

          docker images 	#查看所有本地主機上的鏡像 可以使用docker image ls代替
          Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
                          -q 			#只顯示鏡像id
                          -a 			#列出本地所有鏡像(含中間映像層)
                          --digests 	#顯示鏡像的摘要信息
                          --no-trunc 	#顯示鏡像完整信息
          [root@VM_0_5_centos ~]# docker images -a
          REPOSITORY              TAG              IMAGE ID            CREATED          SIZE
          docker.io/hello-world   latest           bf756fb1ae65        5 months ago      13.3 kB   
          docker search 	#搜索鏡像
          Usage:  docker search [OPTIONS] TERM
          				-f			#根據指定條件刪選鏡像
          [root@VM_0_5_centos ~]# docker search mysql -f stars=5000 #搜索MySQL鏡像stars超過5000的
          INDEX       		NAME               		STARS     
          docker.io   		docker.io/mysql   		9623      
          docker pull   	#下載鏡像 docker image pull
          Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
          [root@VM_0_5_centos ~]# docker pull tomcat:8.0 	#如果不指定tag,默認下載最新版本
          [root@VM_0_5_centos ~]# docker images -a
          REPOSITORY              TAG                   IMAGE ID       CREATED             SIZE
          docker.io/tomcat        9.0.36-jdk8-openjdk   b79665757bae   4 days ago          530 MB
          docker.io/tomcat        latest                2eb5a120304e   4 days ago          647 MB
          docker.io/hello-world   latest                bf756fb1ae65   5 months ago        13.3 kB
          docker.io/tomcat        8.0                   ef6a7c98d192   21 months ago       356 MB
          docker rmi 		#刪除鏡像 docker image rm
          Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]
          Remove one or more images
          Options:
            -f, --force      #強制刪除
          [root@VM_0_5_centos ~]# docker rmi tomcat			#刪除最新版本的tomcat
          [root@VM_0_5_centos ~]# docker rmi ef6a7c98d192		#根據鏡像id刪除指定的tomcat
          [root@VM_0_5_centos ~]# docker rmi -f $(docker images -aq) #強制刪除全部的鏡像

          3、容器命令

          [root@VM_0_5_centos ~]# docker container --help
          Usage:  docker container COMMAND
          Manage containers
          Options:
                --help   Print usage
          Commands:
            attach      Attach to a running container
            commit      Create a new image from a container's changes
            cp          Copy files/folders between a container and the local filesystem
            create      Create a new container
            diff        Inspect changes on a container's filesystem
            exec        Run a command in a running container
            export      Export a container's filesystem as a tar archive
            inspect     Display detailed information on one or more containers
            kill        Kill one or more running containers
            logs        Fetch the logs of a container
            ls          List containers
            pause       Pause all processes within one or more containers
            port        List port mappings or a specific mapping for the container
            prune       Remove all stopped containers
            rename      Rename a container
            restart     Restart one or more containers
            rm          Remove one or more containers
            run         Run a command in a new container
            start       Start one or more stopped containers
            stats       Display a live stream of container(s) resource usage statistics
            stop        Stop one or more running containers
            top         Display the running processes of a container
            unpause     Unpause all processes within one or more containers
            update      Update configuration of one or more containers
            wait        Block until one or more containers stop, then print their exit codes
          
          Run 'docker container COMMAND --help' for more information on a command.

          啟動容器

          docker run 鏡像id 		#新建容器并啟動
          Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
          Options:
            -d, --detach                Run container in background and print 
            -e, --env list              Set environment variables (default [])
            -i, --interactive           Keep STDIN open even if not attached
            -p, --publish list          Publish a container's port(s) to the host (default [])
            -P, --publish-all           Publish all exposed ports to random ports
            --rm                        Automatically remove the container when it exits
            -t, --tty                   Allocate a pseudo-TTY
            -v, --volume list           Bind mount a volume (default [])
                --volume-driver string  Optional volume driver for the container
                --volumes-from list     Mount volumes from the specified container(s) (default [])
          [root@VM_0_5_centos ~]# docker run -it centos /bin/bash #啟動centos容器并進入交互
          [root@VM_0_5_centos ~]# docker run -d centos	#后臺啟動centos容器,需要注意:docker容器使用后臺運行,就必須要有要一個前臺進程,docker發現當前容器沒有前臺進程使用,就會自動停止

          進入容器

          docker exec -it 容器id bashshell	#進入當前正在運行的容器(開啟一個新的終端)
          docker attach 容器id				#進入當前正在運行的容器(直接進入正在運行的終端)

          查看運行的容器

          docker ps 				 #列出所有運行的容器 docker container list
          Usage:  docker ps [OPTIONS]
          Options:
            -a, --all             Show all containers (default shows just running)
            -f, --filter filter   Filter output based on conditions provided
                --format string   Pretty-print containers using a Go template
                --help            Print usage
            -n, --last int        Show n last created containers (includes all states) (default -1)
            -l, --latest          Show the latest created container (includes all states)
                --no-trunc        Don't truncate output
            -q, --quiet           Only display numeric IDs
            -s, --size            Display total file sizes
          [root@VM_0_5_centos ~]# docker ps -a

          退出容器

          exit 		#容器停止退出
          ctrl +P +Q 	#容器不停止退出

          刪除容器

          docker rm 容器id   #刪除指定的容器,不能刪除正在運行的容器,如果要強制刪除 rm -rf
          docker rm -f $(docker ps -aq)  	 #刪除所有的容器
          docker ps -a -q|xargs docker rm  #刪除所有的容器

          容器管理

          docker start 容器id 		#啟動容器
          docker restart 容器id 	#重啟容器
          docker stop 容器id 		#停止當前正在運行的容器
          docker kill 容器id 		#強制停止當前容器

          4、其他

          [root@VM_0_5_centos ~]# docker logs --help
          Usage:  docker logs [OPTIONS] CONTAINER
          Fetch the logs of a container
          Options:
                --details        Show extra details provided to logs
            -f, --follow         Follow log output
                --help           Print usage
                --since string   Show logs since timestamp
                --tail string    Number of lines to show from the end of the logs (default "all")
            -t, --timestamps     Show timestamps
          [root@VM_0_5_centos ~]docker run -d centos /bin/sh -c "while true;do echo hello;sleep 1;done" #模擬日志      
                  -tf								#顯示日志信息(一直更新)
                  --tail number 					#需要顯示日志條數
          docker logs -t --tail n 容器id   		   #查看n行日志
          docker logs -ft 容器id 		  		   #跟蹤日志
          
          docker top 容器id							#查看容器中的進程信息
          
          docker inspect 容器id						#查看鏡像元數據
          
          #將指定容器內資源拷貝到主機
          docker cp 容器id:容器內路徑   主機目的路徑	
          [root@VM_0_5_centos html]# docker cp 2d30adc4ee87:/etc/nginx/nginx.conf .
          #將主機內資源拷貝到指定容器
          docker cp 主機目的路徑	容器id:容器內路徑
          [root@VM_0_5_centos html]# docker cp test.html d1cf09d31eda:/usr/local
          
          docker save centos > /opt/centos.tar.gz  # 導出docker鏡像至本地
          docker load < /opt/centos.tar.gz   		 #導入本地鏡像到docker鏡像庫
          
          docker stats 							# 查看docker容器使用內存情況

          四、Docker安裝軟件

          1、安裝mysql

          #1. 搜索鏡像 search 上hub.docker.com搜索
          [root@localhost docker]# docker search mysql
          #2. 拉取鏡像 pull
          [root@localhost docker]# docker pull mysql:5.7
          #3、運行測試
          # -d 后臺運行
          # --name 給容器命名
          # -p 宿主機端口:容器內部端口
          [root@localhost docker]# docker run -d -p 3355:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql1 mysql:5.7
          #測試 (關閉防火墻或授權遠程訪問)  外部連接訪問正常 
          #進入容器命令:docker exec -it 容器id /bin/bash 
          ------------------------------容器啟動進行數據掛載-----------------------------
          #mysql容器正常啟動  數據掛載成功  
          $ docker run -d -p 3344:3306 -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7
          # 開放3344端口及安全組,在容器內部創建用戶并授權,測試OK

          2、安裝tomcat

          #拉取鏡像
          [root@localhost docker]# docker pull tomcat 				
          #創建容器運行
          [root@localhost docker]# docker run -d -p 8080:8080 --name mytomcat tomcat	
          #測試訪問(記得關閉防火墻 此時會發現訪問成功出現404響應,原因是webapps下面沒有資源)
          ip:8080
          #進入容器(可以使用容器名稱或容器id)
          [root@localhost docker]# docker exec -it mytomcat /bin/bash
          #將webapps.dist下的內容復制到webapps下面,重新訪問即可看到正常頁面
          root@ebef54554573:/usr/local/tomcat# cp -r webapps.dist/*  webapps/
          #部署項目到tomcat
          [root@localhost docker]# docker cp demo.war mytomcat:/usr/local/tomcat/webapps/
          #重啟tomcat容器
          [root@localhost docker]# docker restart mytomcat

          3、安裝nginx

          #直接安裝nginx鏡像運行nginx容器
          [root@localhost docker]# docker run -d -p 80:80 --name mynginx nginx
          #進入容器 復制文件到容器同上,不在累述
          #數據掛載  (把容器文件掛載到宿主機上面,不用每次進入容器內部修改文件,在容器外部宿主機修改文件會自動同步到容器內部,并且當刪除容器后,宿主機上的文件不會被刪除,相當于對容器內部文件進行持久化操作。)
          [root@localhost docker]# docker run -d -p 8033:80 -v /data/nginx/html:/usr/share/nginx/html --name mynginx nginx
          #在/data/nginx/html目錄下創建test.html
          [root@localhost html]# vim test.html
          #測試成功
          [root@localhost html]# curl localhost:8033/test.html
          --------------------------------------------------------------------------------------
          [root@localhost docker]# docker run -dit -p 8081:80 -v /data/nginx/conf:/etc/nginx -v /data/nginx/log:/var/log/nginx -v /data/nginx/html:/usr/share/nginx/html --name nginx1 nginx /bin/bash
          # 說明:當掛載容器內安裝軟件配置目錄容易出現很多問題,比如:1.后臺啟動即退出 2.成功啟動后無法正常訪問
          [root@VM_0_5_centos conf]# curl localhost:8081
          curl: (56) Recv failure: Connection reset by peer

          4、安裝elasticsearch

          [root@VM_0_5_centos conf]# docker run -d  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" --name elasticsearch elasticsearch:7.6.2
          [root@VM_0_5_centos conf]# curl localhost:9200
          {
            "name" : "b7546b5af212",
            "cluster_name" : "docker-cluster",
            "cluster_uuid" : "ZLQNTv0ZRbuQAXw4ZLJezw",
            "version" : {
              "number" : "7.6.2",
              "build_flavor" : "default",
              "build_type" : "docker",
              "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
              "build_date" : "2020-03-26T06:34:37.794943Z",
              "build_snapshot" : false,
              "lucene_version" : "8.4.0",
              "minimum_wire_compatibility_version" : "6.8.0",
              "minimum_index_compatibility_version" : "6.0.0-beta1"
            },
            "tagline" : "You Know, for Search"
          }

          五、Docker鏡像

          操作系統分為內核和用戶空間。對于Linux而言,內核啟動后,會掛載root文件系統為其提供用戶空間支持。而Docker鏡像(Image) ,就相當于是一個root文件系統。比如官方鏡像centos:7.6就包含了完整的一套centos 7.6最小系統的root文件系統。

          Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。

          因為鏡像包含操作系統完整的root文件系統,其體積往往是龐大的,因此在Docker設計時將其設計為分層存儲的架構。鏡像只是一個虛擬的概念,其實際體現并非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。 ? 鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。 ? 分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像。

          鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而準備的存儲層為容器存儲層。容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。

          鏡像使用分層存儲,便于資源共享,可以使用docker image inspect 命令查看

          [root@VM_0_5_centos ~]# docker image inspect nginx
          #docker commit 提交容器成為一個新的副本
          docker commit -m="描述信息" -a="作者" 容器id 目標鏡像名:[TAG]
          [root@VM_0_5_centos ~]# docker commit -a="shuaige" -m="add test.html" 8fc157a704d4 nginx3:1.0
          sha256:31b98e5522104b8a30b2cf587cc0494a265f4de9df3a7b04c45f78cb5b9001ef
          [root@VM_0_5_centos ~]# docker images
          REPOSITORY             TAG               IMAGE ID            CREATED             SIZE
          nginx3                 1.0               31b98e552210        14 seconds ago      132 MB
          docker.io/nginx        latest            2622e6cca7eb        5 days ago          132 MB

          六、Docker數據掛載

          按照Docker最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用Volume數據卷、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。 ? 數據卷的生存周期獨立于容器,容器消亡,數據卷不會消亡。因此,使用數據卷后,容器刪除或者重新運行之后,數據卻不會丟失。

          數據卷的特性

          • 數據卷可以在容器之間共享和重用
          • 對數據卷的修改會立馬生效
          • 對數據卷的更新,不會影響鏡像
          • 數據卷默認會一直存在,即使容器被刪除

          數據卷命令

          #創建一個數據卷
          docker volume create 數據卷名稱
          #查看所有的數據卷
          docker volume ls
          #查看指定數據卷的信息
          docker volume inspect 數據卷名稱
          #創建一個tomcat容器 使用數據卷掛載容器內目錄
          [root@VM_0_5_centos conf]# docker run --name my-tomcat -d -p 8080:8080 -v test:/wepapps tomcat:latest
          #刪除數據卷  如果需要在刪除容器的同時移除數據卷,可以在刪除容器的時候使用dockerrm-v這個命令。
          docker volume rm 數據卷名稱
          #清理無主的數據卷
          docker volume prune

          使用數據卷進行數據掛載

          #docker run -it -v 主機目錄:容器內目錄  -p 主機端口:容器內端口
          	-v, --volume list          Bind mount a volume (default [])
                --volume-driver string   Optional volume driver for the container
                --volumes-from list      Mount volumes from the specified container(s) (default [])
          [root@VM_0_5_centos ~]# docker run -it -v /data/test:/home centos /bin/bash
          #通過 docker inspect 容器id 查看
          [root@VM_0_5_centos test]# docker inspect 523d102d8586
          "Mounts": [
                      {
                          "Type": "bind",
                          "Source": "/data/test",
                          "Destination": "/home",
                          "Mode": "",
                          "RW": true,
                          "Propagation": "rprivate"
                      }
                  ]
          #啟動mysql容器進行數據掛載
          [root@VM_0_5_centos test]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
          #查看mysql容器id
          [root@VM_0_5_centos test]# docker ps
          CONTAINER ID        IMAGE            PORTS                               NAMES
          0c10d400ecd8        mysql:5.7        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql01
          #進入mysql容器
          [root@VM_0_5_centos test]# docker exec -it 0c10d400ecd8 /bin/sh
          # mysql -uroot -p
          Enter password: 
          #進入mysql創建新用戶并授權訪問
          mysql> create user tom identified by "123456";
          mysql> grant all on *.* to tom;
          mysql> flush privileges;
          #開放端口[安全組](或關閉防火墻) 外部測試OK

          掛載的幾種具體方式

          # 匿名掛載		-v 容器內路徑(只寫容器內的路徑,沒有指定宿主機的路徑)
          [root@VM_0_5_centos conf]# docker run -d -P  -v /etc/nginx --name nginx01 nginx
          # 查看所有的volume的情況
          [root@VM_0_5_centos conf]# docker volume ls
          DRIVER              VOLUME NAME
          local               8a2947a4d63c5c71db7dd331a487cd2dcfacc65022302f42030f7deea799b203     
          # 具名掛載		-v 卷名:容器內路徑
          [root@VM_0_5_centos conf]# docker run -d -P -v my-nginx:/etc/nginx --name nginx02 nginx
          [root@VM_0_5_centos conf]# docker volume ls 
          DRIVER              VOLUME NAME
          local               my-nginx
          # 查看一下這個卷信息
          [root@VM_0_5_centos conf]# docker volume inspect my-nginx
          [
              {
                  "Driver": "local",
                  "Labels": null,
                  "Mountpoint": "/var/lib/docker/volumes/my-nginx/_data",
                  "Name": "my-nginx",
                  "Options": {},
                  "Scope": "local"
              }
          ]

          注意:所有的docker容器內的卷,沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxxx/_data下,如果指定了目錄,docker volume ls 是查看不到的

          # ro rw 改變讀寫權限
          ro 			#readonly 只讀 說明這個路徑只能通過宿主機來操作,容器內部無法操作!
          rw 			#readwrite 可讀可寫
          docker run -d -P -v nginx03:/etc/nginx:ro --name nginx03 nginx
          docker run -d -P -v nginx04:/etc/nginx:rw --name nginx04 nginx

          數據卷容器(多個容器同步數據)

          案例:多個mysql數據共享(mysql01和mysql02共享/data/mysql/data目錄下數據)

          ---------------------------------目前存在問題,待解決----------------------------------
          $ docker run -d -p 3344:3306 -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7
          
          $ docker run -d -p 3355:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=root --name mysql02   mysql:5.7
          # 掛載配置文件出現報錯
          ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

          容器之間的配置信息的傳遞,數據卷容器的生命周期一直持續到沒有容器使用為止。但是一旦持久化到了本地,這個時候,本地的數據是不會刪除的!

          七、DockerFile構建私有鏡像

          鏡像的定制實際上就是定制每一層所添加的配置、文件。我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,這個腳本就是Dockerfile。 ? Dockerfile是一個文本文件,其內包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

          DockerFile構建鏡像步驟

          1、 編寫一個DockerFile文件

          2、 docker build 構建成為一個鏡像

          3、 docker run運行鏡像

          4、 docker push發布鏡像(DockerHub 、阿里云倉庫)

          DockerFile詳解

          FROM				# 基礎鏡像,一切從這里開始構建
          MAINTAINER			# 鏡像是誰寫的, 姓名+郵箱
          RUN					# 鏡像構建的時候需要運行的命令
          COPY				# 類似ADD,將我們文件拷貝到鏡像中
          ADD					# 步驟,tomcat鏡像,這個tomcat壓縮包!添加內容到同目錄
          WORKDIR				# 鏡像的工作目錄
          VOLUME				# 掛載的目錄
          EXPOSE				# 暴露端口配置
          CMD					# 指定這個容器啟動的時候要運行的命令,只有最后一個會生效,可被替代。
          ENTRYPOINT			# 指定這個容器啟動的時候要運行的命令,可以追加命令
          ONBUILD				# 當構建一個被繼承 DockerFile 這個時候就會運行ONBUILD的指令,觸發指令。
          ENV					# 構建的時候設置環境變量!

          注意:每個關鍵字(指令)都必須是大寫字母,自上到下執行,每一個指令都會創建提交一個新的鏡像層。

          FROM指定基礎鏡像 ? 所謂定制鏡像,一定是以一個鏡像為基礎,在其上進行定制。基礎鏡像是必須指定的,而FROM就是指定基礎鏡像,因此一個Dockerfile中FROM是必備的指令,并且必須是第一條指令。 ? 在Docker Hub上有非常多的高質量的官方鏡像,有可以直接拿來使用的服務類的鏡像,如nginx、redis、mysql 、tomcat等;可以在其中尋找一個最符合我們最終目標的鏡像為基礎鏡像進行定制。 ? 如果沒有找到對應服務的鏡像,官方鏡像中還提供了一些更為基礎的操作系統鏡像,如ubuntu、debian、centos、 alpine等, 這些操作系統的軟件庫為我們提供了更廣闊的擴展空間。 除了選擇現有鏡像為基礎鏡像外,Docker 還存在一個特殊的鏡像,名為scratch。這個鏡像是虛擬的概念,并不實際存在,它表示一個空白的鏡像。 ? FROM scratch ? 如果你以scratch為基礎鏡像的話,意味著你不以任何鏡像為基礎,接下來所寫的指令將作為鏡像第一層開始存在。對于Linux下靜態編譯的程序來說,并不需要有操作系統提供運行時支持,所需的一切庫都已經在可執行文件里了,因此直接FROM scratch會讓鏡像體積更加小巧。使用Go語言開發的應用很多會使用這種方式來制作鏡像,這也是為什么有人認為Go是特別適合容器微服務架構的語言的原因之一。

          RUN執行命令 ? RUN指令是用來執行命令行命令的。由于命令行的強大能力,RUN 指令在定制鏡像時是最常用的指令之一。其格式有兩種: .

          shell格式: RUN <命令>
          RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
          exec格式: RUN ["可執行文件", "參數1", "參數2"]
          RUN tar -xzf redis.tar.gz -C /usr/src/redis -strip-components=1
          RUN make -C /usr/src/redis
          RUN make -C /usr/src/redis install

          使用Dockerfile定制nginx鏡像

          [root@VM_0_5_centos docker]# vim Dockerfile
          FROM nginx
          RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
          [root@VM_0_5_centos docker]# docker build -t mynginx:1.0 .
          [root@VM_0_5_centos docker]# docker images
          REPOSITORY      TAG           IMAGE ID            CREATED              SIZE
          mynginx         1.0           ae280f7cccc1        About a minute ago   132 MB
          [root@VM_0_5_centos docker]# docker run -d -p 8081:80 --name mynginx1 mynginx:1.0
          [root@VM_0_5_centos docker]# curl localhost:8081
          <h1>Hello, Docker!</h1>

          COPY 復制文件 ? 格式: ? ●COPY <源路徑>... <目標路徑> ? ●COPY ["<源路徑1>",..."<目標路徑>"] ? COPY指令將從構建上下文目錄中<源路徑>的文件/目錄復制到新的一層的鏡像內的<目標路徑>位置。比如:

          COPY package.json /usr/src/app/

          <源路徑>可以是多個,甚至可以是通配符,如:

          COPY hom*	/mydir/
          COPY hom?.txt 	/mydir/

          ADD更高級的復制文件 ? ADD指令和COPY的格式和性質基本一致。但是在COPY基礎上增加了一些功能。比如<源路徑>可以是一個URL,這種情況下,Docker 引擎會試圖去下載這個鏈接的文件放到<目標路徑>去。 ? 在Docker官方的Dockerfile最佳實踐文檔中要求,盡可能的使用COPY,因為COPY的語義很明確,就是復制文件而已,而ADD則包含了更復雜的功能,其行為也不一定很清晰。最適合使用ADD的場合,就是所提及的需要自動解壓縮的場合。因此在COPY和ADD指令中選擇的時候,可以遵循這樣的原則,所有的文件復制均使用COPY指令,僅在需要自動解壓縮的場合使用ADD。

          CMD容器啟動命令 ? CMD指令的格式和RUN相似,也是兩種格式: ? ●shell格式: CMD <命令> ? ●exec格式: CMD ["可執行文件", "參數1", "參數2"..] ? ●參數列表格式: CMD ["參數1", "參數2..]。在指定了ENTRYPOINT指令后,用CMD指定具體的參數。 ? Docker不是虛擬機,容器就是進程。既然是進程,那么在啟動容器的時候,需要指定所運行的程序及參數。CMD 指令就是用于指定默認的容器主進程啟動命令的。

          ENTRYPOINT入口點 ? ENTRYPOINT的目的和CMD一樣,都是在指定容器啟動程序及參數。ENTRYPOINT在運行時也可以替代,不過比CMD要略顯繁瑣,需要通過docker run的參數--entrypoint來指定。當指定了ENTRYPOINT后,CMD 的含義就發生了改變,不再是直接的運行其命令,而是將CMD的內容作為參數傳給ENTRYPOINT指令,換句話說實際執行時,將變為:ENTRYPOINT "CMD"

          #CMD和ENTRYPOINT的區別
          CMD					# 指定這個容器啟動的時候要運行的命令,只有最后一個會生效,可被替代。
          ENTRYPOINT			# 指定這個容器啟動的時候要運行的命令,可以追加命令

          ENV設置環境變量 ? 格式有兩種: ? ●ENV key value ? ●ENV key1=value1 key2=value2... ? 這個指令很簡單,就是設置環境變量而已,無論是后面的其它指令,如RUN,還是運行時的應用,都可以直接使用這里定義的環境變量。

          ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"

          $VERSION ? #使用環境變量 ? 下列指令可以支持環境變量展開: ADD、COPY、ENV、 EXPOSE、 LABEL、USER、 WORKDIR、 VOLUME、 STOPSIGNAL、 ONBUILD 。

          ARG 構建參數 ? 格式:ARG <參數名>[=<默認值>] ? 構建參數和ENV的效果一樣,都是設置環境變量。所不同的是,ARG 所設置的構建環境的環境變量,在將來容器運行時是不會存在這些環境變量的。但是不要因此就使用ARG保存密碼之類的信息,因為docker history還是可以看到所有值的。Dockerfile中的ARG指令是定義參數名稱,以及定義其默認值。該默認值可以在構建命令docker build中用--build-arg <參數名>=<值>來覆蓋。

          VOLUME 定義匿名卷 ? 格式: ? VOLUME ["<路徑1>", "<路徑2> ..] ? VOLUME <路徑> ? 容器運行時應該盡量保持容器存儲層不發生寫操作,對于數據庫類需要保存動態數據的應用,其數據庫文件應該保存于卷(volume)中,為了防止運行時用戶忘記將動態文件所保存目錄掛載為卷,在Dockerfile中,我們可以事先指定某些目錄掛載為匿名卷,這樣在運行時如果用戶不指定掛載,其應用也可以正常運行,不會向容器存儲層寫入大量數據。 ? VOLUME /data ? 這里的/data目錄就會在運行時自動掛載為匿名卷,任何向/data中寫入的信息都不會記錄進容器存儲層,從而保證了容器存儲層的無狀態化。當然,運行時可以覆蓋這個掛載設置。 ? eg:docker run -d -V mydata:/data XXXX ? 在這行命令中,就使用了mydata這個命名卷掛載到了/data這個位置,替代了Dockerfile中定義的匿名卷的掛載配置。

          EXPOSE聲明端口 ? 格式:EXPOSE <端口1> [<端口2...]。 ? EXPOSE指令是聲明運行時容器提供服務端口,這只是一個聲明,在運行時并不會因為這個聲明應用就會開啟這個端口的服務。 ? 在Dockerfile中寫入這樣的聲明有兩個好處: ? 1.是幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射; ? 2.在運行時使隨機端口映射時,也就是docker run -P時,會自動隨機映射EXPOSE的端口。

          WORKDIR 指定工作目錄 ? 格式:WORKDIR <工作目錄路徑>。 ? 使用WORKDIR指令可以來指定工作目錄(或者稱為當前目錄),以后各層的當前目錄就被改為指定的目錄,如該目錄不存在,WORKDIR 會幫你建立目錄。之前提到一些初學者常犯的錯誤是把Dockerfile等同于Shell腳本來書寫,這種錯誤的理解還可能會導致出現下面這樣的錯誤: RUN cd /app RUN echo "hello" > world.txt 如果將這個Dockerfile進行構建鏡像運行后,會發現找不到/app/world.txt文件。

          原因:在 Shell中,連續兩行是同一個進程執行環境,因此前一個命令修改的內存狀態,會直接影響后一個命令,而在Dockerfile中,這兩行RUN命令的執行環境根本不同,是兩個完全不同的容器。 ? 這就是對Dockerfile構建分層存儲的概念不了解所導致的錯誤。 ? 每一個RUN都是啟動一個容器、執行命令、然后提交存儲層文件變更。 ? 第一層RUN cd /app的執行僅僅是當前進程的工作目錄變更,一個內存上的變化而已,其結果不會造成任何文件變更。而到第二層的時候,啟動的是一個全新的容器,跟第一層的容器更完全沒關系,自然不可能繼承前一層構建過程中的內存變化。 ? 因此如果需要改變以后各層的工作目錄的位置,那么應該使用WORKDIR指令。

          USER 指定當前用戶 ? 格式: USER <用戶名> ? USER指令和WORKDIR相似,都是改變環境狀態并影響以后的層。WORKDIR 是改變工作目錄,USER 則是改變之后層的執行RUN , CMD以及ENTRYPOINT這類命令的身份。 ? 當然,和WORKDIR一樣,USER 只是幫助你切換到指定用戶而已,這個用戶必須是事先建立好的,否則無法切換。 ? RUN groupadd -r redis & useradd -r -g redis redis ? USER redis ? RUN [ "redis-server" ]

          HEALTHCHECK健康檢查 ? 格式:HEALTHCHECK [選項] CMD <命令> :設置檢查容器健康狀況的命令 ? HEALTHCHECK NONE :如果基礎鏡像有健康檢查指令,可以屏蔽掉其健康檢查指令 ? HEALTHCHECK指令是告訴Docker應該如何進行判斷容器的狀態是否正常,這是Docker1.12引入的新指令。通過該指令指定一行命令,用這行命令來判斷容器主進程的服務狀態是否還正常,從而比較真實的反應容器實際狀態。

          一個鏡像指定了HEALTHCHECK指令后,用其啟動容器,初始狀態會為starting,在執行健康檢查成功后變為healthy,如果連續一定次數失敗, 則會變為unhealthy。 ? HEALTHCHECK支持下列選項: ? ●--interval=<間隔> :兩次健康檢查的間隔, 默認為30秒; ? ●--timeout=<時長> :健康檢查命令運行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,默認30秒; ? ●--retries=<次數> :當連續失敗指定次數后,則將容器狀態視為unhealthy, 默認3次。 ? 為了幫助排障,健康檢查命令的輸出(包括 stdout以及stderr)都會被存儲于健康狀態里,可以用docker inspect來查看。

          ONBUILD為他人做嫁衣裳 ? 格式: ONBUILD <其它指令>。 ? ONBUILD是一個特殊的指令,它后面跟的是其它指令,比如RUN , COPY等,而這些指令,在當前鏡像構建時并不會被執行。只有當以當前鏡像為基礎鏡像,去構建下一級鏡像的時候才會被執行。 ? Dockerfile中的其它指令都是為了定制當前鏡像而準備的,唯有ONBUILD是為了幫助別人定制自己而準備的。

          # 1.編寫Dockerfile文件 重新構建centos鏡像
          [root@VM_0_5_centos docker]# vim dockerfile-centos
          FROM centos
          MAINTAINER shuaige<669104343@qq.com>
          ENV MYPATH /usr/local
          WORKDIR $MYPATH
          RUN yum -y install vim
          RUN yum -y install net-tools
          EXPOSE 80
          CMD echo $MYPATH
          CMD echo "-----end----"
          CMD /bin/bash
          # 2.執行 docker build 命令進行構建
          # 命令 docker build -f 文件路徑 -t 鏡像名:[tag] .
          [root@VM_0_5_centos docker]# docker build -f mydockerfile-centos -t mycentos:1.0 .
          # 3.啟動容器并進入測試ifconfig、vim
          [root@VM_0_5_centos docker]# docker run -it mycentos:1.0

          制作tomcat鏡像

          #資源準備 創建/usr/local/docker/tomcat目錄,將jdk、tomcat、readme壓縮包放到該目錄下
          # 1.編寫Dockerfile文件
          [root@VM_0_5_centos tomcat]# vim Dockerfile
          FROM centos 
          MAINTAINER shuaige<669104343@qq.com>
          COPY readme /usr/local/readme
          ADD jdk-8u192-linux-x64.tar.gz /usr/local/
          ADD apache-tomcat-8.0.53.tar.gz /usr/local/
          RUN yum -y install vim
          ENV MYPATH /usr/local
          WORKDIR $MYPATH
          ENV JAVA_HOME /usr/local/jdk1.8.0_192
          ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.53
          ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib
          EXPOSE 8080
          CMD /usr/local/apache-tomcat-8.0.53/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.53/logs/catalina.out
          # 2.構建鏡像
          [root@VM_0_5_centos tomcat]# docker build -t mytomcat:1.0 .
          # 3.運行鏡像
          docker run -d -p 8080:8080  -v /data/tomcat/webapps:/usr/local/apache-tomcat-8.0.53/webapps -v /data/tomcat/logs/:/usr/local/apache-tomcat-8.0.53/logs --name tomcat01 mytomcat:1.0
          # 4.本地發布項目測試 測試OK
          http://49.234.90.25:8080/test/index.html

          其他制作鏡像方式

          docker save和docker load Docker還提供了docker load和docker save命令,用以將鏡像保存為一個tar文件,然后傳輸到另一個位置.上,再加載進來。這是在沒有Docker Registry時的做法,現在已經不推薦,鏡像遷移應該直接使用Docker Registry,無論是直接使用Docker Hub還是使用內網私有Registry 都可以。 例如:保存nginx鏡像

          docker save nginx|gzip > nginx-latest.tar.gz

          然后我們將nginx-latest.tar.gz文件復制到了到了另一個機器上,再次加載鏡像:

          docker load -i nginx-latest.tar.gz

          八、Docker鏡像發布

          1、Docker Hub

          目前Docker官方維護了一個公共倉庫Docker Hub,其中已經包括了數量超過15,000的鏡像。大部分需求都可以通過在Docker Hub中直接下載鏡像來實現。

          注冊登錄 ? 可以在https://hub.docker.com免費注冊一個Docker賬號。在命令行界執行docker login輸入用戶名及密碼來完成在命令行界面登錄DockerHub,通過docker logout退出登錄。

          拉取鏡像 可以通過docker search命令來查找官方倉庫中的鏡像,并利用docker pull命令來將它下載到本地。

          推送鏡像 ? 用戶也可以在登錄后通過docker push命令來將自己的鏡像推送到DockerHub。

          # 0.查詢將要上傳的鏡像ID
          [root@VM_0_5_centos ~]# docker images
          REPOSITORY          	  TAG     	IMAGE ID         CREATED             SIZE
          docker.io/hello-world     latest    bf756fb1ae65     5 months ago        13.3 kB
          # 1.給將要上傳的鏡像打標簽,注意倉庫名一定要寫正確
          # docker tag 鏡像ID 用戶名/倉庫名
          [root@VM_0_5_centos ~]# docker tag bf756fb1ae65 shuaige66/hello-world
          # 2.登錄docker倉庫
          [root@VM_0_5_centos ~]# docker login 
          # 3.推送鏡像到Docker Hub
          [root@VM_0_5_centos ~]# docker push shuaige66/hello-world

          2、阿里云倉庫

          # 1. 登錄阿里云Docker Registry 用于登錄的用戶名為阿里云賬號全名,密碼為開通服務時設置的密碼。
          $ sudo docker login --username=18271267916 registry.cn-hangzhou.aliyuncs.com
          # 2. 從Registry中拉取鏡像
          $ sudo docker pull registry.cn-hangzhou.aliyuncs.com/shuaige/test:[鏡像版本號]
          # 3. 將鏡像推送到Registry 請根據實際鏡像信息替換示例中的[ImageId]和[鏡像版本號]參數。
          $ sudo docker login --username=18271267916 registry.cn-hangzhou.aliyuncs.com
          $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/shuaige/test:[鏡像版本號]
          $ sudo docker push registry.cn-hangzhou.aliyuncs.com/shuaige/test:[鏡像版本號]
          # 示例
          # 1.使用"docker images"命令找到鏡像,將該鏡像名稱中的域名部分變更為Registry專有網絡地址。
          [root@VM_0_5_centos docker]# docker images
          REPOSITORY       TAG     IMAGE ID          CREATED         SIZE
          mynginx          1.0     ae280f7cccc1      5 hours ago     132 MB
          # 2.使用"docker tag"命令重命名鏡像,并將它通過專有網絡地址推送至Registry。
          docker tag ae280f7cccc1 registry.cn-hangzhou.aliyuncs.com/shuaige/mynginx:1.0
          # 3.推送到阿里云鏡像倉庫
          docker push registry.cn-hangzhou.aliyuncs.com/shuaige/mynginx:1.0

          3、私有倉庫

          有時候使用Docker Hub這樣的公共倉庫可能不方便,用戶可以創建一個本地倉庫供私人使用。比如,基于公司內部項目構建的鏡像。 ? docker-registry是官方提供的工具,可以用于構建私有的鏡像倉庫。 ? 安裝運行docker-registryv ? 通過獲取官方registry鏡像來運行。默認情況下,倉庫會被創建在容器的/var/lib/registry目錄下,可以通過-v參數來將鏡像文件存放在本地的指定路徑。

          [root@VM_0_5_centos ~]# docker run -d -p 5000:5000 --restart=always -v /opt/data/registry:/var/lib/registry --name registry registry

          在私有倉庫上傳、搜索、下載鏡像 ? 創建好私有倉庫之后,就可以使用docker tag來標記一個鏡像, 然后推送它到倉庫。

          # 先在本機查看已有的鏡像。
          [root@VM_0_5_centos ~]# docker images
          # 使用docker tag將hello-world:latest這個鏡像標記為127.0.0.1:5000/hello-world:latest
          [root@VM_0_5_centos ~]# docker tag hello-world:latest 127.0.0.1:5000/hello-world:latest
          # 使用docker push上傳標記的鏡像
          [root@VM_0_5_centos ~]# docker push 127.0.0.1:5000/hello-world:latest
          9c27e219663c: Pushed 
          latest: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 size: 525
          # 用curl查看倉庫中的鏡像
          [root@VM_0_5_centos docker]# curl 127.0.0.1:5000/v2/_catalog
          {"repositories":["hello-world"]}
          # 如果可以看到{" repositoris":["hello-world"]},表明鏡像已經被成功上傳了。
          # 先刪除已有鏡像,再嘗試從私有倉庫中下載這個鏡像。
          docker image rm 127.0.0.1:5000/hello-world:latest
          docker pull 127.0.0.1:5000/hello-world:latest

          注意: 如果你不想使用127.0.0.1:5000作為倉庫地址,比如想讓本網段的其他主機也能把鏡像推送到私有倉庫。你就得把例如192.168.74.149:5000這樣的內網地址作為私有倉庫地址,這時你會發現依然無法成功推送鏡像。 原因:Docker默認不允許非HTTPS方式推送鏡像。我們可以通過Docker的配置選項來取消這個限制。

          {"regstry-mirror": ["https://registry.docker-cn.com"],
           "insecure- registries":["192.168.74.149:5000"]}

          參考網址


          主站蜘蛛池模板: 国产成人无码AV一区二区 | 无码中文字幕乱码一区| 任你躁国语自产一区在| 国产激情一区二区三区四区| 久久婷婷久久一区二区三区| 国产中文字幕一区| 亚洲AV成人精品日韩一区| 日本不卡在线一区二区三区视频| 美女视频黄a视频全免费网站一区| 亚洲AV无码一区东京热| 久久久久久一区国产精品| 无码人妻一区二区三区免费| 色欲综合一区二区三区| 国产一区二区三区乱码| 国产精品无码AV一区二区三区| 一区二区三区四区在线播放 | 韩国理伦片一区二区三区在线播放| 91麻豆精品国产自产在线观看一区| 国产精品一区电影| 无码av中文一区二区三区桃花岛| 97久久精品无码一区二区| 日韩亚洲AV无码一区二区不卡| 国产亚洲综合一区柠檬导航| 精品无码人妻一区二区三区不卡 | 91精品国产一区| 亚洲国产成人一区二区三区| 免费一区二区无码东京热| 波多野结衣的AV一区二区三区| 国产一区二区三精品久久久无广告| 一区二区三区在线播放视频| 无码毛片一区二区三区中文字幕| 精品人妻一区二区三区四区在线| 免费萌白酱国产一区二区| 内射少妇一区27P| 中文字幕不卡一区| 国产精品美女一区二区视频| 污污内射在线观看一区二区少妇 | 中文字幕一区二区三区在线不卡| 东京热无码av一区二区| 亚洲一区免费观看| 亚洲午夜精品一区二区麻豆|