docker和傳統虛擬化方式不一樣:java
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 鏡像命令:
REPOSITORY:鏡像倉庫源
TAG:鏡像的標籤
IMAGE ID:鏡像ID
CREATED:建立時間
SIZE:鏡像大小
同一個倉庫源能夠有多個TAG,表明這個倉庫源的不一樣版本,使用REPOSITORY:TAG 來定義不一樣的鏡像。
若是不指定一個鏡像的版本標籤,例如只使用ubuntu,docker會默認使用ubuntu:lastest鏡像
OPTIONS說明:-a:列出本地全部鏡像(含中間映像層)
-q:只顯示鏡像ID
--digests:顯示鏡像的摘要信息
--no-trunc:顯示完整的鏡像信息
docker search [OPTIONS] 鏡像名字
OPTIONS說明:--no-trunc:顯示完整的鏡像描述
-s:列出收藏數不小於指定值的鏡像(Flag --stars has been deprecated, use --filter=stars=3 instead)
--automated:只列出automated build類型的鏡像
docker pull tomcat 等價於docker pull tomcat:latest
刪除單個: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…]
建立一個容器但不啓動它。
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: 綁定一個卷
docker ps [OPTIONS]:查看docker有哪些容器在運行
OPTIONS:-a:列出當前全部正在運行的容器+歷史上運行過的容器
-l:顯示最近建立的容器
-n 3:顯示最近3個建立的容器
-q:靜默模式,只顯示容器編號
--no-trunc:不截斷輸出
exit:容器中止退出
ctrl+P+Q:容器不中止退出
docker start 容器ID或者容器名
docker restart 容器ID或者容器名
docker stop 容器ID或者容器名
docker kill 容器ID或者容器名
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),就是會自動退出的。
=====================
鏡像是一個輕量級、可執行的獨立軟件包,用來打包運行環境和基於運行環境開發的軟件。它包含應用軟件所需的全部內容,包括代碼,運行時,庫,環境變量以及配置文件。
聯合文件系統(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路徑