【Docker】第2篇:Docker 介紹

docker簡介

1.docker是基於go語言實現
主要目標是對對應組件的封裝、分發、部署、運行等生命週期的管理,使應用程序及其運行環境可以作到「一次封裝,處處運行」linux

2.docker爲了解決運行環境和配置問題的軟件容器,方便作持續集成並有助於總體發佈的容器虛擬化技術nginx

3.docker能幹些什麼?docker

  • 虛擬機技術
    簡單理解能夠在一種操做系統裏面運行另一種操做系統,好比windows中運行linux系統,常見的是vmware;缺點:佔用資源,啓動慢,安裝步驟繁瑣。
  • 容器虛擬化技術
    docker既是一種容器虛擬化技術,docker自己是一個容器運行載體或稱之爲管理引擎,咱們把應用程序和配置依賴打包好造成一個可交付的運行環境,這個打包好的運行環境就是鏡像文件,只有經過這個鏡像文件才能生成docker容器。docker 根據 image 鏡像文件生成容器實例。同一個image文件能夠生成多個同時運行的容器實例。
  • docker 架構

clipboard.png

docker使用

docker 初體驗

新建並啓動一個docker容器,使用 docker run命令便可apache

docker run -d -p 91:80 nginx

clipboard.png
須要注意的是使用 docker run 命令建立容器時,會先檢查本地是否存在指定鏡像,若是本地不存在,docker 會自動從 dockerHub 上下載一個該鏡像並啓動。vim

  • 檢驗docker容器是否啓動成功

訪問地址http://localhost:91/windows

clipboard.png

docker的三大要素

  • 倉庫:存儲鏡像的地方,分爲公開倉庫和私有倉庫
  • 鏡像:包含了你打包的應用程序及其所依賴的環境
  • 容器:用鏡像建立的運行實例,能夠把容器當作簡易版的Linux的容器,一個運行中的容器是一個運行在Docker主機上的進程,但它和主機,以及全部運行在主機上其餘進程都是隔離的。centos

    • 容器是利用什麼機制實現隔離的?tomcat

      • Linux 命名空間
      • Linux 控制組(cgroups)

docker底層原理

docker是一個client-server結構的進程,docker守護進程運行在主機上,而後經過socket鏈接從客戶端的訪問,守護進程從客戶端接受命令並管理運行在主機上的docker容器。容器是一個運行時環境,就是鯨魚背上的一個個集裝箱。bash

clipboard.png

docker經常使用命令

1.幫助命令架構

docker version
docker info
docker --help

2.鏡像命令

docker images : 列出本地鏡像
docker image -qa  : 顯示所有鏡像id
docker images --digests : 顯示鏡像簡介信息
docker images --digests --no-trunc

docker search tomcat : 搜索某個鏡像
docker pull tomcat : 下載鏡像到本地  等價於  docker pull tomcat:latest(默認下最新版本)
docker rmi tomact : 刪除某個鏡像 
docker rmi tomcat:6.5 刪除制定版本鏡像
docker rmi -f tomcat 強制刪除鏡像
docker rmi -f nginx tomcat 強制刪除多個鏡像
docker rmi -f ${docker images -qa} 強制刪除所有

3.容器命令

(1) docker pull centos : 下載centos鏡像
(2) docker run [options] image
—name=「容器新名字」 :爲容器制定一個名字
-i : 容器的image id
-t : 交互式啓動 ,好比 :docker run -it 0a8b6f21d511
-d : 後臺運行容器
-p : 制定映射端口
docker run -it -p 8080:8080 tomcat (-p 指定主機端口:docker容器暴露給宿主機的端口;-P 隨機分配端口)

(3) docker ps : docker中運行的進程,docker ps -n 5
(4) exit: 容器中止退出
(5) docker restart \ docker stop \ docker kill \ docker rm 
(6)一次性刪除多個容器: 
docker rm -f $(docker ps -qa)
docker ps -aq | args docker rm

(7)docker run -d 容器名 : 運行容器
(8)docker logs -f -t --tail n 容器id(-f : 跟隨最新的日誌;-t :加入時間戳;--tail n : 倒數幾行): 查看容器日誌
演示命令:
docker run -d centos /bin/sh -c 'while true;do echo hello zzyy;sleep 2;done' : 每隔兩秒輸出內容
(9) docker top 容器ID : 查看容器內部運行的進程
(10) docker inspect 容器ID : 查看容器內部細節,如:docker inspect f791d79a4467
(11) docker attach 容器ID : 從新進入未中止的容器
(12) docker exec -t f791d79a4467 ls -l /tmp : 從新進入某個容器並執行容器中的命令,拿到結果反給宿主機
(13) docker cp 容器ID:路徑文件  /宿主機路徑 :copy容器內容到宿主機上

3.1 docker 命令使用舉例
好比重啓nginx過程:

  • sudo docker restart nginx,重啓
  • sudo docker logs -f nginx,查看重啓結果
  • sudo docker exec -it nginx /bin/sh,進入容器, 使用nginx -t命令查看

docker的鏡像

鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件,它包含運行某個軟件所需的全部內容,包括代碼、運行時須要的庫、環境變量和配置。

  • unionFS:聯合文件系統,一層層文件系統組成

