一、介紹
1、 Docker的特性:
- 文件系統隔離:每個進程容器運行在一個完全獨立的根文件系統里。
- 資源隔離:系統資源,像CPU和內存等可以分配到不同的容器中,使用cgroup。
- 網絡隔離:每個進程容器運行在自己的網絡空間,虛擬接口和IP地址。
- 日志記錄:Docker將會收集和記錄每個進程容器的標准流(stdout/stderr/stdin),用於實時檢索或批量檢索。
- 變更管理:容器文件系統的變更可以提交到新的映像中,並可重復使用以創建更多的容器。無需使用模板或手動配置。
- 交互式shell:Docker可以分配一個虛擬終端並關聯到任何容器的標准輸入上。
2、docker 應用場景
- 加速本地開發:快速搭建好開發環境和運行環境。
- 自動打包和部署應用。
- 創建輕量級的私有Paas環境。
- 自動化測試和持續集成。
- 創建安全沙盒。
二、環境搭建:
Docker對Linux環境有兩個要求,一是64位系統,二是內核在3.8以上。 下面以centos 上搭建為例:
docker倉庫用來保存我們的images,當我們創建了自己的image之后我們就可以使用push、pull命令從公有或者私有倉庫下載、上傳鏡像;Docker Registry私有服務器用於保存管理我們的私有鏡像。
需要注意的是CentOS 6.X與7.0的安裝是有一點點不同的,CentOS-6上docker的安裝包叫docker-io,並且來源於Fedora epel庫,這個倉庫維護了大量的沒有包含在發行版中的軟件,所以先要安裝EPEL,而CentOS-7的docker直接包含在官方鏡像源的Extras倉庫(CentOS-Base.repo下的[extras]節enable=1啟用)。前提是都需要聯網。
centos 6.8 的具體安裝啟動過程如下。
- yum -y install docker-io
- service docker start
- chkconfig docker on
centos 7 的安裝啟動過程如下
- yum -y install docker
- systemctl start docker.service
- systemctl enable docker.service
三、基本操作&命令
簡單查詢:
- docker info
- docker search imangeName 從長款查詢容器。
- docker inspect imageName:version 查看鏡像設置
鏡像相關:
- docker images 查看所有本地鏡像。
- docker pull NAME[:TAG|@DIGEST] 下載鏡像:eg: docker pull centos 等級 docker pull centos:latest
- docker imi imageId 刪除鏡像(前提:鏡像啟動的容器都已經被刪除。)
- 本地鏡像的總描述文件
centos6.8: /var/lib/docker/repositories-devicemapper.json ( 注意centos 6.8 沒有var/lib/docker/image/文件夾, 在docker 1.10 后,容器的所有配置文件同意移動到了 /var/lib/docker/image文件夾中)
centos7.X: /var/lib/docker/image/devicemapper/repositories.json
- 本地單個鏡像的文件:
centos /var/lib/docker/graph/{imageid}/
json -保存着關於這個鏡像的元數據
layersize – 一個整數,表示layer的大小。
存儲: 一個鏡像就是的基礎是一系列的layers, 一個docker 鏡像就是一組制度的layer組成,
docker 1.7之前: docker images --tree 可以查看一個鏡像包含的所有layers
1.7之后: dockviz images -d |dog -Tpng -o images.png
- 容器儲存儲位置 centos 6.8/7 :
由於目Docker支持AUFS,Btrfs,Device mapper,OverlayFS,ZFS五種存儲驅動,所有各自存儲的位置是不一樣的
- 命令查看 docker image 結構 :
centos 6.8 &docker1.7: docker daemon -D -s overlay -g /varlib/docker 首先會提示內核版本過低
容器相關:
- docker ps : 查詢當前啟動的容器, docker ps -a (所有的包含停止的)
- docker stop xxx: 停止容器
- docker start containId 可以啟動一個已經停止的容器
- docker rm xxx: 刪除停止的容器
- ducker run 啟動一個容器 , 參數說明
-d 后台運行
-t -i 合用, 交互模式運行
-net 指定網絡, 默認bridge (會使用172段的ip依次分配給啟動的docker 容器), host 模式為共享主機的網絡配置和端口。
-p 當net不為host 模式時, 將容器的端口 映射到宿主機器的端口上。
--ip 指定容器的ip
-e 環境變量設置
- docker cp container:path hostpath 這個命令是從容器內復制文件到指定的路徑上
- 鏡像保存1: 導入導出容器為鏡像 export & import :
docker export containId >mycontain.tar 注意導出只是容器的靜態文件快照,docker file 描述將會丟失。
cat mycontain.tar |docker import - tqcommontomcat:0.01 導入發布為本地的一個鏡像。
- 鏡像保存2:導入導出鏡像為鏡像 2 save & load:
docker save imageName:version > save.tar 或者 docker save -o save.tar imageName:version保存鏡像,包含layers ,和dockerfile
docker load < /home/save.tar 或 docker load -i save.tar
- 鏡像保存3: commit ,提交當前容器為一個鏡像
docker commit contarinId imageName:version
docker daemon
所謂docker damemon 即為docker server 主進程, centos 6.8 : /etc/init.d/docker start , centos 7 : systemctl start docker.service
Docker 1.10增加了新功能(http://geek.csdn.net/news/detail/54953),從這個版本以后,用戶在Linux上跑Docker時都不必再以root權限運行了。
1.10之前所有容器都只能在Docker daemon下以root權限運行。
安全的命名空間. 通過命名空間,Docker 1.10將Docker daemon和容器區別開來,對二者的權限分別加以處理,同時為各個容器分配相應的權限等級。在1.10下,Docker daemon仍然要取得主機的root權限,但容器就可以不用了。
傳統的容器管理工具 LXC 即將退出 Docker 的舞台,
在 Linux 內核版本 3.10+ 上,使用內嵌的 overlay 驅動來完成跨主機的網絡互聯
在docker 1.10以前: 啟動dokcer server 實際執行命令為:docker -d $other_args
設置dns使用 docker -d --dns 8.8.8.8
設置dns搜索域 docker -d --dns-search example.com
輸出調試log docker -d -D
在docker 1.10 后: docker daemon $other_args
docker daemon -D -s overlay -g /var/lib/docker
進入容器內部:
- docker attach 老方式
- docker exec -ti containId /bin/bash
容器網絡
docker network ls 列出所有容器的網絡id ,和網絡模式
docker network inspect networkId 列出網絡的詳細信息
docker network connect --option containId 為運行中容器創建網絡
dockerfile 相關
- FROM imagename:version 時以每個鏡像為基礎 layer
- ENV key value 設置環境變量
- ADD hostFIle imagePath 把宿主機器上的文件添加的鏡像中, 請使用絕對路徑
- WORKDIR xxx 容器啟動時默認工作目錄
- RUN commond 是指build 過程中隨便執行的命令, 例如在鏡像中創建文件等。
- VOLUME 講宿主本地目錄掛載到容器上
- CMD 設置容器啟動的時候執行的命令
- ENTRYPOINT container啟動時執行的命令,但是一個Dockerfile中只能有一條ENTRYPOINT命令,如果多條,則只執行最后一條ENTRYPOINT沒有CMD的可替換特性
四、example
鏡像tqtestjava:2.0 制作,tqtestjava:2.0 是一個userauth 和userauthweb的運行環境,
容器啟動的功能包括:
1、能夠在容器內部自動更新svn代碼.
2、自動mvn install ,自動啟動兩個java .
3、容器的端口自動映射.
4、容器打包
下載一個基礎的centos 鏡像,docker pull centos
以交互模式啟動centos 容器: docker run -d -ti centos /bin/bash,
進入容器bash后,安裝yum , net , jdk, svn ,maven , svn co 社管代碼到 /usr/local/project/zhejiange 下, 編寫啟動腳本/usr/local/start_zhejiang.sh
(這里需要注意的是我一開始講許多環境變量設置在/etc/profile 中,其實對docker 來說,這可能是無效的,因為docker 的許多鏡像,都市linux 精簡版本 ,系統啟動也僅僅加載必要的資源),所以需要我們在docke run 是指定環境變量,或者在dockerfile 中指定(固定不變的話)。
提交鏡像: docker cmmoit mycontainId tqtestjava:1.0
5、tqtestjava:1.0 雖然有了我們需要自行的環境, 我們也可以以交互模式進入,啟動我們的應用,但是如果要讓我們的應用在容器啟動的時候自動啟動應用, 需要 在docker run 命令后面拼接以系列的環境變量, 換需要手動指定docker 啟動的時自行的腳本, 工作目錄等。
例如:
這對使用人員來說不太方面。
所以我們編寫dockeFile : dockerUseranthTest.txt
然后執行: docker build -f dockerUseranthTest.txt -t tqtestjave:2.0 .
這樣我們就新生成了一個 tqtestjave:2.0 鏡像。
最后執行: docker -d --net=host tqtestjave:2.0 就可以實現啟動容器時應用自啟動了
6、網絡選擇: 這里我們選擇host 模式, 不是說host 模式好,而且線上也不建議使用host模式。 而且因為如果我們選擇bridge 模式,需要在路由器上設置一個172段的路由網關,同時固定宿主機器上分配的docker 容器的ip 段。 這適合於有網絡經驗的人來搞。
五、docker REST API
docker的所有命令可以通過一系列的restful 的API , 這對生產環境編寫漂亮發布,部署腳本十分有效
docker images 可以等級與:
echo -e "GET /images/tomcat/json HTTP/1.0\r\n" |nc -U /var/run/docker.sock
docker ps 可以等級與:
echo -e "GET /containers/json HTTP/1.0\r\n" |nc -U /var/run/docker.sock
默認情況下 Docker 的守護進程啟動會生成一個 socket (/var/run/docker.sock)進程通信文件,而並沒有監聽端口,只能在本機操作 Docker。如果想在其它地方操作 Docker 主機,就需要讓 Docker 主機監聽一個端口號,這樣可以通過端口號就能實現遠程操作。
1、對於手動啟動的docker daemon :可以這樣配置
docker -d -H unix:///var/run/docker.sock -Htcp://0.0.0.0:5678
2、ubuntu :
vim /etc/default/docker.io :
DOCKER_OPTS=" -H unix:///var/run/docker.sock" =====修改為====>DOCKER_OPTS=" -H tcp://0.0.0.0:5678 -H unix:///var/run/docker.sock"
service docker.io restart
3、Red Hat 7系列
systemctl stop docker
vim /etc/sysconfig/docker
#修改other_args 的值
other_args=" -H tcp://0.0.0.0:5678 -H unix:///var/run/docker.sock"
systemctl start docker
配置驗證:
docker -H localhost:5678 version
六、相關資源
https://github.com/docker
QQ交流群:534368042
