【docker】docker介紹安裝和使用

 

一.docker簡介:php

     docker是容器技術的一個表明,而容器技術是將程序打包和隔離的一種技術,其實它並非一個新技術,以前在linux內核中早已存在,真正被大衆所用所瞭解是由於docker的出現。docker之因此流行起來,是由於解決了一些計算機領域的痛點,它解決了軟件包裝的問題,保證開發與運維及測試環境的一致。docker能夠將任何應用以輕量級容器的形式來打包,遷移發佈和運行。能夠簡單的認爲是一個輕量級的虛擬機,可是也不算是虛擬機。html

  2013年docker開源,它跨平臺,支持windows,Mac,Linux系統。Docker 是 PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎.java

  docker官網:https://www.docker.com/linux

  docker的github託管地址:https://github.com/dockernginx

  docker官方文檔:https://docs.docker.com/get-started/git

  

 

二. Docker思想:github

    1.集裝箱web

     docker的logo是一個鯨魚上面裝着不少集裝箱,想象下在沒有集裝箱以前,運輸貨物很是零散,沒有規矩,運輸過程當中說不定有些東西會掉了,優良集裝箱,全部貨物就被密封在集裝箱中,集裝箱很大也不容易丟失,這樣就保證了咱們貨物的安全原樣的送到目的地。那麼咱們能夠把貨物想象成咱們的程序,假如能把一臺機器上的程序部署到新的一臺機器上,那麼會拷貝過去,可是這過程當中有可能會由於人爲的疏忽少拷貝了一些配置文件或者相關文件,致使在另外一臺機器上程序啓動不起來。有了docker的集裝箱就是幫咱們解決這樣的問題,它會保證咱們的程序無論在哪運行不會缺乏應有的東西。docker

    2.標準化編程

    能夠從三個方面解釋標準化,1.運輸方式的標準化。2.存儲方式標準化。3.Api接口標準化。

    3.隔離

     docker是一種輕量級容器,它有本身的一套內部環境,好比cpu,內存,磁盤等,能夠隔離外面主機。docker使用了LXC技術來實現這種獨立的環境,LXC又名Linux container,是一種虛擬化的解決方案,這種是內核級的虛擬化,這是一種輕量級的容器虛擬化,能夠實現docker環境的快速創建,銷燬。

 

三.docker能解決哪些問題

    1.解決環境不一致:

      常常遇到開發在本地運行沒錯,測試那邊運行同一個程序出現問題。出現這種問題通常都是運行環境不一致致使的。一個應用程序運行須要一系列的依賴,如操做系統,web服務器,相關的配置文件,對應的編程語言的代碼及相應程序解釋器等等,若是其中一個變了程序就有可能失敗,好比程序調用了一些系統命令,可是換個環境沒有這些命令,那麼就會致使程序啓動失敗,程序的版本也會致使程序的錯誤,如php7和php5.3語法就有些不同。

    而docker就會把全部所須要的配置文件,程序代碼等所須要的一切環境打包到一個集裝箱中,至關於把開發環境打了一個包,這個包環境和開發的本地的環境一摸同樣,這樣就保證了運行環境的一致性,這個包就能夠被測試引用到他本地運行,因此docker就是解決環境不一致的問題。

    2.程序隔離

      Linux是多用戶系統,上面能夠運行多種程序和服務,當其中一個程序或服務運行出現故障時候,消耗不少cpu,或者大量IO操做,佔用大量內存,會牽連服務器上的其餘運行中的軟件,而docker能夠避免這種狀況出現。由於docker自己就是一個個獨立隔離的環境,在docker啓動的時候就會被限定使用多大的內存及其餘資源使用限度,因此docker環境裏的程序出現問題也會只是影響這個docker裏的程序,不會影響其餘服務和程序。

    3.資源快速擴張和彈性伸縮

      如今電商系統常常會有秒殺活動,還有雙十一,618這樣特別的促銷活動。每當這樣的節日來臨時候,電商系統都會面臨大量的訪問,因此須要更多的軟硬件資源去應對這樣大量的訪問量,而平時卻不須要這麼多的服務器,不如也會形成極大的浪費,因此在節假日來臨前擴充能夠應對節日所須要的服務器數量,節日以後在將這些多餘的服務器下線,可是這會給運維帶來很是大的工做量,由於運維須要分別給每臺機器搭建環境配置所須要點一切軟件,而且還得調試,這是一個很是繁瑣的過程。可是docker讓這些事變得簡單,只須要經過docker管理軟件點擊鼠標配置下,就會立馬從10臺服務器變成100臺或者更多。

 

 四.docker核心技術

     docker裏面有三個核心的詞彙鏡像,倉庫,容器,鏡像是上面例子中的集裝箱,倉庫是存放鏡像的地方,容器是運行程序的地方。docker運行一個程序的過程就是去倉庫把鏡像拉到本地,而後用docker命令在本地把docker運行起來。

    1.鏡像(image):從本質上來講鏡像就是一系列的文件,能夠包括應用程序的文件,也能夠包括運行環境的文件,這些鏡像文件用一種特殊的文件格式來保存。linux有種存儲技術叫作聯合文件系統(Union File System),這是一種分層的文件系統,能夠將不一樣的文件目錄掛載在同一個虛擬文件系統下。怎麼理解呢,下面有個例子。

