Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。php
官網:https://www.docker.comhtml
相關資料:python
Docker入門教程 http://dockone.io/article/111mysql
Docker_百度百科 http://baike.baidu.com/view/11854949.htmlinux
史上最全Docker資料集粹 http://special.csdncms.csdn.net/BeDocker/nginx
Docker - 話題精華 - 知乎 http://www.zhihu.com/topic/19950993/top-answersweb
docker 簡明教程 | 簡果網 http://www.simapple.com/docker-tutorialredis
做爲一種輕量級的虛擬化方式,Docker在運行應用上跟傳統的虛擬機方式相比具備顯著優點:sql
Docker容器很快,啓動和中止能夠在秒級實現,這相比傳統的虛擬機方式要快得多。docker
Docker容器對系統資源需求不多,一臺主機上能夠同時運行數千個Docker容器。
Docker經過相似Git的操做來方便用戶獲取、分發和更新應用鏡像,指令簡明,學習成本較低。
Docker經過Dockerfile配置文件來支持靈活的自動化建立和部署機制,提升工做效率。
(本段摘自《Docker技術入門與實戰》)
虛擬機實現了硬件上的虛擬,而Docker則實現了操做系統級別的虛擬。
Docker 要求 Ubuntu 系統的內核版本高於 3.10,經過 uname -r
命令查看你當前的內核版本:
[root@bogon ~]# uname -r 3.10.0-327.22.2.el7.x86_64
Docker支持如下的CentOS版本:
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
其餘更新的版本……
curl -fsSL https://get.docker.com/ | sh # daocloud.io 國內鏡像 curl -sSL https://get.daocloud.io/docker | sh
該安裝包適用於 Ubuntu,Debian,Centos 等大部分主流 Linux 發行版。
CentOS7支持使用yum安裝:
yum update yum install docker
查看文檔:
查看版本:
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
爲了後面的須要,咱們這裏下載個ubuntu的鏡像。
須要先啓動docker服務:
service start docker # 或者 systemctl start docker
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 架構,使用client與Server通訊。
支持三種鏈接方式:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
使用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客戶端訪問當前機器的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 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
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
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 pull [OPTIONS] NAME[:TAG|@DIGEST]
選項:
--disable-content-trust=true
跳過鏡像簽名
倉庫是集中存放鏡像的地方。官方提供的公共倉庫是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裏的數據卷及數據卷容器剛好知足了這個需求。
數據卷(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
命令來指定同時刪除管聯的容器。
(未完待續)
原文發表在:Docker學習筆記 - 飛鴻影~ - 博客園
http://www.cnblogs.com/52fhy/p/5638571.html