ubuntu系統下的docker

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

相關資料:
一、Docker入門教程 http://dockone.io/article/111
二、Docker_百度百科 http://baike.baidu.com/view/11854949.htm
三、史上最全Docker資料集粹 http://special.csdncms.csdn.net/BeDocker/
四、Docker - 話題精華 - 知乎 http://www.zhihu.com/topic/19950993/top-answers
五、docker 簡明教程 | 簡果網 http://www.simapple.com/docker-tutorial
六、如何使用Dockerfile構建鏡像 http://blog.csdn.net/qinyushuang/article/details/43342553
七、Dockerfile reference - Docker https://docs.docker.com/engine/reference/builder/php

安裝

Docker 要求 Ubuntu 系統的內核版本高於 3.10 ,經過 uname -r 命令查看你當前的內核版本:css

  1.  
    [root@bogon ~]# uname -r
  2.  
    3 .10.0-327.22.2.el7.x86_64

Docker 支持如下的 Ubuntu 版本:html

  • Ubuntu Precise 12.04 (LTS)
  • Ubuntu Trusty 14.04 (LTS)
  • Ubuntu Wily 15.10
  • 其餘更新的版本……

當以普通用戶身份去使用docker images時,若是出現如下錯誤:java

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/images/json: dial unix /var/run/docker.sock: connect: permission denied

是由於權限問題:python

  1.  
    sudo groupadd docker
  2.  
    sudo gpasswd -a ${USER} docker
  3.  
    sudo service docker restart
  4.  
    newgrp - docker

查看文檔:
https://docs.docker.com/engine/installation/linux/centos/
http://docs.daocloud.io/faq/install-docker-daocloudmysql

查看版本:linux

docker version

啓動docker服務:nginx

  1.  service docker start
  2. 或者systemctl start docker

爲了後面的須要,這裏下載個ubuntu的鏡像:git

  1.  docker search ubuntu# 查看全部可用鏡像
  2.  docker pull ubuntu
  3.  docker images -a

這就下載了最新的ubuntu系統鏡像到本地,接下來咱們能夠從該鏡像建立多個容器。具體命令含義下面會有說明。

Docker裏比較重要的概念有註冊服務器、倉庫、鏡像、容器。

倉庫: 註冊服務器是存放倉庫的地方,其上每每存放着多個倉庫。每一個倉庫集中存放某一類鏡像,每每包括多個鏡像文件,經過不一樣的標籤(tag)來進行區分。例如存放Ubuntu操做系統鏡像的倉庫,稱爲Ubuntu倉庫,其中可能包括14.0四、12.04等不一樣版本的鏡像。

鏡像: Docker鏡像(Image)相似於虛擬機鏡像,能夠將它理解爲一個面向Docker引擎的只讀模板,包含了文件系統。例如:一個鏡像能夠只包含一個完整的Ubuntu操做系統環境,能夠把它稱爲一個Ubuntu鏡像。

容器: 容器是從鏡像建立的應用運行實例,能夠將其啓動、開始、中止、刪除,而這些容器都是相互隔離、互不可見的。能夠從一個鏡像建立無數個容器。平時咱們主要操做的就是容器。咱們也能夠把容器打包成鏡像以方便再次使用。鏡像自身是隻讀的。容器從鏡像啓動的時候,Docker會在鏡像的最上層建立一個可寫層,鏡像自己將保持不變。

客戶端和守護進程

這部分將介紹docker的結構以及docker服務的管理。

Docker 的 C/S 模式

docker是C/S架構,使用client與Server通訊。

支持三種鏈接方式:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd

Docker 守護進程的配置和操做

使用ps -ef | grep docker查看docker進程。

管理docker服務:

  1.  
    service docker start
  2.  
    service docker stop
  3.  
    service docker restart

docker守護進程的配置和操做模式:

#-d 之後臺方式運行容器。docker -d [OPTIONS] 

下面是容器建立時的一些配置,按需添加。初學者能夠簡單看看,之後須要再來查找。

運行相關:

  1.  
    -D, --debug= false
  2.  
    -e,-- exec-driver="native"
  3.  
    -p,--pidfile= "/var/run/docker.pid"

服務器相關:

  1.  
    -G,-- group="docker"
  2.  
    -H,--host=[]
  3.  
    --tls= false

RemoteAPI相關:

--api-enable-cors=false

