第一部分、Docker 入門

1、Docker 簡介

1.一、Docker 簡介

        爲了提升你對Docker的理解及興趣,首先,我得先說說這玩意到底能幹啥,舉個簡單的例子:php

        當你要部署數臺 Nginx+PHP 或者 JRE 環境時,按照以往的老辦法,你須要ssh鏈接每臺機器分別進行編譯安裝,費時費力;然而如今,你能夠經過 Docker 在本地構建一個 Nginx+PHP 或者 JRE 的鏡像,而後將這些鏡像分別分發至你要部署服務的機器上,大大提升工做效率,同時保證了環境的一致性。html

        你能夠想象成在你的服務器上運行了一個「虛擬機」,可是這個「虛擬機」跟平時咱們所講的「虛擬機」不同的地方在於,它是運行在系統內核上的,因此,能夠更高效的使用物理硬件資源,並且它要比「虛擬機」輕量級不少,這也使得它更加的靈活(但它並非虛擬機,而是一種容器技術)。linux

        Docker 是一個開源的應用容器引擎,Docker 具備可移植性和輕量級的特性,讓開發者能夠打包他們的應用以及依賴包到一個容器中,而後發佈到其餘運行了 Docker 的機器上。nginx

        Docker 的容器是徹底使用沙箱機制,相互之間不會有任何接口,這種隔離和安全性容許在一臺主機上同時運行多個容器。web

        容器是輕量級的,由於它們直接在主機的內核中運行。這意味着,與使用虛擬機相比,你能夠在同一臺機器上運行更多的容器,甚至能夠在虛擬機的主機中運行Docker容器!docker

Docker Engine的組成部分數據庫

  1. Docker Daemon:守護進程,它是長期運行的程序。
  2. Docker REST API:用於與守護進程進行通訊,並指示其執行操做的接口。
  3. Docker Client :客戶端,命令行界面(CLI)docker命令
  4. Docker Image :鏡像
  5. Docker Container :容器
不懂不要緊,下面會對這些概念作詳細說明的。

Docker Client 使用 Docker REST API 經過腳本或命令來控制 Docker Daemon 或與其進行交互, Docker Daemon 建立並管理 Docker 對象,如 Docker ImageDocker Container,網絡和卷。ubuntu

Docker Engine的總體結構以下圖所示centos

圖片來自Dockersass

Docker的典型應用場景

  • 自動化部署、打包應用
  • 建立輕量、私密的 PAAS 環境
  • 實現自動化測試和持續的集成/部署
  • 部署與擴展webapp、數據庫等服務

1.二、Docker 體系結構

  • Docker Daemon

        Docker 守護進程(dockerd)監聽Docker API請求並管理 Docker對象,如 鏡像、容器、網絡和卷。守護進程還能夠與其餘守護進程通訊來管理Docker服務。

  • Docker Client

        Docker客戶端(docker)是用戶與Docker交互的主要方式。當你使用命令時,如:docker run,客戶端就會發送這些命令給dockerd,守護進程會將其執行。

        Docker客戶端是能夠與多個守護進程進行通訊的。

  • Docker Registries

        Docker Registries存儲Docker鏡像,你能夠理解成像 GitHub 同樣,咱們能夠在上面獲取或發佈資源。Docker HubDocker Cloud是任何人均可以使用的公共 Registries,而且 Docker 默認配置爲在 Docker Hubhttps://hub.docker.com/上查找鏡像。

        當你使用docker pulldocker run命令時,所需的鏡像將從您配置的 Registries 中提取。當您使用docker push命令時,您的鏡像被推送到您配置的 Registries 中。

Docker對象

Docker的對象包括:鏡像,容器,網絡,卷,插件和其餘對象。本節簡要介紹其中一些對象。

  • 鏡像-Image

        鏡像是一個只讀的模板,負責應用的存儲、分發。一般,一個鏡像是基於另外一個鏡像補充一些額外的自定義功能所構建的。

        例如,您能夠在 Docker Hub 上 pull 一個centos鏡像,而後安裝 Nginx Web 服務器,並附帶所需的配置文件,這樣你便構建了一個基於centos鏡像的鏡像。

構建新的鏡像一般使用 Dockerfile  命令,後面會提到。

  • 容器-Container

        上面說過,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

