一.docker簡介:php
docker是容器技術的一個表明,而容器技術是將程序打包和隔離的一種技術,其實它並非一個新技術,以前在linux內核中早已存在,真正被大衆所用所瞭解是由於docker的出現。docker之因此流行起來,是由於解決了一些計算機領域的痛點,它解決了軟件包裝的問題,保證開發與運維及測試環境的一致。docker能夠將任何應用以輕量級容器的形式來打包,遷移發佈和運行。能夠簡單的認爲是一個輕量級的虛擬機,可是也不算是虛擬機。html
2013年docker開源,它跨平臺,支持windows,Mac,Linux系統。Docker 是 PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎.java
docker官網:https://www.docker.com/linux
docker的github託管地址:https://github.com/dockernginx
docker官方文檔:https://docs.docker.com/get-started/git
二. Docker思想:github
1.集裝箱web
docker的logo是一個鯨魚上面裝着不少集裝箱,想象下在沒有集裝箱以前,運輸貨物很是零散,沒有規矩,運輸過程當中說不定有些東西會掉了,優良集裝箱,全部貨物就被密封在集裝箱中,集裝箱很大也不容易丟失,這樣就保證了咱們貨物的安全原樣的送到目的地。那麼咱們能夠把貨物想象成咱們的程序,假如能把一臺機器上的程序部署到新的一臺機器上,那麼會拷貝過去,可是這過程當中有可能會由於人爲的疏忽少拷貝了一些配置文件或者相關文件,致使在另外一臺機器上程序啓動不起來。有了docker的集裝箱就是幫咱們解決這樣的問題,它會保證咱們的程序無論在哪運行不會缺乏應有的東西。docker
2.標準化編程
能夠從三個方面解釋標準化,1.運輸方式的標準化。2.存儲方式標準化。3.Api接口標準化。
3.隔離
docker是一種輕量級容器,它有本身的一套內部環境,好比cpu,內存,磁盤等,能夠隔離外面主機。docker使用了LXC技術來實現這種獨立的環境,LXC又名Linux container,是一種虛擬化的解決方案,這種是內核級的虛擬化,這是一種輕量級的容器虛擬化,能夠實現docker環境的快速創建,銷燬。
三.docker能解決哪些問題
1.解決環境不一致:
常常遇到開發在本地運行沒錯,測試那邊運行同一個程序出現問題。出現這種問題通常都是運行環境不一致致使的。一個應用程序運行須要一系列的依賴,如操做系統,web服務器,相關的配置文件,對應的編程語言的代碼及相應程序解釋器等等,若是其中一個變了程序就有可能失敗,好比程序調用了一些系統命令,可是換個環境沒有這些命令,那麼就會致使程序啓動失敗,程序的版本也會致使程序的錯誤,如php7和php5.3語法就有些不同。
而docker就會把全部所須要的配置文件,程序代碼等所須要的一切環境打包到一個集裝箱中,至關於把開發環境打了一個包,這個包環境和開發的本地的環境一摸同樣,這樣就保證了運行環境的一致性,這個包就能夠被測試引用到他本地運行,因此docker就是解決環境不一致的問題。
2.程序隔離
Linux是多用戶系統,上面能夠運行多種程序和服務,當其中一個程序或服務運行出現故障時候,消耗不少cpu,或者大量IO操做,佔用大量內存,會牽連服務器上的其餘運行中的軟件,而docker能夠避免這種狀況出現。由於docker自己就是一個個獨立隔離的環境,在docker啓動的時候就會被限定使用多大的內存及其餘資源使用限度,因此docker環境裏的程序出現問題也會只是影響這個docker裏的程序,不會影響其餘服務和程序。
3.資源快速擴張和彈性伸縮
如今電商系統常常會有秒殺活動,還有雙十一,618這樣特別的促銷活動。每當這樣的節日來臨時候,電商系統都會面臨大量的訪問,因此須要更多的軟硬件資源去應對這樣大量的訪問量,而平時卻不須要這麼多的服務器,不如也會形成極大的浪費,因此在節假日來臨前擴充能夠應對節日所須要的服務器數量,節日以後在將這些多餘的服務器下線,可是這會給運維帶來很是大的工做量,由於運維須要分別給每臺機器搭建環境配置所須要點一切軟件,而且還得調試,這是一個很是繁瑣的過程。可是docker讓這些事變得簡單,只須要經過docker管理軟件點擊鼠標配置下,就會立馬從10臺服務器變成100臺或者更多。
四.docker核心技術
docker裏面有三個核心的詞彙鏡像,倉庫,容器,鏡像是上面例子中的集裝箱,倉庫是存放鏡像的地方,容器是運行程序的地方。docker運行一個程序的過程就是去倉庫把鏡像拉到本地,而後用docker命令在本地把docker運行起來。
1.鏡像(image):從本質上來講鏡像就是一系列的文件,能夠包括應用程序的文件,也能夠包括運行環境的文件,這些鏡像文件用一種特殊的文件格式來保存。linux有種存儲技術叫作聯合文件系統(Union File System),這是一種分層的文件系統,能夠將不一樣的文件目錄掛載在同一個虛擬文件系統下。怎麼理解呢,下面有個例子。
songguojundeMBP:~ songguojun$ ls dir1 //在dir1目錄下看到下面三個目錄 Desktop Downloads Movies songguojundeMBP:~ songguojun$ ls dir2 //在dir2目錄下看到下面另外三個目錄
code Documents Library songguojundeMBP:~ songguojun$ ls dir //聯合文件系統中,在dir目錄下看到下面六個目錄,也就是上面兩個目錄共同的目錄文件集合 Desktop Downloads Movies code Documents Library
其實就是聯合在不一樣磁盤上的不一樣的文件系統到一個公共目錄下。經過聯合文件系統能夠實現文件的分層,docker鏡像就是利用這種分層的概念來實現鏡像存儲。下面這張圖就是鏡像存儲格式。
在Docker鏡像分爲基礎鏡像和父鏡像,沒有父鏡像的鏡像被稱爲基礎鏡像。用戶是基於基礎鏡像來製做各類不一樣的應用鏡像。這些應用鏡像共享同一個基礎鏡像層,提升了存儲效率。
2.容器(container)
容器的本質就是一個運行在服務器上的進程,docker鏡像中的每一層文件都是隻讀的,只有最上面一層上可寫的,這一層就是容器,容器這一層是可寫的,當容器對下一層的鏡像去寫東西,會將下一層的鏡像中要修改的文件拷貝一份到最上層容器中,而後在對它修改,修改以後當程序讀取這個最新的文件,由於程序讀取會從最頂層開始查找。因爲鏡像是不能夠修改的,因此同一個容器能夠生成多個容器獨立運行,它們之間沒有任何干擾。
鏡像和容器區別:
鏡像實際上是有多個只讀層,它們重疊在一塊兒,除了最上面一層可寫其它都是隻讀模板,而容器就是鏡像的一個運行實例。
3.倉庫(repository)
倉庫就是存放鏡像的地方,可使用docker pull命令從docker hub拉取咱們須要的鏡像,進行操做。docker有官方等其餘公司提供的鏡像中心,也支持搭建本身私有的鏡像中心。
經常使用倉庫地址列表:
hub.docker.com (docker官方倉庫)
c.163.com(網易蜂巢)
hub.docker.com 裏面經常使用鏡像列表
五.Docker 架構
docker架構圖
1.DOCKER_HOST:docker操做宿主機,上面運行了Docker daemon核心程序,負責各類docker操做,好比下載docker鏡像或者運行一個容器。
2.Client:客戶端用命令和Docker daemon交互,好比pull,build ,run等,交給Docker daemon來操做,和遠端鏡像倉庫交互。
3.Registry:公司的sass服務,是存放 Docker 鏡像的倉庫,Docker daemon能夠和Registry交互。
六.docker的安裝
安裝docker先看下centos版本
[root@localhost ~]# uname -r 3.10.0-514.21.2.el7.x86_64
第一個命令,下載
wget -qO- https://get.docker.com/ | sh
下載完後,docker默認狀況是容許root去運行,全部建議添加一個用戶到docker組
先查看用戶組
cat /etc/group
咱們添加一個用戶
[root@localhost docker]# usermod -aG docker songguojun
#groups 查看當前登陸用戶的組內成員
查看加入狀況
cat /etc/group
查看docker是否安裝成功
docker info
若是出現下面命令
說明docker服務沒有啓動
咱們啓動下
service docker start
在執行 docker info
docker安裝成功
咱們能夠直接輸入docker命令 查看docker命令的選項
咱們看到裏面有個run參數,意思是在一個新容器中執行命令,能夠單獨查看這個參數意思
[root@localhost ~]# docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container Options: --add-host list Add a custom host-to-IP mapping (host:ip) -a, --attach list Attach to STDIN, STDOUT or STDERR --blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) --blkio-weight-device list Block IO weight (relative device weight) (default []) --cap-add list Add Linux capabilities --cap-drop list Drop Linux capabilities --cgroup-parent string Optional parent cgroup for the container --cidfile string Write the container ID to the file --cpu-period int Limit CPU CFS (Completely Fair Scheduler) period --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota --cpu-rt-period int Limit CPU real-time period in microseconds
docker window安裝:https://docs.docker.com/docker-for-windows/install/
Mac安裝:https://docs.docker.com/docker-for-mac/install/
更多安裝參考: http://www.docker.org.cn/book/install/supported-platform-17.html
七.docker的使用
咱們先輸入如下命令
songguojundeMBP:java songguojun$ docker run centos echo hello docker #這個命令做用是用docker運行centos鏡像 並輸出hello docker字符串 Unable to find image 'centos:latest' locally latest: Pulling from library/centos #在docker運行鏡像前會查看本地環境是否有這個要運行等鏡像 這裏就是查看centos這個鏡像,發現沒有就從遠端讀取開始下載 8ba884070f61: Pull complete Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475 Status: Downloaded newer image for centos:latest #鏡像下載成功 hello docker #輸出字符串
查看本地有哪些鏡像
songguojundeMBP: songguojun$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 9f38484d220f 3 months ago 202MB
運行nginx服務
songguojundeMBP: songguojun$ docker run -p 8080:80 -d daocloud.io/nginx #-d參數表明守護進程 Unable to find image 'daocloud.io/nginx:latest' locally latest: Pulling from nginx 743f2d6c1f65: Pull complete 6bfc4ec4420a: Pull complete 688a776db95f: Pull complete Digest: sha256:e770165fef9e36b990882a4083d8ccf5e29e469a8609bb6b2e3b47d9510e2c8d Status: Downloaded newer image for daocloud.io/nginx:latest 720bfbd6d9beaaea8b7bb9506c6e45345a4dcd29e6486a4798b4aa31488fba13
上面開啓了本地nginx服務,咱們在瀏覽器上輸入http://localhost:8080/
查看當前運行的容器
songguojundeMBP: songguojun$ docker ps #顯示當前正在運行的容器 docker ps -a 列出全部的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 720bfbd6d9be daocloud.io/nginx "nginx -g 'daemon of…" 29 seconds ago Up 28 seconds 0.0.0.0:8080->80/tcp quirky_blackwell
CONTAINER ID:容器id
PORTS:端口映射關係
修改nginx默認首頁
songguojundeMBP:tmp songguojun$ cat index.html <html> <h1>hello docker</h1> </html> songguojundeMBP:tmp songguojun$ docker cp index.html 720bfbd6d9be://usr/share/nginx/html
再次查看
不過這個修改只是暫時的,當再次重啓容器時候,以前的修改都會消失。
中止docker容器
songguojundeMBP:tmp songguojun$ docker stop 720bfbd6d9be
720bfbd6d9be
再次設置
[songguojundeMBP:tmp songguojun$ docker run -p 8080:80 -d daocloud.io/nginx # -d表示守護進程 3a69a07abb20cd12b238063ca8aaa6aa07d592266eb0e93d93ea9a0c15853375 [songguojundeMBP:tmp songguojun$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3a69a07abb20 daocloud.io/nginx "nginx -g 'daemon of…" 24 seconds ago Up 22 seconds 0.0.0.0:8080->80/tcp festive_khorana [songguojundeMBP:tmp songguojun$ docker cp index.html 3a69a07abb20://usr/share/nginx/html [songguojundeMBP:tmp songguojun$ docker commit -m 'fun' 3a69a07abb20 nginx-newimage 保存image sha256:8c9627568f55f12c1fe8b561253ef89bdc58b6511f513b3de2759122dc4e6203 新產生的image的id [songguojundeMBP:tmp songguojun$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx-newimage latest 8c9627568f55 21 seconds ago 109MB 這個是上面新產生的image daocloud.io/nginx latest 53f3fd8007f7 6 weeks ago 109MB centos latest 9f38484d220f 3 months ago 202MB
啓動容器並進入該容器中
songguojundeMBP:docker songguojun$ docker run -i -t centos /bin/bash #啓動一個centos容器及啓動容器時候到命令 /bin/bash [root@5ce0363609a4 /]# ls #當前centos容器環境 說明已經進入了 5ce0363609a4是容器的名字 anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
八.Dockerfile
上面咱們經過docker commit能夠建立一個新的鏡像,咱們也能夠經過一個配置文件去一步步構建(docker build
)新的鏡像,這個配置文件就是Dockerfile,能夠幫助咱們從一個基礎鏡像開始創建一個自定義鏡像,使用配置文件的方式能夠更加方便。
編寫Dockerfile文件
[songguojundeMBP:docker songguojun$ cat Dockerfile FROM alpine:latest #alpine是專門針對docker作的一個極小的linux環境 image會很是小 MAINTAINER xbf CMD echo "hello Docker"
而後用docker build構建
[songguojundeMBP:docker songguojun$ docker build -t hello_docker . #構建 Sending build context to Docker daemon 2.048kB Step 1/3 : FROM alpine:latest latest: Pulling from library/alpine 921b31ab772b: Pull complete Digest: sha256:ca1c944a4f8486a153024d9965aafbe24f5723c1d5c02f4964c045a16d19dc54 Status: Downloaded newer image for alpine:latest ---> 4d90542f0623 Step 2/3 : MAINTAINER xbf ---> Running in 5c0c87f55732 Removing intermediate container 5c0c87f55732 ---> 92236846ad7f Step 3/3 : CMD echo "hello Docker" ---> Running in 86e5f878788c Removing intermediate container 86e5f878788c ---> 7378acc65286 Successfully built 7378acc65286 Successfully tagged hello_docker:latest
[songguojundeMBP:docker songguojun$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello_docker latest 7378acc65286 2 minutes ago 5.58MB #這個就是生成的新的image
<none> <none> 8c9627568f55 15 hours ago 109MB
alpine latest 4d90542f0623 3 days ago 5.58MB
daocloud.io/nginx latest 53f3fd8007f7 6 weeks ago 109MB
centos latest 9f38484d220f 3 months ago 202MB
[songguojundeMBP:docker songguojun$ docker run hello_docker #運行
hello Docker
編寫Dockerfile文件去運行
編寫Dockerfile文件以下
FROM ubuntu MAINTAINER songguojun RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nginx COPY index.html /var/www/html ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] EXPOSE 80
構建
songguojundeMBP:dockefile2 songguojun$ docker build -t songguojun/run-nginx . # 點.表明當前目錄上下文 Sending build context to Docker daemon 3.072kB Step 1/8 : FROM ubuntu latest: Pulling from library/ubuntu 5b7339215d1d: Pull complete 14ca88e9f672: Pull complete a31c3b1caad4: Pull complete b054a26005b7: Pull complete Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c Status: Downloaded newer image for ubuntu:latest ---> 4c108a37151f Step 2/8 : MAINTAINER songguojun ---> Running in 7f9ca70095c4 Removing intermediate container 7f9ca70095c4 ---> 671c843cfffd Step 3/8 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list ---> Running in 6238932a7dca Removing intermediate container 6238932a7dca ---> 4f672cace3ec Step 4/8 : RUN apt-get update Removing intermediate container 6e93cc3d0300 ---> dfc95c276b1d Step 6/8 : COPY index.html /var/www/html ---> 2407837e404b Step 7/8 : ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] ---> Running in f66729e00481 Removing intermediate container f66729e00481 ---> 7e34bc3f7eb6 Step 8/8 : EXPOSE 80 ---> Running in 3dbdd072eaa8 Removing intermediate container 3dbdd072eaa8 ---> 2d0b94c15efc Successfully built 2d0b94c15efc Successfully tagged songguojun/run-nginx:latest
運行
songguojundeMBP:dockefile2 songguojun$ docker run -d -p 80:80 songguojun/run-nginx 08f8f58bf0bf8977a528a33bd35efca667dfb71cc4ca45017bdade452ad736da songguojundeMBP:dockefile2 songguojun$ curl http://localhost:80 docker runing #這個是index.html文件裏的內容
Dockerfile指令
Dockerfile指令都是大寫,後面跟着參數。
指令參數 | 做用 |
---|---|
FROM | base image |
RUN | 執行命令 |
ADD | 添加文件,能夠將遠程的文件添加入容器 |
COPY | 拷貝文件 |
CMD | 執行命令 |
EXPOSE | 暴露端口 |
WORKDIR | 指定路徑 |
MAINTAINER | 維護者 |
ENV | 設定容器裏的環境變量 |
ENTRYPOINT | 容器入口,和CMD相似 |
USER | 指定用戶 |
VOLUME | mount point,指定容器所掛載的卷 |
鏡像分層
Dockerfile配置文件裏每一條命令都會產生一個新層,每一層對應一個獨立的字符串id。
上面黃色一層表示容器層,是可讀可寫,它產生於image運行後,這樣保證容器是能夠改變的。下面紅色的是隻讀。
分層的好處可使相同的層在不一樣的image裏複用。
九.Docke存儲技術Volume
volume是提供獨立於容器外的持久化存儲。
songguojundeMBP:~ songguojun$ docker run -d --name nginx -v /usr/share/nginx/html nginx
42ccf5ff54e62010ed44415fb25295619952411594f220abcb0365d0ba4938b9
songguojundeMBP:~ songguojun$ docker inspect nginx #獲取容器/鏡像的元數據.
[
{
"Id": "42ccf5ff54e62010ed44415fb25295619952411594f220abcb0365d0ba4938b9",
"Created": "2019-07-01T12:23:20.678195837Z",
"Path": "nginx",
"Args": [
"-g",
"daemon off;"
],
"State": {
.......
"Mounts": [
{
"Type": "volume",
"Name": "060bcb88df7ec3077f137182d545c21bd5eda97c931ca98acbe5dd390707c934",
"Source": "/var/lib/docker/volumes/060bcb88df7ec3077f137182d545c21bd5eda97c931ca98acbe5dd390707c934/_data", #宿主機的路徑,會掛載到下面容器內的路徑
"Destination": "/usr/share/nginx/html", #容器內部的路徑
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
............
下面列出docker經常使用命令
命令 | 做用 |
---|---|
docker version | 查看docker版本。 |
docker-compose --version | 查看compose 版本信息 |
docker pull | 從遠端獲取image |
docker build | 建立image |
docker images | 列出本地已有image |
docker run | 運行container |
docker ps | 列出container |
docker rm | 刪除已經結束的container |
docker rmi | 刪除一個image |
docker cp | 在host和container之間複製文件 |
docker commit | 保存已經被改動的image生成一個新的鏡像 |