存儲相關:

  1.  
    -S, --storage-driver=""
  2.  
    --selinux-enabled=false
  3.  
    --storage-opt=[]

網絡設置相關:

  1.  
    -b, --bridge="" 設置自定義網橋
  2.  
    --bip=""
  3.  
    --dns=[]
  4.  
    --ip=0.0.0.0

啓動配置文件

Ubuntu: /etc/default/docker
若是沒有配置文件,能夠直接編輯:

vim  /lib/systemd/system/docker.service

裏面的ExecStart就是啓動配置,默認是:

ExecStart=/usr/bin/docker -H fd://

咱們能夠加幾個配置:

ExecStart=/usr/bin/docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

而後重啓:

  1.  
    systemctl daemon-reload
  2.  
    systemctl restart docker.service
  3.  
     
  4.  
    # 若是出問題了,可使用下面命令查看:
  5.  
    systemctl status docker.service

經過ps -ef | grep docker能夠查看剛纔添加的信息:

  1.  
    [root@localhost ~] # ps -ef | grep docker
  2.  
    root 8262 1 0 23:50 ? 00:00:00 /usr/bin/docker daemon -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

 

Docker 的遠程訪問

咱們能夠從一臺安裝了docker的機器訪問另外一臺安裝了docker的機器。通常狀況下咱們使用當前機器的docker客戶端訪問當前機器的Server端。下面演示如何訪問其餘docker服務端。

第一臺IP:192.168.12.3
第二臺IP:192.168.12.4

使用第二臺安裝有docker的服務器作演示。爲區分,設置label不一樣。

修改守護進程(Server)默認的啓動配置:
默認是:-H fd://
可修改成:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

可設置多個鏈接方式。

第一臺訪問第二臺機器的docker服務:

  • 經過http鏈接Server:

    curl http://192.168.12.4:2375/info

訪問的是服務器192.168.12.4:2375的info接口,返回服務器相關信息。

  • 經過docker客戶端訪問Server:

    docker -H tcp://192.168.12.4:2375 info

若是是是第一臺機器訪問第一臺機器Docker的服務端,則使用127.0.0.1:2375就好了。

和服務器端同樣,客戶端也支持三種鏈接方式,默認是 -H unix:///var/run/docker.sock:
-H unix:///path/to/sock
tcp://host:port
fd://socketfd

docker客戶端使用docker info默認訪問的是本地Server。能夠修改環境變量DOCKER_HOST改變默認鏈接。命令行直接輸入:

export DOCKER_HOST="tcp://127.0.0.1:2375"

127.0.0.1:237能夠替換爲實際的Server地址。

若是想恢復本地鏈接,將DOCKER_HOST置空便可:

export DOCKER_HOST=""

Docker容器

容器的基本操做

咱們能夠從鏡像中建立容器。

Docker run IMAGE [COMMOND] [ARG...] 在新的容器中執行命令

該命令每運行一次,就建立了一個新的容器。下面演示從下載好的ubuntu鏡像中建立並運行一個新的容器:

  1.   # 只運行一次命令
  2.  docker run ubuntu echo 'hello world' 運行一個新的容器,並執行命令echo 
  3.   # 建立並運行容器,而後進入容器 
  4. docker run -i -t --name test ubuntu /bin/bash 以交互式終端運行一個新的容器,鏡像是ubuntu,使用bash,容器別名test

-i 交互式界面,默認是false
-t 僞終端,默認false
--name 容器別名,默認隨機命名

exit 退出交互式界面,容器中止運行
Crtl+P 或者Crtl+Q 退出交互式界面,容器在後臺運行。(注意是大寫P和Q)

查看容器:

  1.  docker ps 查看正在運行的容器
  2.  docker ps -a 查看全部容器
  3.  docker ps -l 查看最近一次運行的容器

示例:

  1.  
    [root@localhost ~] # docker ps -a
  2.  
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3.  
    8c52c83c1903 redis "docker-entrypoint.sh" 2 hours ago Exited (0) 2 hours ago myredis

容器操做:

  1.  docker create 容器名或者容器ID 建立容器
  2.  docker start [-i] 容器名 啓動容器
  3.  docker run 容器名或者容器 ID 運行容器,至關於docker create + docker start
  4.  docker attach 容器名或者容器 ID 進入容器的命令行
  5.  docker stop 容器名 中止容器
  6.  docker rm 容器名 刪除容器
  7.  docker top 容器名 查看WEB應用程序容器的進程
  8.  docker inspect 容器名 查看Docker的底層信息

