docker 經常使用命令

docker和傳統虛擬化方式不一樣:java

  1. 傳統虛擬化技術是虛擬出一套硬件後,在其上運行一個完整的操做系統,在該系統上運行所需應用進程;
  2. 容器內的應用進程直接運行於宿主的內核,容器沒有本身的內核,也沒有硬件虛擬。所以更爲輕便
  3. 每一個容器之間相互隔離,每一個容器都有本身的文件系統,容器直接的進程不會相互影響,能區分計算資源

 

docker三要素:mysql

鏡像(Image):一個只讀的模板。鏡像能夠用來建立docker容器,一個鏡像能夠建立不少容器linux

容器(Container):docker利用容器獨立運行的一個或一組應用。容器是鏡像建立的運行實例。nginx

能夠被啓動,開始,中止,刪除。每一個容器都是相互隔離的、保證安全的平臺。sql

能夠把容器當作簡易版的Linux環境(root權限,進程空間,用戶空間和網絡空間)和運行在其中的應用程序。docker

容器的定義和鏡像幾乎相同,也是一堆層的統一視角,惟一區別是容器最上面一層是可讀可寫的。shell

倉庫(Repository):存放鏡像文件的場所。ubuntu

倉庫(Repository)和倉庫註冊服務器(Registry)是有區別的。倉庫註冊服務器上每每存放多個倉庫,每一個倉庫又包含多個鏡像,每一個鏡像都有本身的惟一標籤(tag).centos