songguojundeMBP:~ songguojun$ ls dir1    //在dir1目錄下看到下面三個目錄
Desktop        Downloads    Movies        
songguojundeMBP:~ songguojun$ ls dir2    //在dir2目錄下看到下面另外三個目錄
code Documents Library songguojundeMBP:~ songguojun$ ls dir //聯合文件系統中,在dir目錄下看到下面六個目錄,也就是上面兩個目錄共同的目錄文件集合 Desktop Downloads Movies code Documents Library

     其實就是聯合在不一樣磁盤上的不一樣的文件系統到一個公共目錄下。經過聯合文件系統能夠實現文件的分層,docker鏡像就是利用這種分層的概念來實現鏡像存儲。下面這張圖就是鏡像存儲格式。

    

    在Docker鏡像分爲基礎鏡像和父鏡像,沒有父鏡像的鏡像被稱爲基礎鏡像。用戶是基於基礎鏡像來製做各類不一樣的應用鏡像。這些應用鏡像共享同一個基礎鏡像層,提升了存儲效率。

    2.容器(container)

      容器的本質就是一個運行在服務器上的進程,docker鏡像中的每一層文件都是隻讀的,只有最上面一層上可寫的,這一層就是容器,容器這一層是可寫的,當容器對下一層的鏡像去寫東西,會將下一層的鏡像中要修改的文件拷貝一份到最上層容器中,而後在對它修改,修改以後當程序讀取這個最新的文件,由於程序讀取會從最頂層開始查找。因爲鏡像是不能夠修改的,因此同一個容器能夠生成多個容器獨立運行,它們之間沒有任何干擾。

 

    鏡像和容器區別:

      鏡像實際上是有多個只讀層,它們重疊在一塊兒,除了最上面一層可寫其它都是隻讀模板,而容器就是鏡像的一個運行實例。

    3.倉庫(repository)

      倉庫就是存放鏡像的地方,可使用docker pull命令從docker hub拉取咱們須要的鏡像,進行操做。docker有官方等其餘公司提供的鏡像中心,也支持搭建本身私有的鏡像中心。

      經常使用倉庫地址列表:

        hub.docker.com (docker官方倉庫)

        c.163.com(網易蜂巢)

 

        hub.docker.com 裏面經常使用鏡像列表

         

 

 五.Docker 架構

  

 

                docker架構圖

  1.DOCKER_HOST:docker操做宿主機,上面運行了Docker daemon核心程序,負責各類docker操做,好比下載docker鏡像或者運行一個容器。

  2.Client:客戶端用命令和Docker daemon交互,好比pull,build ,run等,交給Docker daemon來操做,和遠端鏡像倉庫交互。

  3.Registry:公司的sass服務,是存放 Docker 鏡像的倉庫,Docker daemon能夠和Registry交互。

 

 六.docker的安裝

  安裝docker先看下centos版本