刪除容器時,容器必須是中止狀態,不然會報錯誤。

守護式容器

咱們可使用守護式容器運行一個或者多個服務,例如運行lamp服務、redis服務、mysql服務等。

什麼是守護式容器?

  • 可以長期運行
  • 沒有交互式會話
  • 適合運行應用程序和服務

啓動守護式容器:

docker run -d IMAGE [COMMOND] [ARG...]

-d 讓容器在後臺運行

後臺運行任務:

  1.  docker run -d --name d1 ubuntu /bin/sh - c "while true;do echo hello world;sleep 1;done;"
  2.  輸出:b89b9ce64d34bd202a642c8190428f4776f15e882f138949259722f22120201a

返回了一個守護進程的惟一ID。

查看守護進程的運行狀況:

  1.  [root@localhost ~] # docker ps
  2.  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3.  b89b9ce64d34 ubuntu "/bin/sh -c 'while tr" 3 minutes ago Up 3 minutes d1
  4.  [root@localhost ~] # docker logs -f b89b9ce64d34
  5.  hello world
  6.  hello world
  7.  hello world
  8.  hello world
  9.  hello world
  10.  [root@localhost ~] # docker logs -f -t --tail 2 b89b9ce64d34
  11.   2016-06-26T10:13:19.786516589Z hello world
  12.   2016-06-26T10:13:20.788871572Z hello world
  13.   2016-06-26T10:13:21.791921389Z hello world
  14.  [root@localhost ~] # docker top b89b9ce64d34
  15.  UID PID PPID C STIME TTY TIME CMD
  16.  root 4156 4148 0 06:05 ? 00:00:00 /bin/sh -c while true;do echo hello world;sleep 1;done;
  17.  root 4850 4156 0 06:16 ? 00:00:00 sleep 1
docker logs [-f] [-t] [--tail] 容器名或id 查看容器內WEB應用程序日誌

-f --follow=true|false,默認false,一直跟隨log變化
-t --timestamps=true|false,默認false,加上時間戳
--tail="all",返回最新多少條日誌

在運行的容器中啓動新的進程:

docker exec [-d] [-i] [-t] 容器名 [COMMOND] [ARG...]

中止守護式進程:

  1.  
    docker stop 容器名 發送中止信號,等待關閉
  2.  
    docker kill 容器名 直接關閉容器

在容器中部署靜態網站

  1.  docker run -d -p 80 -i -t ubuntu /bin/bash 主機端口隨機
  2.  docker run -d -p 8080:80 -i -t ubuntu /bin/bash 主機端口自定義
  3.  docker run -d -p 0.0.0.0:80 -i -t ubuntu /bin/bash
  4.  docker run -d -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

-P --publish-all=true|false,默認false
-p --publish=[],自定義端口,將容器內部使用的網絡端口映射到咱們使用的主機上。

  1.  docker run -d -P training/webapp python app.py 後臺運行一個容器應用
  2.  docker run -d -p 5000:5000 training/webapp python app.py 容器內部的 5000 端口映射到咱們本地主機的 5000 端口上
docker port 容器id 查看到容器的端口映射

Nginx部署示例:

  1.   # 建立映射端口爲80的交互式界面:
  2.  docker run -p 80 --name web -i -t ubuntu /bin/bash
  3.   # 第一次使用更新源
  4.  apt- get update
  5. # 安裝nginx
  6.  apt- get install nginx
  7.   # 安裝vim
  8. apt- get install vim 
  9. whereis nginx
  10.  nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx
  11.  vim /etc/nginx/conf.d/localhost.conf

發現配置文件在/etc/nginx/conf.d下面:

conf.d/localhost.conf

  1.  server {
  2.   listen 80;
  3.  server_name localhost;
  4.  location / {root /var/www/; index index.html index.htm;}
  5.   }

新建個目錄:

  1.  
    mkdir -p / var/www/
  2.  
     
  3.  
    vim / var/www/index.html

內容隨便寫。

  1.  
    # 啓動nginx
  2.  
    nginx

