爲了提升你對Docker的理解及興趣,首先,我得先說說這玩意到底能幹啥,舉個簡單的例子:php
當你要部署數臺 Nginx+PHP 或者 JRE 環境時,按照以往的老辦法,你須要ssh鏈接每臺機器分別進行編譯安裝,費時費力;然而如今,你能夠經過 Docker 在本地構建一個 Nginx+PHP 或者 JRE 的鏡像,而後將這些鏡像分別分發至你要部署服務的機器上,大大提升工做效率,同時保證了環境的一致性。html
你能夠想象成在你的服務器上運行了一個「虛擬機」,可是這個「虛擬機」跟平時咱們所講的「虛擬機」不同的地方在於,它是運行在系統內核上的,因此,能夠更高效的使用物理硬件資源,並且它要比「虛擬機」輕量級不少,這也使得它更加的靈活(但它並非虛擬機,而是一種容器技術)。linux
Docker 是一個開源的應用容器引擎,Docker 具備可移植性和輕量級的特性,讓開發者能夠打包他們的應用以及依賴包到一個容器中,而後發佈到其餘運行了 Docker 的機器上。nginx
Docker 的容器是徹底使用沙箱機制,相互之間不會有任何接口,這種隔離和安全性容許在一臺主機上同時運行多個容器。web
容器是輕量級的,由於它們直接在主機的內核中運行。這意味着,與使用虛擬機相比,你能夠在同一臺機器上運行更多的容器,甚至能夠在虛擬機的主機中運行Docker容器!docker
Docker Engine的組成部分數據庫
不懂不要緊,下面會對這些概念作詳細說明的。
Docker Client
使用 Docker REST API
經過腳本或命令來控制 Docker Daemon
或與其進行交互, Docker Daemon
建立並管理 Docker 對象,如 Docker Image
、Docker Container
,網絡和卷。ubuntu
Docker Engine的總體結構以下圖所示centos
圖片來自Dockersass
Docker的典型應用場景
Docker 守護進程(dockerd
)監聽Docker API請求並管理 Docker對象,如 鏡像、容器、網絡和卷。守護進程還能夠與其餘守護進程通訊來管理Docker服務。
Docker客戶端(docker
)是用戶與Docker交互的主要方式。當你使用命令時,如:docker run
,客戶端就會發送這些命令給dockerd
,守護進程會將其執行。
Docker客戶端是能夠與多個守護進程進行通訊的。
Docker Registries存儲Docker鏡像,你能夠理解成像 GitHub 同樣,咱們能夠在上面獲取或發佈資源。Docker Hub和Docker Cloud是任何人均可以使用的公共 Registries,而且 Docker 默認配置爲在 Docker Hub即https://hub.docker.com/上查找鏡像。
當你使用docker pull
或docker run
命令時,所需的鏡像將從您配置的 Registries 中提取。當您使用docker push
命令時,您的鏡像被推送到您配置的 Registries 中。
Docker對象Docker的對象包括:鏡像,容器,網絡,卷,插件和其餘對象。本節簡要介紹其中一些對象。
鏡像是一個只讀的模板,負責應用的存儲、分發。一般,一個鏡像是基於另外一個鏡像補充一些額外的自定義功能所構建的。
例如,您能夠在 Docker Hub 上 pull 一個centos
鏡像,而後安裝 Nginx Web 服務器,並附帶所需的配置文件,這樣你便構建了一個基於centos
鏡像的鏡像。
構建新的鏡像一般使用 Dockerfile 命令,後面會提到。
上面說過,image 是隻讀的,負責應用的存儲、分發,而 container 則是經過 image 建立的可讀寫的層,是 image 的可運行實例,負責運行應用程序。你可使用 Docker Client (調用 Docker API或CLI ) 建立、啓動、中止、移動或刪除 container 。你能夠將 container 鏈接到一個或多個網絡,甚至能夠根據其當前狀態建立新 image。
默認狀況下,容器與其餘容器及其主機相對隔離。您能夠控制容器的網絡、存儲或其餘底層子系統與其餘容器或主機的隔離程度。
Docker使用客戶端 – 服務器(C/S)體系結構。Docker Client 與 Docker Daemon 通訊,Docker Daemon 負責獲取 Images ,以及構建、運行和分發 Docker Container 。
Docker客戶端和守護進程能夠在同一個系統上運行,也能夠將Docker客戶端鏈接到遠程Docker守護進程。Docker客戶端和守護進程使用REST API經過UNIX套接字或網絡接口進行通訊。
圖片來自Docker
不一樣操做系統安裝方法能夠看官方文檔,很詳細,https://docs.docker.com
本機使用 CentOS 7.3,具體爲:
$ sudo cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) $ sudo uname -a Linux Docker 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
1.一、安裝依賴
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
1.二、添加穩定的 Docker 源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install -y docker-ce
docker官方提供了腳本安裝,你能夠在服務器上運行以下命令安裝docker
curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
$ sudo systemctl start docker
要構建 Docker ,可使用命令 docker pull
,格式以下 :
docker pull [OPTIONS] NAME[:TAG|@DIGEST] [flags]
Docker 各類命令有好多參數,你可使用 –help 來查看
上面咱們說過,Docker 是在 Docker Registries 上獲取鏡像的,因此咱們能夠去 Docker Hub 即https://hub.docker.com上查找獲取鏡像。
首先獲取一個簡單的 Hello world 鏡像(這是個很小的 Docker 化的例子)。
打開網站後查找 「hello」,而後選擇第一個,你即可以看到以下所示的一個頁面,該頁面提示你如何獲取這個鏡像
按照提示獲取此鏡像
$ sudo docker pull hello-world Using default tag: latest //最新版本 latest: Pulling from library/hello-world //正在獲取鏡像 9bb5a5d4561a: Pull complete //獲取完成 Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77 //摘要 Status: Downloaded newer image for hello-world:latest //狀態
這裏須要注意一下,國內用戶從這個站點獲取鏡像資源可能會很慢,因此,國內有些廠商也開放了相應的 Docker Hub ,如 阿里雲 、 道客雲、 網易蜂巢等,你也能夠在這裏搜索你須要的鏡像,Docker 官方的鏡像會在這些站點同步。
查看獲取到的鏡像
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest e38bc07ac18e 2 days ago 1.85kB
由此能夠看到咱們成功獲取到了這個鏡像,而它的大小也只有 1.85 kb
經過使用docker run
建立運行一個 container,格式爲
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
$ sudo docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
請對照前文第二張圖片,詳細閱讀以上內容,以便加深對Docker工做模式的理解
請對照前文第二張圖片,詳細閱讀以上內容,以便加深對Docker工做模式的理解
請對照前文第二張圖片,詳細閱讀以上內容,以便加深對Docker工做模式的理解
$ sudo docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $ sudo docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2c72e9c99b96 hello-world "/hello" 34 seconds ago Exited (0) 33 seconds ago happy_montalcini
上面兩條命令,第一條是指 「查看當前運行的全部 container」;第二條指的是 「查看已經結束的和正在運行的全部容器」。由於 「hello-world」 image打包的其實就是一個可執行文件,做用就是 print 第2點中顯示的哪些內容,不會做爲後臺程序執行,因此,當你運行這個容器後,它會自動退出。
經過在 Docker Hub 官網查詢,獲得了 Nginx 鏡像的獲取方法
你也能夠經過 docker search 命令查找須要的鏡像
$ sudo docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 8341 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1316 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 545 [OK] $ sudo docker pull nginx Using default tag: latest latest: Pulling from library/nginx 2a72cbf407d6: Pull complete 04b2d3302d48: Pull complete e7f619103861: Pull complete Digest: sha256:18156dcd747677b03968621b2729d46021ce83a5bc15118e5bcced925fb4ebb9 Status: Downloaded newer image for nginx:latest
查看 Nginx 鏡像
$ sudo docker images nginx REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest b175e7467d66 3 days ago 109MB
$ sudo docker run -p 80:80 -d nginx b1b5c2b5c0c5ff0e145a77281792a6f9057dd115438402931a629ec70fb28771
參數說明:
檢查容器是否運行成功
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b315e64b5e68 nginx "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp silly_cori # 使用curl命令訪問本地80端口,檢查Nginx服務是否 $ sudo curl 127.0.0.1 |grep Welcome % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 612 100 612 0 0 685k 0 --:--:-- --:--:-- --:--:-- 597k <title>Welcome to nginx!</title> <h1>Welcome to nginx!</h1>
docker exec :與運行的容器進行交互
命令格式: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
$ sudo docker exec -it b315e64b5e68 /bin/bash root@b315e64b5e68:/# pwd / root@b315e64b5e68:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
b315e64b5e68 是啓動的 Nginx 容器的 ID,能夠看出這是一個基於 Linux 的鏡像
Dockerfile 也是一個大的知識點,本文就不詳細介紹了。這個須要你本身去讀官方文檔或者查閱相關資料。
除了像上面介紹的那種方式來獲取一個 Docker 化的 Nginx 鏡像,你也能夠本身製做,咱們以前有說過,一個鏡像是基於另外一個鏡像補充一些額外的自定義功能所構建的,此次,咱們的目標是基於 CentOS 做爲基礎鏡像,構建一個本身的 httpd 鏡像
使用Dockerfile建立鏡像須要用到一個命令 docker build
語法:docker build [OPTIONS] PATH | URL | -
一、Dockerfile 文件
$ sudo cat Dockerfile FROM centos MAINTAINER admin@sasss.com RUN yum install -y httpd EXPOSE 80
二、pull centos 基礎鏡像
$ sudo docker pull centos
三、構建 httpd 鏡像
$ sudo docker build -t sasss/httpd .
注意最後那個 「.」,表示在當前目錄下獲取 Dockerfile 文件在這個過程當中,你能夠看到 docker 具體都作了哪些操做
四、查看構建好的 httpd 鏡像
$ sudo docker images sasss/httpd REPOSITORY TAG IMAGE ID CREATED SIZE sasss/httpd latest 7d0ba5b27646 42 seconds ago 334MB
五、運行一個容器並運行 httpd 服務
$ sudo docker run --name http1 -it -p 8000:80 sasss/httpd /bin/bash [root@0da77799e292 /]# /usr/sbin/httpd -k start
六、檢查端口映射狀況,端口是否處於
$ sudo netstat -lntup|grep 8000 tcp6 0 0 :::8000 :::* LISTEN 100407/docker-proxy
七、本地測試是否運行成功
# 使用 Ctrl+p+q 鍵讓容器轉在後臺運行 # 而後在終端執行Curl命令,檢查是否返回正確的信息 $ sudo curl 127.0.0.1:8000
一、pull centos 基礎鏡像,前面 pull 過的能夠省略此步驟
$ sudo docker pull centos
二、進入鏡像,安裝 httpd 服務
$ sudo docker run --name httpdserver -it centos /bin/bash [root@db8221cd115b /]# yum -y install httpd
三、退出容器,構建鏡像
$ sudo docker commit httpdserver httpd sha256:67f7c81a5bc8f75c4c74c4b4fdc6f5944fca6db87dd5bbca3186e594c2012580 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest 67f7c81a5bc8 16 seconds ago 334MB
讓你運行過大量的 container 後,須要刪除的時候,能夠用以下方法
$ sudo docker rm $(docker container ls -aq)
另外,若是你當前列表中只有兩個 container ,他們的 ID 分別是 「42e7f5623927」 和 「26eb41c428b6」,那麼你若是要刪除一個的話,沒必要將 ID 寫全,只須要填寫能區分要刪除的 ID 和別的 ID 不一樣的首部便可,好比,你要刪除第一個container,則只需執行 「# docker rm 4」
Docker 包含了大量的命令及大量參數,不可能一天兩天就徹底掌握,這個須要你在往後工做學習中,遇到不懂的地方及時查找資料解決問題,用以鞏固所學知識,日復一日,天然熟練。
學習重要的一點就是找到一個好的學習方法,像 Docker 這種比較大的知識體系,一篇文章確定無法徹底的闡述清楚每一個概念,也不可能覆蓋到全部的知識點。
本文只是拋磚引玉,簡單介紹了 Docker ,但願你能經過本文,掌握合適的學習方法,爲 Docker 學習奠基一個小基礎。
本文經過 慕課網 學習總結