clipboard.png

  • docker如何加載?
    docker的鏡像實際上由一層一層的文件系統組成,這種層級文件系統是unionFS

    • bootfs(boot file system):主要包含bootloader和kernel,bootloader主要引導加載kernel,linux剛啓動是會加載bootfs文件系統,在docker鏡像最底層是bootfs文件。這一層於咱們典型的Linux/unix系統同樣,包含boot加載器和內核。當boot加載完成以後整個內核就在內存中了,此時系統會卸載bootfs
    • rootfs(root file system):在bootfs之上,包含的就是典型linux系統中的/dev,/bin,/etc等目錄和文件。
docker commit -m=「提交信息」 -a=「做者」  容器ID  要建立的目標鏡像名稱:[標籤名]
docker commit -m=「helloword」 -a=「feifei」 0a8b6f21d511 feifei/tomcat02:1.2

docker容器數據卷

docker容器產生的數據,若是不經過docker commit生成新的鏡像,使得數據做爲鏡像的一部分保存下來,那麼當容器刪除後,數據天然就沒有了,爲了保存數據咱們使用docker的數據卷。數據卷使得數據能夠持久化和共享。

  • 命令添加數據卷
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄  鏡像名
例如:docker run -it -v /tmp/my-volume:/tmp/my-volume centos ;宿主機目錄:/tmp/my-volume和docker容器目錄/tmp/my-volume這兩個目錄中的數據能夠隨時同步,容器重啓後,也會同步;

docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro  鏡像名 (帶權限的命令,同步到容器內的文件read only)

這種方式不支持多臺宿主機都可以創建數據卷

  • DockerFile添加

能夠在Dockerfile中使用 VOLUME 指令來給鏡像添加一個或多個數據卷
1.建立Dockerfile文件目錄
/Users/ShiFeifei/Software/docker-config,在這個目錄下

touch Dockerfile 
vim Dockerfile

添加以下內容

FROM centos
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

2.新建一個 docker 容器

docker build -f /Users/ShiFeifei/Software/docker-config/Dockerfile -t sff/centos .

Dockerfile

Dockerfile 是用來構建 Docker鏡像的構建文件,是由一系列命令和參數構成

Dockerfile 構建步驟

  • 編寫Dockerfile文件
  • docker build
  • docker run

Dockerfile 文件執行規則

  • 關鍵字指令都必須是大寫字母,而且後面要跟隨至少一個參數
  • 指令按照從上到下順序執行
  • #表示註釋
  • 每條指令都會建立一個新的鏡像層,並對鏡像進行提交

Dockerfile、Docker鏡像和Docker容器分別表明了軟件的三個不一樣階段

  • Dockerfile是軟件的原材料
  • Docker鏡像是軟件的交付品
  • Docker容器則能夠認爲是軟件的運行態

Dockerfile面向開發,Docker鏡像成爲軟件交付標準,Docker容器則涉及部署與運維,三者缺一不可,是Docker體系的基石。

clipboard.png

Dockerfile 保留字指令

  • FORM : 基礎鏡像,當前要建立的來自於這個基礎鏡像
  • MAINTAINER : 鏡像維護者的姓名和郵箱地址
  • RUN : 容器構建時須要運行的命令
  • EXPOSE : 當前容器啓動後對外暴露的端口聲明
  • WORKDIR : 指定在容器建立後,終端默認登陸進來的工做目錄,能夠理解爲家目錄
  • ENV : 設置環境變量
  • ADD : 將宿主機目錄下的文件拷貝給鏡像,且ADD命令會自動處理URL和解壓壓縮包
  • COPY : 相似ADD,拷貝文件和目錄到鏡像中
  • VOLUME : 指定容器數據卷
  • CMD : 指定一個容器啓動時要運行的命令,Dockerfile 中能夠有多個CMD命令,但只有最後一個生效;CMD 會被 docker run 以後的參數覆蓋
  • ENTRYPOINT : 指定一個容器啓動時要運行的命令,目的和CMD同樣,都是指定容器啓動程序及參數,參數不會被覆蓋,只會追加
  • ONBUILD :

clipboard.png

案例

1.實現一個功能,定製一個 mycentos 支持vim、ifconfig命令,而且修改登陸後的默認路徑

FROM centos
ENV homePath /tmp
WORKDIR $homePath  #登陸時的目錄是 /tmp
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD /bin/bash

2.自定義一個centos,自帶 tomcat 、jdk

FROM lentos
MAINTAINER shifeifei<shifeifei6@163.com>

#把宿主機當前路徑下的文件c.txt拷貝到容器的/usr/local/路徑下
COPY c.txt /usr/local/test.txt

#把Java和tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/

#安裝vim編輯器
RUN yum -y install vim

#設置工做訪問時的WORKDIR路徑
ENV MYPATH /usr/local
WORKDIR $MYPATH

#配置Java、tomcat環境變量
ENV JVAV_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#容器運行時監聽端口
EXPOSE 8080
#啓動運行tomcat
#CMD [「/usr/local/apache-tomcat-9.0.8/bin/startup.sh」,"run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
相關文章
相關標籤/搜索