使用Crtl+P(即Crtl+shift+p)退出容器,並後臺運行。
查看:

  1.  
    [root@localhost ~] # docker port web
  2.  
    80/tcp -> 0.0.0.0:32769
  3.  
     
  4.  
    [root@localhost ~] # docker top web
  5.  
    UID PID PPID C STIME TTY TIME CMD
  6.  
    root 12123 12113 0 07:14 pts/2 00:00:00 /bin/bash
  7.  
    root 12159 12123 0 07:14 ? 00:00:00 nginx: master process nginx
  8.  
    33 12160 12159 0 07:14 ? 00:00:00 nginx: worker process
  9.  
     
  10.  
    [root@localhost ~] # curl http://127.0.0.1:32769

正常的話會顯示網頁內容。

若是exit退出了容器,想開啓nginx服務,還能夠:

  1.  
    docker start web
  2.  
    docker exec web nginx

連接另外一個容器

咱們可使用--link使用另外一個容器的服務。
建立mysql_db 容器:

docker run --name mysql_db -e MYSQL_ROOT_PASSWORD=123456 -d mysql

建立一個應用,並使用剛纔建立的mysql_db容器服務:

docker run --name some-wordpress --link mysql_db:mysql -p 8001:80 -d wordpress

Docker鏡像

搜索鏡像

docker search [-s] IMAGE

下載鏡像

  1.  
    docker pull [OPTIONS] NAME[ :TAG|@DIGEST]
  2.  
     
  3.  
    [root@bogon ~] # docker pull ubuntu:16.04
  4.  
    [root@bogon ~] # docker pull daocloud.io/library/ubuntu:16.04

下載鏡像名稱其實由三部分組成:daocloud.io/library/ubuntu:16.04
其中其中daocloud.io是註冊服務器地址,默認是registry.hub.docker.com;ubuntu是倉庫名,16.04是標籤名,默認是latest。

查看已下載鏡像列表

  1.  
    docker images [-a]
  2.  
     
  3.  
    [root@bogon ~]# docker images
  4.  
    REPOSITORY TAG IMAGE ID CREATED SIZE
  5.  
    daocloud.io/ library/ubuntu 16.04 12543ced0f6f 2 weeks ago 122.4 MB
  6.  
    ubutun latest 12543ced0f6f 2 weeks ago 122.4 MB
  7.  
    daocloud.io/daocloud/dao- 2048 latest 6c1ff658e77e 3 months ago 7.598 MB
  8.  
    daocloud.io/daocloud/alpine latest e9f3e32a4303 3 months ago 11.52 MB
  9.  
    daocloud.io/ library/centos 7.1.1503 fac97c5c4748 8 months ago 212.1 MB
  10.  
    daocloud.io/daocloud/dao-redis master-init 173a30377d85 13 months ago 190.4 MB

各個選項說明:

  1.  
    REPOSTITORY:表示鏡像的倉庫源
  2.  
    TAG:鏡像的標籤
  3.  
    IMAGE ID:鏡像ID
  4.  
    CREATED:鏡像建立時間
  5.  
    SIZE:鏡像大小

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

