爲了更好的理解,在正式開始之前,先熟悉下相關概念
鏡像(Image)、容器(Container)、倉庫(Repository)。
1.1鏡像
docker鏡像是使用Dockerfile腳本,將你的應用以及應用的依賴包構建而成的一個應用包,它通常帶有該應用的啓動命令。而這些命令會在容器啓動時被執行,也就是說你的應用在啓動容器時被啓動。
鏡像的創建,需要通過配置Dockerfile腳本,然後執行docker build
命令來創建。
1.2 容器
容器提供的核心概念是隔離,提供三種隔離類型:
- 工作區隔離(流程、網絡)
- 資源隔離(cpu\內存)
- 文件系統隔離(聯合文件系統)
不僅可以分發應用程序,還可以以實用的方式交付運行應用程序所需的整個環境。
容器是使用 docker run --name 容器名 鏡像
命令創建的,獨立於宿主機(服務器)的沙箱,也可以理解爲一個帶有特殊結構的盒子,主要作用就在於給鏡像提供運行空間和環境,並執行鏡像的指令。
1.3 倉庫
不是存容器,而是存儲docker鏡像。
可以把docker鏡像通過push命令推送到docker倉庫,也可以通過用docker命令pull 把鏡像拉取下來。
關係
使用docker前,你必須先安裝它。
首先要有鏡像,有了鏡像才能基於鏡像創建容器,才能把鏡像存儲在倉庫。(鏡像是基礎,容器是鏡像使用者,倉庫是鏡像的管理員。)
基礎鏡像通常不需要自己創建,docker官方有提供很多基礎鏡像供用戶使用,比如nodejs鏡像,java鏡像,mongodb鏡像,nginx鏡像等等
二 鏡像
而創建鏡像,首先得配置Dockerfile腳本。鏡像是基於Dockerfile腳本來構建的。
2.1 基礎鏡像
docker有這麼一種機制,在構建鏡像時,它可以依賴一個父鏡像作爲底層鏡像,與當前正要被構建的鏡像一起打包,從而構建成一個全新的鏡像。而這個被用作依賴的父鏡像,就是基礎鏡像。
可以理解爲,一個應用它不是隨處可運行的,它的運行需要依賴操作系統環境和對應的依賴().
- 因此,在配置項目Dockerfile創建鏡像腳本之前,需要先確立一個基礎鏡像。主要是通過在Dockerfile腳本中使用From命令指定依賴一個父鏡像(基礎鏡像)。
- 基礎鏡像通常不需要自己創建,docker官方有提供很多基礎鏡像供用戶使用,比如nodejs鏡像,java鏡像,mongodb鏡像,nginx鏡像等等.
2.2 Dockerfile腳本構成
docker鏡像是通過配置Dockerfile腳本,然後執行docker build
命令來創建的。
Dockerfile腳本通常分爲以下四部分:
- 基礎鏡像信息 --只有一個From指令,指定依賴的基礎鏡像
- 維護者信息 --只有一個MAINTAINER指令,用於描述該鏡像的維護者信息
- 鏡像操作指令 --很多:
- 容器啓動時執行的指令
- --CMD 每個 Dockerfile 只能有一條 CMD 命令,可被 docker run 提供的參數覆蓋。
- ENTRYPOINT 它不會被 docker run 提供的參數覆蓋
以下介紹鏡像操作指令:
COPY
COPY指令用於拷貝宿主機的源目錄/文件到容器內的某個目錄。接受兩個參數,源目錄路徑和容器內目錄路徑。
ADD
功能和用法與COPY指令基本相同,不同在於使用ADD指令拷貝時,如果拷貝的是壓縮文件,拷貝到容器中時會自動解壓爲目錄。
WORKDIR
指定RUN、CMD、ENTRYPOINT 指令的工作目錄
RUN
RUN是核心指令,它接受命令作爲參數並用於創建鏡像。命令較多時可用""換行。
USER
USER命令用於設置運行容器的UID。
VOLUME
VOLUME命令用於讓你的容器訪問宿主機上的目錄。一般用來存放數據庫和需要保持的數據等
ONBUILD
配置當所創建的鏡像作爲其它新創建鏡像的基礎鏡像時,所執行的操作指令。
ENV
ENV命令用於設置環境變量,在容器內被腳本或者程序調用。
EXPOSE
EXPOSE用來指定端口,使容器內的應用可以通過端口和外界交互。
2.3 鏡像的創建
鏡像是基於Dockerfile腳本,使用docker build
命令創建的。上面已經對Dockerfile做了介紹。下面來說說如何使用Dockerfile腳本創建。
語法:
docker build [OPTIONS] PATH
PATH爲Dockerfile腳本所在的目錄,通常放在項目根目錄下,使用"."表示。
-t 標記,用來添加tag,指定新的鏡像信息,比如鏡像名稱,標籤。
2.4 本地鏡像的管理
- 1,查看鏡像:docker images
- 2,刪除鏡像:docker rmi 鏡像
- 3,鏡像重命名:docker tag 原鏡像tag 新鏡像tag
- 4,查看鏡像創建歷史:docker history 鏡像
- 5,鏡像歸檔:docker save 鏡像
- 6,基於歸檔文件創建鏡像:docker import 歸檔文件 新鏡像tag
2.5 鏡像的使用
鏡像通過docker run
命令使用的,這是關於容器部分的操作。
三 demo驗證
我本地做測試用的:Nginx demo
我們要部署的服務是用 Nginx 來 server 一個簡單的 HTML 文件 html/index.html
。
3.1 準備工作,打開一個終端:
$ mkdir docker-demo
$ cd docker-demo
$ mkdir html
$ echo '<h1>Hello Docker!</h1>' > html/index.html
生成一個頁面。
3.2 接下來在當前目錄創建一個叫 Dockerfile 的新文件
FROM nginx
COPY html/* /usr/share/nginx/html
from 相關知識參照上一篇。
第二行把我們的靜態文件複製到鏡像的 /usr/share/nginx/html
目錄下。也就是 Nginx 尋找靜態文件的目錄。
3.3 構建鏡像
$ docker build -t docker-demo:0.1 .
最好在剛纔創建的這個目錄中運行 docker build
。如果是其他目錄,docker 會把當前目錄的所有文件作爲上下文發送給負責構建的後臺進程。
3.4. 查看鏡像
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-demo 0.1 54c5fe4fd4d0 13 minutes ago 126MB
nginx latest c7460dfcab50 6 days ago 126MB
這行命令中的名稱 docker-demo
可以理解爲這個鏡像對應的應用名或服務名,0.1
是標籤。
3.5. 運行鏡像
docker run --name docker-demo -d -p 8080:80 docker-demo:0.1
打開瀏覽器,輸入:http://127.0.0.1:8080/
查看 運行的容器
docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c95072fb6ac docker-demo:0.1 "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:8080->80/tcp docker-demo
如果要停止並 刪除
$ docker container stop docker-demo
$ docker container rm docker-demo