倉庫分爲公開倉庫(public)和私有的倉庫(private)。最大的公開倉庫是Docker Hub(https://hub.docker.com/tomcat

 

docker使用EPEL發佈,RHEL系的OS首先確保已經持有EPEL倉庫,不然先檢查os的版本,而後安裝相應的EPEL包

 

docker經常使用幫助命令 docker version,docker info,docker --help

 

docker 鏡像命令:

  1. docker images

 

REPOSITORY:鏡像倉庫源

TAG:鏡像的標籤

IMAGE ID:鏡像ID

CREATED:建立時間

SIZE:鏡像大小

同一個倉庫源能夠有多個TAG,表明這個倉庫源的不一樣版本,使用REPOSITORY:TAG 來定義不一樣的鏡像。

若是不指定一個鏡像的版本標籤,例如只使用ubuntu,docker會默認使用ubuntu:lastest鏡像

 

OPTIONS說明:-a:列出本地全部鏡像(含中間映像層)

-q:只顯示鏡像ID

--digests:顯示鏡像的摘要信息

--no-trunc:顯示完整的鏡像信息

 

  1. docker search

docker search [OPTIONS] 鏡像名字

OPTIONS說明:--no-trunc:顯示完整的鏡像描述

  -s:列出收藏數不小於指定值的鏡像(Flag --stars has been deprecated, use --filter=stars=3 instead)

  --automated:只列出automated build類型的鏡像

 

  1. docker pull

docker pull tomcat 等價於docker pull tomcat:latest

 

  1. docker rmi

刪除單個:docker rmi 鏡像ID或鏡像名 #docker rmi hello-world等價於docker rmi hello-world:latest

-f:強制刪除

刪除多個:docker rmi 鏡像名1:TAG 鏡像名2:TAG  

刪除所有:docker rmi -f $(docker images -qa)

 

Docker 容器命令:

  docker create [OPTIONS] IMAGE [COMMAND] [ARG…]

  建立一個容器但不啓動它。

 

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

OPTIONS: --name=「容器新名字」:爲容器指定一個名稱

   -d:後臺運行容器,並返回容器ID,即啓動守護式容器

   -i:以交互模式運行容器,一般與-t同時使用

   -t:爲容器從新分配一個僞輸入終端,一般與-i同時使用

   -P:隨機端口映射

   -p:指定端口映射,有如下四種格式:

ip:hostPort:containerPort

ip::containerPort

hostPort:containerPort

containerPort

  

OPTIONS說明: -a stdin: 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項; -d: 後臺運行容器,並返回容器ID; -i: 以交互模式運行容器,一般與 -t 同時使用; -P: 隨機端口映射,容器內部端口隨機映射到主機的高端口 -p: 指定端口映射,格式爲:主機(宿主)端口:容器端口 -t: 爲容器從新分配一個僞輸入終端,一般與 -i 同時使用; --name="nginx-lb": 爲容器指定一個名稱; --dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致; -h "mars": 指定容器的hostname; -e username="ritchie": 設置環境變量; --env-file=[]: 從指定文件讀入環境變量; --cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運行; -m :設置容器使用內存最大值; --net="bridge": 指定容器的網絡鏈接類型,支持 bridge/host/none/container: 四種類型; --link=[]: 添加連接到另外一個容器; --expose=[]: 開放一個端口或一組端口; --volume , -v: 綁定一個卷
OPTIONS說明

 

 

  1. docker ps

docker ps [OPTIONS]:查看docker有哪些容器在運行

OPTIONS:-a:列出當前全部正在運行的容器+歷史上運行過的容器

       -l:顯示最近建立的容器

       -n 3:顯示最近3個建立的容器

       -q:靜默模式,只顯示容器編號

       --no-trunc:不截斷輸出

 

  1. 退出容器

exit:容器中止退出

ctrl+P+Q:容器不中止退出

  1. 啓動容器

docker start 容器ID或者容器名

  1. 重啓容器

docker restart 容器ID或者容器名

  1. 中止容器

docker stop 容器ID或者容器名

  1. 強制中止容器

docker kill 容器ID或者容器名

  1. 刪除已中止的容器

docker rm 容器ID

刪除多個容器:docker rm -f $(docker ps -a -q)

docker ps -a -q| xargs docker rm

 

重要:

docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 2; done"

 

docker run -d 鏡像:後臺運行鏡像。

docker容器後臺運行,就必須有一個前臺進程。容器運行的命令若是不是那些一直掛起的命令(好比top,tail),就是會自動退出的。

 =====================

 

  1. 鏡像原理:

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

  聯合文件系統(UnionFS):

  是一種分層,輕量級,高性能的文件系統,它支持文件系統的修改做爲一次提交來層層疊加。Union文件系統是docker鏡像的基礎。鏡像經過分層來繼承,基於基礎鏡像,能夠製做各類各樣的應用鏡像。特性:一次加載多個文件系統,可是在外面看來,只有一個文件系統。聯合加載會把各個文件疊加起來,這樣的文件系統會包含全部的底層和目錄。

  docker鏡像加載原理:

  bootfs(boot file system)主要包含bootloader 和kernel,bootloader主要是引導加載kernel。linux剛啓動時會加載bootfs系統。docker的底層就是bootfs,Linux系統啓動時,經過bootloader加載內核,加載完成後內核就在內存中了,此時系統將會卸載bootloader。

  rootfs(root file system),在bootfs之上,典型的是Linux系統的標準文件和目錄(/dev,/etc。。。)。rootfs是不一樣操做系統的發行版(Ubuntu,centos etc)。

 

特色:鏡像都是隻讀的,當容器啓動時,一個可寫層被加載到鏡像的頂部,這一層叫容器層,容器層下的都叫作鏡像層。

 

鏡像提交:

docker commit 提交容器副本使之成爲一個新的鏡像

docker commit -m "描述信息" -a "做者" 容器ID 要建立的鏡像名:標籤

 

 

容器是一個簡易的Linux系統包括root用戶權限,進程空間,用戶空間和網絡空間等

啓動守護式進程:docker run -d 容器名

查看容器日誌:docker logs -f -t --tail 容器id

    -t:加入時間戳(time)

    -f:持續輸出

    --tail 數字:顯示後多少行

查看容器內進程:docker top 容器ID

查看容器內部細節:docker inspect 容器ID

操做容器並以命令行交互:1. docker exec -it 容器ID /bin/bash

            2. docker attach 容器ID:從新進入docker

            區別:attach 進入容器啓動的終端 exec:在容器中啓動新的終端,並能夠啓動新的進程,exit不會終結容器

        docker exec -t centos容器id ls -l /tmp:查看centos容器內/tmp路徑下的文件並返回給宿主機

        -t:tty命令行 -i:interactive交互式

從容器內拷貝文件到宿主機:docker cp 容器ID:docker內路徑 宿主機路徑

 

容器數據卷 

概念:容器和宿主機之間共享數據的文件夾

特色:1.數據卷可在容器間共享或重用數據

  2.卷中的更改能夠直接生效

  3.數據卷中的更改不會包含在鏡像中

  4. 數據卷的生命週期一直持續到沒有容器使用它爲止

 

容器內添加:

  1.直接命令添加

    命令:docker run -it -v /宿主機絕對路徑:/容器內路徑 鏡像名(--mount source=myvol2,target=/app 也可)

    查看數據卷是否掛載成功:docker inspect containerID (會在Mounts:"RW":true 顯示 read write)

    容器中止後再啓動依然會同步

    帶權限的容器數據卷:docker run -it -v /宿主機絕對路徑:/容器內路徑:ro 鏡像名(read only)

  2.Dockerfile添加

    VOLUME["/dataVolumeContainer", "/dataVolumeContainer2", "/dataVolumeContainer3"]

    說明:出於可移植性和分享的考慮,用-v 主機目錄:容器目錄這種方法不可以直接在Dockerfile中實現。並不能保證全部的宿主機都存在這樣的目錄。

    docker build -f /DockerfilePath -t 鏡像名稱 .    #-f:file -t:命名空間 最後還有一個點

    使用: docker inspect containerID 查看映射的宿主機路徑

    若是出現docker掛載主機目錄docker訪問出現cannot open directory.:Permission denied, 解決辦法:在掛載目錄後面多加一個--privieged=true 便可

  

  數據卷容器:命名的容器掛載數據卷,其它容器經過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器

  容器間傳遞共享: --volume-from

  docker run -it --name c02 --volume-from c01 imageID

  刪除數據卷容器後子容器依然能夠共享數據卷,由於都綁定的是同一個宿主機目錄。容器之間配置信息的傳遞,數據卷的生命週期一直持續到沒有容器使用它爲止。 

 

Dockerfile

  概念:Dockerfile是用來構建docker鏡像的構建文件,是由一系列命令和參數構建成的腳本。

  構建三步曲:編寫Dockerfile -> docker build -> docker run

  scratch: 全部鏡像的父鏡像至關於java object類

Dockerfile基礎:

  1. 每條保留字指令都必須爲大寫且後面必須跟隨至少一個參數

  2. 指令按照從上到下,順序執行。

  3. #表示註釋

  4. 每條指令都會建立一個新的鏡像層,並對鏡像進行提交

Docker執行Dockerfile的大體流程:

  1. docker從基礎鏡像運行一個容器

  2. 執行一條指令並對容器做出修改

  3. 執行相似docker commit 的操做提交一個新的鏡像層

  4. docker再基於剛提交的鏡像運行一個新的容器

  5. 執行Dockerfile中的下一條指令直至全部指令都執行完成

Dockerfile、Docker鏡像、Docker容器關係:

  1. Dockerfile定義了進程所須要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態連接庫、操做系統發行版、服務進程和內核進程等。

  2.Docker鏡像:在用Dockerfile定義一個文件以後,docker build時會產生一個Docker鏡像,當運行Docker鏡像時,會真正開始提供服務;

  3. Docker容器,容器是直接提供服務的。

Dockerfile保留字指令:

FROM:基礎鏡像,當前新鏡像是基於哪一個鏡像的。

MAINTAINER: 鏡像維護者的姓名 和郵箱地址

RUN:容器構建時須要的命令

EXPOSE:當前容器對外暴露的端口號

WORKDIR:指定在建立容器後,終端默認登錄的進來工做目錄,一個落腳點

ENV:用來在構建鏡像過程當中設置環境變量 ENV KEY VALUE

ADD:在宿主機目錄下的文件拷貝進鏡像而且ADD命令會自動處理URL和解壓tar壓縮包

COPY:相似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中<源路徑>的文件/目錄複製到新的一層的鏡像內的<目標路徑>位置

  1)copy src dest

  2)COPY ["src", "dest"]
VOLUME:容器數據卷,保存數據和數據持久化工做

CMD:指定一個容器啓動時要運行的命令

  CMD指令的格式和RUN類似,也是兩種格式:

  1)shell格式:CMD <命令>

  2)exec格式:CMD ["可執行文件", "參數1", "參數2"]

  參數格式:CMD ["參數1", "參數2"...], 在指定了ENTRYPOINT 指令後,用CMD指定具體的參數。

Dockerfile中能夠有多個CMD命令,但只有最後一個生效,CMD會被docker run以後的參數替換。

ENTRYPOINT:指定一個容器啓動時要運行的命令

  ENTRYPOINT的目的和CMD同樣,都是在指定容器啓動程序及參數。(追加)


ONBUILD:當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發。

 

docker run -p 3306:3306 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

 

Docker build 鏡像

docker build -f /DockerfilePath -t 鏡像名稱 .    #-f:file -t:命名空間 最後還有一個點

 

Docker commit 鏡像

docker commit -a author -m "commit content" containerID imageName:version

 

Mac 查看docker volume路徑

https://www.jianshu.com/p/f0ad94ba8ba4

相關文章
相關標籤/搜索