給鏡像添加標籤

  1.  
    docker tag [OPTIONS] IMAGE[ :TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
  2.  
     
  3.  
    [root@bogon ~] # docker tag daocloud.io/library/ubuntu:16.04 ubuntu:latest

刪除鏡像

  1.  
    docker rmi [OPTIONS] IMAGE [IMAGE...]
  2.  
     
  3.  
    # 按標籤刪除:多個標籤,僅會刪除當前標籤,不會刪除鏡像
  4.  
    [root@bogon ~] # docker rmi ubuntu:latest
  5.  
    # 按ID刪除:直接刪除鏡像
  6.  
    [root@bogon ~] # docker rmi 12543ced0f6f

選項:
-f, --force 強制刪除鏡像
--no-prune 不刪除untagged parents

導出鏡像

  1.  
    docker save [OPTIONS] IMAGE [IMAGE...]
  2.  
     
  3.  
    [root@bogon ~]# docker save -o ubuntu_latest.tar ubuntu:latest
  4.  
    [root@bogon ~]# ls -l
  5.  
    -rw-r--r--. 1 root root 128086528 Jun 28 12:39 ubuntu_latest.tar

選項:
-o, --output 寫入到文件

導入鏡像

  1.  
    docker load --input ubuntu_latest.tar
  2.  
    # 或者
  3.  
    docker load < ubuntu_latest.tar

選項:
-i, --input 從壓縮包載入鏡像

建立鏡像

當咱們從docker鏡像倉庫中下載的鏡像不能知足咱們的需求時,咱們能夠經過如下兩種方式對鏡像進行更改。
1.從已經建立的容器中更新鏡像,而且提交這個鏡像
2.使用 Dockerfile 指令來建立一個新的鏡像

從容器生成鏡像

假設有一容器2c74d574293f,可使用commit命令生成鏡像:

docker commit -m "create images" -a "52fhy" 2c74d574293f 52fhy/test:v1

-m 加一些改動信息,-a 指定做者相關信息,2c74d這一串爲舊容器id,再後面爲新鏡像的名字。

上傳鏡像

docker push [OPTIONS] NAME[:TAG|@DIGEST]

選項:
--disable-content-trust=true 跳過鏡像簽名

Docker倉庫

倉庫是集中存放鏡像的地方。官方提供的公共倉庫是https://hub.docker.com。不用註冊便可使用裏面的衆多倉庫資源,包含了經常使用的ubuntu、centos、php、nginx、mysql等倉庫。

因爲國外倉庫訪問比較慢,可使用國內的倉庫,通常須要註冊,使用docker pull的時候須要指明註冊服務器地址。

示例:

docker pull registry.aliyuncs.com/acs-sample/mysql

其中registry.aliyuncs.com是註冊服務器地址,acs-sample/mysql是倉庫名,全部者是acs-sample,沒有指定鏡像標籤,則默認是latest

根據所存儲的鏡像公開分享與否,Docker倉庫能夠分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。

搭建私有倉庫

詳見:Docker私有倉庫搭建

Docker數據卷及數據卷容器

在使用容器的過程當中,咱們可能須要共享數據:
一、共享本地主機數據到容器;
二、共享容器數據到另外一個容器。

Docker裏的數據卷及數據卷容器剛好知足了這個需求。

數據卷

數據卷(Data Volumes)是一個可供容器使用的特殊目錄,它提供了不少有用的特性:

  • 對數據卷的修改會立馬生效
  • 數據卷會一直存在,直到沒有容器使用
  • 數據卷能夠被多個容器使用

數據卷相似於Linux的mount。實質是在當前機器映射了一個目錄到容器內部。

建立或運行容器的時候,使用-v建立一個數據卷,屢次使用-v能夠建立多個數據卷。

  1.  
    docker run -d -P -- name test1 -v /data1 ubuntu
  2.  
     
  3.  
    # 掛載本地已有目錄到容器中
  4.  
    docker run -d -P -- name test2 -v /tmp/data2:/data2 ubuntu
  5.  
     
  6.  
    # 掛載本地已有目錄到容器中,指定只讀
  7.  
    docker run -d -P -- name test3 -v /tmp/data3:/data3:ro ubuntu

掛載的數據卷默認權限是讀寫rw

數據卷容器

數據卷容器(Data Volume Dontainers)其實就是一個普通的容器,只是咱們專門用它提供數據卷供其它容器掛載使用。

建立數據庫容器很簡單,建立一個普通容器就好了:

docker run --name db1 -v /data ubuntu

其餘容器使用該數據卷容器:

docker run  -it --name test4  --volumes-from db1 ubuntu

使用--volumes-from指定數據卷容器。多個--volumes-from將掛載多個數據卷容器。

注意:使用--volumes-from參數所掛載的數據卷容器自己並不須要保持運行狀態。若是刪除了掛載的容器,數據卷並不會被自動刪除,若是要刪除一個數據卷,必需使用docker rm -v命令來指定同時刪除管聯的容器。

使用Dockerfile建立鏡像

Dockerfile用來建立一個自定義的image,包含了用戶指定的軟件依賴等。Dockerfile文件能夠用docker build命令生成一個新的鏡像。

Dockerfile文件示例:

  1.  
    FROM daocloud.io/ centos:7
  2.  
     
  3.  
    # Install Nginx.
  4.  
    # WORKDIR /etc/yum.repos.d/
  5.  
    RUN \
  6.  
    yum update -y && \
  7.  
    yum install -y wget && \
  8.  
    # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
  9.  
    wget -O /etc/yum.repos.d/CentOs-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo && \
  10.  
    yum makecache && \
  11.  
    yum update -y && \
  12.  
    yum install -y vim && \
  13.  
    yum install -y nginx && \
  14.  
    yum install -y net-tools && \
  15.  
    echo "daemon off;" >> /etc/nginx/nginx.conf && \
  16.  
    echo "master_process off;" >> /etc/nginx/nginx.conf
  17.  
    # Define mountable directories.
  18.  
    VOLUME [ "/usr/share/nginx", "/etc/nginx/conf.d", "/var/log/nginx"]
  19.  
    # Define working directory.
  20.  
    WORKDIR /etc/nginx
  21.  
    # Define default command.
  22.  
    CMD [ "/usr/sbin/nginx"]
  23.  
    # Expose ports.
  24.  
    EXPOSE 80
  25.  
    EXPOSE 443

運行以下命令:

docker build -t nginx:v1 .

進行鏡像構建。成功後,從生成的鏡像運行容器:

docker run -d -p 8090:80 nginx:v1

Dockerfile文件語法

(1)FROM(指定基礎image)
構建指令,必須指定且須要在Dockerfile其餘指令的前面。後續的指令都依賴於該指令指定的image。FROM指令指定的基礎image能夠是官方遠程倉庫中的,也能夠位於本地倉庫。鏡像能夠指定標籤。格式:

FROM <image>:<tag> 

(2)MAINTAINER(用來指定鏡像建立者信息)
構建指令,用於將image的製做者相關的信息寫入到image中。當咱們對該image執行docker inspect命令時,輸出中有相應的字段記錄該信息。
格式:

MAINTAINER <name> 

(3)RUN
構建指令,RUN能夠運行任何被基礎image支持的命令。如基礎image選擇了ubuntu,那麼軟件管理部分只能使用ubuntu的命令。RUN指令能夠有多條,每條RUN指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時,能夠用\來換行。
該指令有兩種格式:

  1.  
    # 在shell終端中運行 - `/bin/sh -c`
  2.  
    RUN < command>
  3.  
     
  4.  
    # 使用exec執行
  5.  
    RUN [ "executable", "param1", "param2" ... ]

(4)CMD(設置容器啓動時執行的操做)
設置指令,用於容器啓動時指定的操做。該操做能夠是執行自定義腳本,也能夠是執行系統命令。該指令只能在文件中存在一次,若是有多個,則只執行最後一條。
該指令有三種格式:

  1.  
    # 格式一:like an exec, this is the preferred form
  2.  
    CMD [ "executable","param1","param2"]
  3.  
     
  4.  
    # 格式二:as a shell
  5.  
    CMD command param1 param2
  6.  
     
  7.  
    # 當Dockerfile指定了ENTRYPOINT,那麼使用下面的格式:做爲ENTRYPOINT的缺省參數
  8.  
    CMD [ "param1","param2"]

注意:
1) CMD運行在鏡像構建以後,容器啓動的時候;
2) CMD只執行最後一條
3) CMD能夠被用戶指定的命令覆蓋

