docker入門


一、介紹

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  首先會提示內核版本過低

  1. root@ssdpc admin]# docker -d 
  2. WARN[0000] You are running linux kernel version 2.6.32-642.1.1.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0. 
  3. INFO[0000] Listening for HTTP on unix (/var/run/docker.sock) 
  4. INFO[0000] [graphdriver] using prior storage driver "devicemapper" 
  5. WARN[0000] Running modprobe bridge nf_nat failed with message: , error: exit status 1 
  6. INFO[0000] Loading containers: start.                   
  7. INFO[0000] Loading containers: done.                    
  8. INFO[0000] Daemon has completed initialization          
  9. INFO[0000] Docker daemon                                 commit=786b29d/1.7.1 execdriver=native-0.2 graphdriver=devicemapper version=1.7.1
復制代碼

             
容器相關:

  • 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 啟動的時自行的腳本, 工作目錄等。
例如:

  1. docker run -d  --net=host  -ti  -e MAVEN_HOME=/opt/maven  -e JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64 -e PATH=$PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/      tqtestjava:1.0  /usr/local/project/start_zhejiang.sh
復制代碼


這對使用人員來說不太方面。
所以我們編寫dockeFile : dockerUseranthTest.txt

  1. FROM tqtestjava:1.0
  2. ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64
  3. ENV MAVEN_HOME /opt/maven
  4. ENV PATH $PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/
  5. WORKDIR /usr/local/project/
  6. RUN date;sleep 100;date
  7. RUN echo "============end==="
  8. CMD ["/usr/local/project/start_zhejiang.sh", " start " , "start"]
  9. [root@ssdpc dockerapp]# ^C
  10. [root@ssdpc dockerapp]# ll
  11. total 8
  12. -rw-r--r--. 1 root root 335 Aug 31 15:48 dockerCommonTomcat
  13. -rw-r--r--. 1 root root 340 Aug 31 08:45 dockerUseranthTest
  14. [root@ssdpc dockerapp]# more dockerUseranthTest 
  15. FROM tqtestjava:0.04
  16. ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64
  17. ENV MAVEN_HOME /opt/maven
  18. ENV PATH=$PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/
  19. WORKDIR /usr/local/project/
  20. RUN date;sleep 100;date
  21. RUN echo "============end==="
  22. CMD ["/usr/local/project/start_zhejiang.sh", " start " , "start"]
復制代碼


然后執行: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM