Docker學習筆記

做者:飛鴻影~php

出處:http://52fhy.cnblogs.com/css

====================================html

Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。java

官網:https://www.docker.com/
相關資料:
一、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/python

Docker與虛擬機比較

做爲一種輕量級的虛擬化方式,Docker在運行應用上跟傳統的虛擬機方式相比具備顯著優點:mysql

  • Docker容器很快,啓動和中止能夠在秒級實現,這相比傳統的虛擬機方式要快得多。
  • Docker容器對系統資源需求不多,一臺主機上能夠同時運行數千個Docker容器。
  • Docker經過相似Git的操做來方便用戶獲取、分發和更新應用鏡像,指令簡明,學習成本較低。
  • Docker經過Dockerfile配置文件來支持靈活的自動化建立和部署機制,提升工做效率。

(本段摘自《Docker技術入門與實戰》)linux

虛擬機實現了硬件上的虛擬,而Docker則實現了操做系統級別的虛擬。nginx

安裝

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

[root@bogon ~]# uname -r 3.10.0-327.22.2.el7.x86_64

Docker支持如下的CentOS版本:github

  • CentOS 7 (64-bit)
  • CentOS 6.5 (64-bit) 或更高的版本

Docker 支持如下的 Ubuntu 版本:

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

Linux安裝

curl -fsSL https://get.docker.com/ | sh
 # daocloud.io 國內鏡像 curl -sSL https://get.daocloud.io/docker | sh

該安裝包適用於 Ubuntu,Debian,Centos 等大部分主流 Linux 發行版。

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

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

是由於權限問題:

sudo groupadd docker sudo gpasswd -a ${USER} docker sudo service docker restart newgrp - docker

CentOS7支持使用yum安裝:

yum update yum install docker

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

查看版本:

docker version

顯示:

Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:23:11 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:23:11 2016
 OS/Arch:      linux/amd64

啓動docker服務:

service docker start # 或者 systemctl start docker

centos7使用systemctl 替代service 管理服務。systemctl 常見用法:

# 格式 systemctl 動做 服務名.service # 常見命令 systemctl start docker #啓動 systemctl restart docker #重啓 systemctl stop docker #中止 systemctl status docker #查看狀態 systemctl enable docker #自啓動 systemctl disable docker #禁止自啓動

.service能夠省略。
(詳見:RHEL7中systemctl的用法 http://blog.csdn.net/catoop/article/details/47318225)

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

docker search ubuntu
docker pull ubuntu
 # 查看全部可用鏡像 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服務:

service docker start
service docker stop
service docker restart

如使用service docker start其實是執行了/bin/systemctl start docker.service命令。
建議重啓使用:

systemctl daemon-reload
systemctl restart docker.service

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

docker -d [OPTIONS]

-d 之後臺方式運行容器。

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

運行相關:

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

服務器相關:

-G,--group="docker"
 -H,--host=[]
 --tls=false

RemoteAPI相關:

--api-enable-cors=false

存儲相關:

-S,--storage-driver=""
 --selinux-enabled=false
 --storage-opt=[]

網絡設置相關:

-b,--bridge="" 設置自定義網橋
 --bip=""
 --dns=[]
 --ip=0.0.0.0

啓動配置文件

Ubuntu: /etc/default/docker
CentOS: /etc/sysconfig/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

而後重啓:

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

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

[root@localhost ~]# ps -ef | grep docker
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

解決centos7和docker1.9沒有配置文件問題 - 建站 - IT精英團
http://www.itnpc.com/news/web/145083113731628.html

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鏡像中建立並運行一個新的容器:

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

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

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

查看容器:

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

示例:

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

容器操做:

docker create 容器名或者容器ID 建立容器
docker start [-i] 容器名       啓動容器
docker run 容器名或者容器ID    運行容器,至關於docker create + docker start
docker attach 容器名或者容器ID 進入容器的命令行
docker stop 容器名                             中止容器
docker rm 容器名                               刪除容器

docker top 容器名          查看WEB應用程序容器的進程
docker inspect 容器名 查看Docker的底層信息

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

守護式容器

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

什麼是守護式容器?

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

啓動守護式容器:

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

-d 讓容器在後臺運行

後臺運行任務:

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

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

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

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS               NAMES
b89b9ce64d34        ubuntu                      "/bin/sh -c 'while tr"   3 minutes ago       Up 3 minutes                            d1

[root@localhost ~]# docker logs -f b89b9ce64d34
hello world
hello world
hello world
hello world
hello world

[root@localhost ~]# docker logs -f -t --tail 2 b89b9ce64d34
2016-06-26T10:13:19.786516589Z hello world
2016-06-26T10:13:20.788871572Z hello world
2016-06-26T10:13:21.791921389Z hello world

[root@localhost ~]# docker top b89b9ce64d34
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4156                4148                0                   06:05               ?                   00:00:00            /bin/sh -c while true;do echo hello world;sleep 1;done;
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...]