(5)ENTRYPOINT(設置容器啓動時執行的操做)
設置指令,指定容器啓動時執行的命令,能夠屢次設置,可是隻有最後一個有效。
兩種格式:

  1.  
    # 格式一:like an exec, this is the preferred form
  2.  
    ENTRYPOINT [ "executable", "param1", "param2"]
  3.  
     
  4.  
    # 格式二:as a shell
  5.  
    ENTRYPOINT command param1 param2

該指令的使用分爲兩種狀況,一種是獨自使用,另外一種和CMD指令配合使用。

當獨自使用時,若是你還使用了CMD命令且CMD是一個完整的可執行的命令,那麼CMD指令和ENTRYPOINT會互相覆蓋只有最後一個CMD或者ENTRYPOINT有效:

  1.  
    # CMD指令將不會被執行,只有ENTRYPOINT指令被執行
  2.  
    CMD echo 「Hello, World!」
  3.  
    ENTRYPOINT ls -l

另外一種用法和CMD指令配合使用來指定ENTRYPOINT的默認參數,這時CMD指令不是一個完整的可執行命令,僅僅是參數部分;ENTRYPOINT指令只能使用JSON方式指定執行命令,而不能指定參數:

  1.  
    FROM ubuntu
  2.  
    CMD ["-l"]
  3.  
    ENTRYPOINT [ "/usr/bin/ls"]

注意:
1) 和CMD指令基本同樣,可是不能被用戶指定的命令所覆蓋;
2) 能夠和CMD組合使用,ENTRYPOINT提供不可變得命令,CMD提供缺省參數。