2、安裝 Docker

2.一、安裝要求

  1. 在 Linux 安裝 Docker 須要內核版本不低於 3.10 ,建議 3.8 以上
  2. 必須是 64 位操做系統

不一樣操做系統安裝方法能夠看官方文檔,很詳細,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

2.二、安裝 Docker

2.2.一、設置存儲庫

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

2.2.二、安裝Docker社區版

$ sudo yum install -y docker-ce
docker官方提供了腳本安裝,你能夠在服務器上運行以下命令安裝docker
curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh

2.2.三、啓動Docker

$ sudo systemctl start docker

3、第一個 Docker 鏡像跟容器

3.一、第一個 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

3.二、運行第一個 Docker 容器

        經過使用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工做模式的理解

3.三、查看 container 狀態

$ 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點中顯示的哪些內容,不會做爲後臺程序執行,因此,當你運行這個容器後,它會自動退出。

4、Docker 化的 Nginx

4.一、獲取 Nginx 鏡像

        經過在 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

4.二、運行一個容器

$ sudo docker run -p 80:80 -d nginx
b1b5c2b5c0c5ff0e145a77281792a6f9057dd115438402931a629ec70fb28771

參數說明

  • -d:後臺運行。
  • -p 80:80:容器的80端口映射到主機的80端口
  • –name mynginx:將容器命名爲mynginx
  • -v $PWD/www:/www:將主機中當前目錄下的www掛載到容器的/www
  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:將主機中當前目錄下的nginx.conf掛載到容器的/etc/nginx/nginx.conf
  • -v $PWD/logs:/wwwlogs:將主機中當前目錄下的logs掛載到容器的/wwwlogs

        檢查容器是否運行成功

$ 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>

4.三、進入容器操做

        docker exec :與運行的容器進行交互

        命令格式: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

  • -d : 分離模式: 在後臺運行
  • -i : 即便沒有附加也保持STDIN 打開
  • -t : 分配一個僞終端
$ 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 的鏡像

5、構建本身的 Docker 鏡像

5.一、使用 Dcokerfile 構建新鏡像

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

5.二、經過手動修改容器建立鏡像

一、pull centos 基礎鏡像,前面 pull 過的能夠省略此步驟

$ sudo docker pull centos

二、進入鏡像,安裝 httpd 服務

$ sudo docker run --name httpdserver -it centos /bin/bash
[root@db8221cd115b /]# yum -y install httpd
  • –name,爲容器指定名稱

三、退出容器,構建鏡像

$ sudo docker commit httpdserver httpd
sha256:67f7c81a5bc8f75c4c74c4b4fdc6f5944fca6db87dd5bbca3186e594c2012580
$ sudo docker images
REPOSITORY   TAG       IMAGE ID            CREATED             SIZE
httpd        latest    67f7c81a5bc8        16 seconds ago      334MB
  • docker commit,根據容器的更改建立新鏡像
  • 格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

6、補充

        讓你運行過大量的 container 後,須要刪除的時候,能夠用以下方法

$ sudo docker rm $(docker container ls -aq)
  • -aq 只獲取每一個 container 的 ID
  • 經過 $取值,進而達到批量刪除

        另外,若是你當前列表中只有兩個 container ,他們的 ID 分別是 「42e7f5623927」 和 「26eb41c428b6」,那麼你若是要刪除一個的話,沒必要將 ID 寫全,只須要填寫能區分要刪除的 ID 和別的 ID 不一樣的首部便可,好比,你要刪除第一個container,則只需執行 「#  docker rm 4」

        Docker 包含了大量的命令及大量參數,不可能一天兩天就徹底掌握,這個須要你在往後工做學習中,遇到不懂的地方及時查找資料解決問題,用以鞏固所學知識,日復一日,天然熟練。

        學習重要的一點就是找到一個好的學習方法,像 Docker 這種比較大的知識體系,一篇文章確定無法徹底的闡述清楚每一個概念,也不可能覆蓋到全部的知識點。

        本文只是拋磚引玉,簡單介紹了 Docker ,但願你能經過本文,掌握合適的學習方法,爲 Docker 學習奠基一個小基礎。


本文經過 慕課網 學習總結

更詳細的內容,可經過Docker官網,或者菜鳥教程學習

相關文章
相關標籤/搜索