[root@localhost ~]# uname -r
3.10.0-514.21.2.el7.x86_64

 

   第一個命令,下載

wget -qO- https://get.docker.com/ | sh

 

   下載完後,docker默認狀況是容許root去運行,全部建議添加一個用戶到docker組

  先查看用戶組

cat /etc/group

 

   

  咱們添加一個用戶

[root@localhost docker]# usermod -aG docker songguojun

 

  #groups 查看當前登陸用戶的組內成員

  查看加入狀況

cat /etc/group

 

   

  查看docker是否安裝成功

docker info

 

   若是出現下面命令

  

  說明docker服務沒有啓動

  咱們啓動下

service docker start

 

  

  在執行 docker info

  

  docker安裝成功

  咱們能夠直接輸入docker命令 查看docker命令的選項

  

 

  咱們看到裏面有個run參數,意思是在一個新容器中執行命令,能夠單獨查看這個參數意思

[root@localhost ~]# docker run --help

Usage:    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the container
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in microseconds

 docker window安裝:https://docs.docker.com/docker-for-windows/install/

     Mac安裝:https://docs.docker.com/docker-for-mac/install/

    更多安裝參考: http://www.docker.org.cn/book/install/supported-platform-17.html

七.docker的使用

  咱們先輸入如下命令

songguojundeMBP:java songguojun$ docker run centos echo hello docker   #這個命令做用是用docker運行centos鏡像 並輸出hello docker字符串
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos                      #在docker運行鏡像前會查看本地環境是否有這個要運行等鏡像 這裏就是查看centos這個鏡像,發現沒有就從遠端讀取開始下載
8ba884070f61: Pull complete 
Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475
Status: Downloaded newer image for centos:latest              #鏡像下載成功
hello docker                                    #輸出字符串

查看本地有哪些鏡像

songguojundeMBP: songguojun$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              9f38484d220f        3 months ago        202MB     

 運行nginx服務

songguojundeMBP: songguojun$ docker run -p 8080:80 -d daocloud.io/nginx #-d參數表明守護進程
Unable to find image 'daocloud.io/nginx:latest' locally
latest: Pulling from nginx
743f2d6c1f65: Pull complete 
6bfc4ec4420a: Pull complete 
688a776db95f: Pull complete 
Digest: sha256:e770165fef9e36b990882a4083d8ccf5e29e469a8609bb6b2e3b47d9510e2c8d
Status: Downloaded newer image for daocloud.io/nginx:latest
720bfbd6d9beaaea8b7bb9506c6e45345a4dcd29e6486a4798b4aa31488fba13

 

上面開啓了本地nginx服務,咱們在瀏覽器上輸入http://localhost:8080/

 

查看當前運行的容器

songguojundeMBP: songguojun$ docker ps      #顯示當前正在運行的容器   docker ps -a 列出全部的容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
720bfbd6d9be        daocloud.io/nginx   "nginx -g 'daemon of…"   29 seconds ago      Up 28 seconds       0.0.0.0:8080->80/tcp   quirky_blackwell

 CONTAINER ID:容器id

 PORTS:端口映射關係

 修改nginx默認首頁

songguojundeMBP:tmp songguojun$ cat index.html 
<html>
<h1>hello docker</h1>
</html>
songguojundeMBP:tmp songguojun$ docker cp index.html  720bfbd6d9be://usr/share/nginx/html

 

 再次查看

不過這個修改只是暫時的,當再次重啓容器時候,以前的修改都會消失。

中止docker容器