(6)USER(設置容器的用戶)
設置指令,設置啓動容器的用戶,默認是root用戶。

  1.  
    # 指定memcached的運行用戶
  2.  
    ENTRYPOINT [ "memcached"]
  3.  
    USER daemon
  4.  
     
  5.  
    # 或
  6.  
    ENTRYPOINT [ "memcached", "-u", "daemon"]

(7)EXPOSE(指定容器須要映射到宿主機器的端口)
設置指令,該指令會將容器中的端口映射成宿主機器中的某個端口。格式爲:

EXPOSE <port> [<port> ...]

例如:

EXPOSE 80 443 11211

告訴Docker服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時須要經過-P,Docker主機會自動分配一個端口轉發到指定的端口;使用-p,則能夠具體指定哪一個本地端口映射過來。

(8)ENV(用於設置環境變量)
構建指令,在image中設置一個環境變量。格式:

ENV <key> <value>

設置了後,後續的RUN命令均可以使用,容器啓動後,能夠經過docker inspect查看這個環境變量,也能夠經過在docker run --env key=value時設置或修改環境變量。

假如你安裝了JAVA程序,須要設置JAVA_HOME,那麼能夠在Dockerfile中這樣寫:

ENV JAVA_HOME /path/to/java/dirent

(9)ADD(從src複製文件到容器的dest路徑)
構建指令,全部拷貝到容器中的文件和文件夾權限爲0755,uid和gid爲0。格式爲:

ADD <src> <dest> 

<src> 是相對被構建的源目錄的相對路徑,能夠是文件或目錄的路徑,也能夠是一個遠程的文件url;<dest>是容器中的絕對路徑。

該命令將複製指定的<src>到容器中的<dest>。其中<src>能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄);也能夠是一個URL;還能夠是一個tar文件(自動解壓爲目錄)。

若是是一個目錄,那麼會將該目錄下的全部文件添加到容器中,不包括目錄;若是文件是可識別的壓縮格式,則docker會幫忙解壓縮(注意壓縮格式);若是<src>是文件且<dest>中不使用斜槓結束,則會將<dest>視爲文件,<src>的內容會寫入<dest>;若是<src>是文件且<dest>中使用斜槓結束,則會<src>文件拷貝到<dest>目錄下。

(10)COPY
格式爲

COPY <src> <dest>

複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑,文件或目錄)爲容器中的<dest>。目標路徑不存在時,會自動建立。
當使用本地目錄爲源目錄時,推薦使用COPY。

(11)VOLUME(指定掛載點))
設置指令,使容器中的一個目錄具備持久化存儲數據的功能,該目錄能夠被容器自己使用,也能夠共享給其餘容器使用。咱們知道容器使用的是AUFS,這種文件系統不能持久化數據,當容器關閉後,全部的更改都會丟失。當容器中的應用有持久化數據的需求時能夠在Dockerfile中使用該指令。格式:

VOLUME ["<mountpoint>"] 

示例:

  1.  
    FROM base
  2.  
    VOLUME [ "/tmp/data"]

運行經過該Dockerfile生成image的容器,/tmp/data目錄中的數據在容器關閉後,裏面的數據還存在。例如另外一個容器也有持久化數據的需求,且想使用上面容器共享的/tmp/data目錄,那麼能夠運行下面的命令啓動一個容器:

docker run -t -i -rm -volumes-from container1 image2 bash 

container1爲第一個容器的ID,image2爲第二個容器運行image的名字。

(12)WORKDIR(切換目錄)
設置指令,能夠屢次切換(至關於cd命令),對RUN,CMD,ENTRYPOINT生效。格式:

WORKDIR /path/to/workdir 

示例:

  1.  
    # 在 /p1/p2 下執行 vim a.txt
  2.  
    WORKDIR /p1
  3.  
    WORKDIR p2
  4.  
    RUN vim a.txt

(13)ONBUILD(在子鏡像中執行)

ONBUILD <Dockerfile關鍵字> 

ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行。

(14)ARG(指定構建過程當中使用的環境變量)

  1.  
    ARG buildno
  2.  
    ARG password
  3.  
     
  4.  
    RUN echo "Build number: $buildno"
  5.  
    RUN script-requiring-password.sh "$password"

Docker Compose