中止守護式進程:

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

在容器中部署靜態網站

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

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

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

Nginx部署示例:

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

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

conf.d/localhost.conf

server {
    listen       80;
    server_name  localhost;
    
    location / {
        root   /var/www/; 
        index  index.html index.htm;
    }   
    
}

新建個目錄:

mkdir -p /var/www/ vim /var/www/index.html

內容隨便寫。

# 啓動nginx nginx

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

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

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

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

docker start web 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

下載鏡像

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

[root@bogon ~]# docker pull ubuntu:16.04
[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。

查看已下載鏡像列表

docker images [-a]

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

各個選項說明:

REPOSTITORY:表示鏡像的倉庫源
TAG:鏡像的標籤
IMAGE ID:鏡像ID
CREATED:鏡像建立時間
SIZE:鏡像大小

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

給鏡像添加標籤

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

[root@bogon ~]# docker tag daocloud.io/library/ubuntu:16.04 ubuntu:latest

刪除鏡像

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

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

導出鏡像

docker save [OPTIONS] IMAGE [IMAGE...]

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

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

導入鏡像

docker load --input ubuntu_latest.tar
# 或者 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的時候須要指明註冊服務器地址。

  • DaoCloud https://www.daocloud.io/
  • 阿里雲 https://dev.aliyun.com/search.html?spm=5176.775974865.0.0.Iot0iJ
  • 網易蜂巢 https://c.163.com/

示例:

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能夠建立多個數據卷。

docker run  -d -P --name test1 -v /data1  ubuntu
 # 掛載本地已有目錄到容器中 docker run -d -P --name test2 -v /tmp/data2:/data2 ubuntu  # 掛載本地已有目錄到容器中,指定只讀 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文件示例:

FROM daocloud.io/centos:7 # Install Nginx. # WORKDIR /etc/yum.repos.d/ RUN \ yum update -y && \ yum install -y wget && \ # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \ wget -O /etc/yum.repos.d/CentOs-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo && \ yum makecache && \ yum update -y && \ yum install -y vim && \ yum install -y nginx && \ yum install -y net-tools && \ echo "daemon off;" >> /etc/nginx/nginx.conf && \ echo "master_process off;" >> /etc/nginx/nginx.conf # Define mountable directories. VOLUME ["/usr/share/nginx", "/etc/nginx/conf.d", "/var/log/nginx"] # Define working directory. WORKDIR /etc/nginx # Define default command. CMD ["/usr/sbin/nginx"] # Expose ports. EXPOSE 80 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指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時,能夠用\來換行。
該指令有兩種格式:

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

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

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

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

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

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

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

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

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

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

FROM ubuntu CMD ["-l"] ENTRYPOINT ["/usr/bin/ls"] 

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

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

# 指定memcached的運行用戶 ENTRYPOINT ["memcached"] USER daemon # 或 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>"] 

示例:

FROM base 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 

示例:

# 在 /p1/p2 下執行 vim a.txt WORKDIR /p1 WORKDIR p2 RUN vim a.txt 

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

ONBUILD <Dockerfile關鍵字> 

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

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

ARG buildno ARG password RUN echo "Build number: $buildno" RUN script-requiring-password.sh "$password"

Docker Compose

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

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

安裝Compose

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

查看版本號:

$ docker-compose --version docker-compose 1.8.0

Compose示例

docker-compose.yml內容

web: 
  image: wordpress:latest 
  links: 
    - db:mysql 
  ports: 
    - "8002:80" 
db: 
  image: mysql 
  environment: 
    - 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: 導出端口。格式能夠是:

ports: -"3000" -"8000:8000" -"127.0.0.1:8001:8001"

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

volumes: -/var/lib/mysql - cache/:/tmp/cache -~/configs:/etc/configs/:ro

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

environment: - RACK_ENV=development - SESSION_SECRET

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

# common.yml webapp:  build:./webapp  environment:  - DEBUG=false  - SEND_EMAILS=false # development.yml web:extends:  file: common.yml  service: webapp  ports:  -"8000:8000"  links:  - db  environment:  - DEBUG=true db:  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命令是同樣的,這些命令都是單行的命令。例如:

cpu_shares:73 working_dir:/code entrypoint: /code/entrypoint.sh user: postgresql hostname: foo domainname: foo.com mem_limit:1000000000 privileged:true restart: always stdin_open:true tty:true

常見問題

安裝出錯

一、Transaction check error

Transaction check error: 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 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 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 Error Summary

運行命令:yum install libdevmapper* -y

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

 

Docker操做命令:https://www.simapple.com/docker-commandline

Dockerfile配置文件說明文檔詳解:https://www.simapple.com/docker-dockerfile

相關文章
相關標籤/搜索