songguojundeMBP:tmp songguojun$ docker stop 720bfbd6d9be
720bfbd6d9be

再次設置

[songguojundeMBP:tmp songguojun$ docker run -p 8080:80 -d daocloud.io/nginx # -d表示守護進程
3a69a07abb20cd12b238063ca8aaa6aa07d592266eb0e93d93ea9a0c15853375
[songguojundeMBP:tmp songguojun$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
3a69a07abb20        daocloud.io/nginx   "nginx -g 'daemon of…"   24 seconds ago      Up 22 seconds       0.0.0.0:8080->80/tcp   festive_khorana
[songguojundeMBP:tmp songguojun$ docker cp index.html  3a69a07abb20://usr/share/nginx/html
[songguojundeMBP:tmp songguojun$ docker commit -m 'fun' 3a69a07abb20 nginx-newimage     保存image
sha256:8c9627568f55f12c1fe8b561253ef89bdc58b6511f513b3de2759122dc4e6203     新產生的image的id
[songguojundeMBP:tmp songguojun$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx-newimage      latest              8c9627568f55        21 seconds ago      109MB     這個是上面新產生的image
daocloud.io/nginx   latest              53f3fd8007f7        6 weeks ago         109MB
centos              latest              9f38484d220f        3 months ago        202MB

 

啓動容器並進入該容器中

songguojundeMBP:docker songguojun$ docker run -i -t centos /bin/bash   #啓動一個centos容器及啓動容器時候到命令 /bin/bash
[root@5ce0363609a4 /]# ls                #當前centos容器環境  說明已經進入了  5ce0363609a4是容器的名字
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

 

 

八.Dockerfile

  上面咱們經過docker commit能夠建立一個新的鏡像,咱們也能夠經過一個配置文件去一步步構建docker build新的鏡像,這個配置文件就是Dockerfile,能夠幫助咱們從一個基礎鏡像開始創建一個自定義鏡像,使用配置文件的方式能夠更加方便。

編寫Dockerfile文件

 

[songguojundeMBP:docker songguojun$ cat Dockerfile 
FROM alpine:latest                   #alpine是專門針對docker作的一個極小的linux環境  image會很是小
MAINTAINER xbf
CMD echo "hello Docker"

 

而後用docker build構建

[songguojundeMBP:docker songguojun$ docker build -t hello_docker . #構建
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM alpine:latest
latest: Pulling from library/alpine
921b31ab772b: Pull complete 
Digest: sha256:ca1c944a4f8486a153024d9965aafbe24f5723c1d5c02f4964c045a16d19dc54
Status: Downloaded newer image for alpine:latest
 ---> 4d90542f0623
Step 2/3 : MAINTAINER xbf
 ---> Running in 5c0c87f55732
Removing intermediate container 5c0c87f55732
 ---> 92236846ad7f
Step 3/3 : CMD echo "hello Docker"
 ---> Running in 86e5f878788c
Removing intermediate container 86e5f878788c
 ---> 7378acc65286
Successfully built 7378acc65286
Successfully tagged hello_docker:latest

[songguojundeMBP:docker songguojun$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello_docker        latest              7378acc65286        2 minutes ago       5.58MB #這個就是生成的新的image
<none>              <none>              8c9627568f55        15 hours ago        109MB
alpine              latest              4d90542f0623        3 days ago          5.58MB
daocloud.io/nginx   latest              53f3fd8007f7        6 weeks ago         109MB
centos              latest              9f38484d220f        3 months ago        202MB

[songguojundeMBP:docker songguojun$ docker run hello_docker #運行
hello Docker

 編寫Dockerfile文件去運行

 編寫Dockerfile文件以下

FROM ubuntu
MAINTAINER songguojun
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

 

構建

songguojundeMBP:dockefile2 songguojun$ docker build -t songguojun/run-nginx . # 點.表明當前目錄上下文
Sending build context to Docker daemon  3.072kB
Step 1/8 : FROM ubuntu
latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest
 ---> 4c108a37151f
Step 2/8 : MAINTAINER songguojun
 ---> Running in 7f9ca70095c4
Removing intermediate container 7f9ca70095c4
 ---> 671c843cfffd
Step 3/8 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
 ---> Running in 6238932a7dca
Removing intermediate container 6238932a7dca
 ---> 4f672cace3ec
Step 4/8 : RUN apt-get update
Removing intermediate container 6e93cc3d0300
 ---> dfc95c276b1d
Step 6/8 : COPY index.html /var/www/html
 ---> 2407837e404b
Step 7/8 : ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
 ---> Running in f66729e00481
Removing intermediate container f66729e00481
 ---> 7e34bc3f7eb6
Step 8/8 : EXPOSE 80
 ---> Running in 3dbdd072eaa8
Removing intermediate container 3dbdd072eaa8
 ---> 2d0b94c15efc
Successfully built 2d0b94c15efc
Successfully tagged songguojun/run-nginx:latest

 

運行

songguojundeMBP:dockefile2 songguojun$ docker run -d -p 80:80 songguojun/run-nginx 
08f8f58bf0bf8977a528a33bd35efca667dfb71cc4ca45017bdade452ad736da
songguojundeMBP:dockefile2 songguojun$ curl http://localhost:80

docker runing            #這個是index.html文件裏的內容

 

 

 Dockerfile指令

   Dockerfile指令都是大寫,後面跟着參數。

指令參數 做用
FROM  base image
RUN 執行命令
ADD 添加文件,能夠將遠程的文件添加入容器
COPY 拷貝文件
CMD 執行命令
EXPOSE 暴露端口
WORKDIR 指定路徑
MAINTAINER 維護者
ENV 設定容器裏的環境變量
ENTRYPOINT 容器入口,和CMD相似
USER 指定用戶
VOLUME mount point,指定容器所掛載的卷

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

鏡像分層

   Dockerfile配置文件裏每一條命令都會產生一個新層,每一層對應一個獨立的字符串id。

  

  上面黃色一層表示容器層,是可讀可寫,它產生於image運行後,這樣保證容器是能夠改變的。下面紅色的是隻讀。

  分層的好處可使相同的層在不一樣的image裏複用。

 

九.Docke存儲技術Volume

  volume是提供獨立於容器外的持久化存儲。

songguojundeMBP:~ songguojun$ docker run -d --name  nginx -v /usr/share/nginx/html nginx
42ccf5ff54e62010ed44415fb25295619952411594f220abcb0365d0ba4938b9
songguojundeMBP:~ songguojun$ docker inspect nginx #獲取容器/鏡像的元數據.
[
    {
        "Id": "42ccf5ff54e62010ed44415fb25295619952411594f220abcb0365d0ba4938b9",
        "Created": "2019-07-01T12:23:20.678195837Z",
        "Path": "nginx",
        "Args": [
            "-g",
            "daemon off;"
        ],
        "State": {
.......

 "Mounts": [
            {
                "Type": "volume",
                "Name": "060bcb88df7ec3077f137182d545c21bd5eda97c931ca98acbe5dd390707c934",
                "Source": "/var/lib/docker/volumes/060bcb88df7ec3077f137182d545c21bd5eda97c931ca98acbe5dd390707c934/_data", #宿主機的路徑,會掛載到下面容器內的路徑
                "Destination": "/usr/share/nginx/html", #容器內部的路徑
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
............

 

   

 

下面列出docker經常使用命令

 

命令 做用
docker version 查看docker版本。
docker-compose --version 查看compose 版本信息
docker pull  從遠端獲取image
docker build  建立image
docker images 列出本地已有image
docker run 運行container
docker ps 列出container
docker rm 刪除已經結束的container
docker rmi 刪除一個image
docker cp 在host和container之間複製文件
docker commit 保存已經被改動的image生成一個新的鏡像
相關文章
相關標籤/搜索