Compose是用於定義和運行復雜Docker應用的編排工具(舊版本叫Fig)。你能夠在一個文件中定義一個多容器的應用,而後使用一條命令來啓動你的應用,而後全部相關的操做都會被自動完成。

資料:
https://docs.docker.com/compose
https://github.com/docker/compose

安裝Compose

  1.  
    # 方法一:
  2.  
    curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  3.  
    chmod +x /usr/local/bin/docker-compose
  4.  
     
  5.  
    # 方法二:
  6.  
    yum install python-pip python-dev
  7.  
    pip install docker-compose

查看版本號:

  1.  
    $ docker-compose --version
  2.  
    docker-compose 1.8.0

Compose示例

docker-compose.yml內容

  1.  
    web:
  2.  
    image: wordpress:latest
  3.  
    links:
  4.  
    - db:mysql
  5.  
    ports:
  6.  
    - "8002:80"
  7.  
    db:
  8.  
    image: mysql
  9.  
    environment:
  10.  
    - MYSQL_ROOT_PASSWORD= 123456

啓動應用:

docker-compose up

docker-compose.yml經常使用指令

image:鏡像的ID
build:直接從pwd的Dockerfile來build,而非經過image選項來pull
links:鏈接到那些容器。每一個佔一行,格式爲SERVICE[:ALIAS],例如 – db[:database]
external_links:鏈接到該compose.yaml文件以外的容器中,好比是提供共享或者通用服務的容器服務。格式同links
command:替換默認的command命令
ports: 導出端口。格式能夠是:

  1.  
    ports:
  2.  
    -"3000"
  3.  
    -"8000:8000"
  4.  
    -"127.0.0.1:8001:8001"

expose:導出端口,但不映射到宿主機的端口上。它僅對links的容器開放。格式直接指定端口號便可。
volumes:加載路徑做爲卷,能夠指定只讀模式:

  1.  
    volumes:
  2.  
    - /var/lib/mysql
  3.  
    - cache/: /tmp/cache
  4.  
    -~ /configs:/etc/configs/:ro

volumes_from:加載其餘容器或者服務的全部卷

  1.  
    environment:
  2.  
    - RACK_ENV=development
  3.  
    - SESSION_SECRET

env_file:從一個文件中導入環境變量,文件的格式爲RACK_ENV=development
extends:擴展另外一個服務,能夠覆蓋其中的一些選項。一個sample以下:

  1.  
    # common.yml
  2.  
    webapp:
  3.  
    build:./webapp
  4.  
    environment:
  5.  
    - DEBUG= false
  6.  
    - SEND_EMAILS= false
  7.  
     
  8.  
    # development.yml
  9.  
    web:extends:
  10.  
    file: common.yml
  11.  
    service: webapp
  12.  
    ports:
  13.  
    - "8000:8000"
  14.  
    links:
  15.  
    - db
  16.  
    environment:
  17.  
    - DEBUG= true
  18.  
    db:
  19.  
    image: postgres

net:容器的網絡模式,能夠爲"bridge", "none", "container:[name or id]", "host"中的一個。
dns:能夠設置一個或多個自定義的DNS地址。
dns_search:能夠設置一個或多個DNS的掃描域。
其餘的working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares,和docker run命令是同樣的,這些命令都是單行的命令。例如:

  1.  
    cpu_shares: 73
  2.  
    working_dir:/code
  3.  
    entrypoint: /code/entrypoint.sh
  4.  
    user: postgresql
  5.  
    hostname: foo
  6.  
    domainname: foo.com
  7.  
    mem_limit: 1000000000
  8.  
    privileged: true
  9.  
    restart: always
  10.  
    stdin_open: true
  11.  
    tty: true

常見問題

安裝出錯

一、Transaction check error

  1.  
    Transaction check error:
  2.  
    file /usr/lib/systemd/system/blk-availability.service from install of device-mapper-7:1.02.107-5.el7_2.1.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64
  3.  
    file /usr/sbin/blkdeactivate from install of device-mapper-7:1.02.107-5.el7_2.1.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64
  4.  
    file /usr/share/man/man8/blkdeactivate.8.gz from install of device-mapper-7:1.02.107-5.el7_2.1.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64
  5.  
     
  6.  
    Error Summary

運行命令:yum install libdevmapper* -y

二、http://blog.csdn.net/baidu_36342103/article/details/69357438

相關文章
相關標籤/搜索