快速交付和部署html
高效虛擬化前端
可移植、可擴展node
對比傳統虛擬機linux
特性 | 容器 | 虛擬機 |
---|---|---|
啓動 | 秒級 | 分鐘級 |
硬盤使用 | 通常MB | 通常GB |
性能 | 接近原生 | 弱於原生 |
系統支持量 | 單機上千個容器 | 通常幾十個 |
能夠總結出,docker能夠實現:nginx
可見docker的 野心 是建立 ===軟件程序可移植的輕量容器===,讓其能夠在任何安裝了docker的機器上運行,而不用關心底層操做系統。git
先了解一下幾個基本概念:github
鏡像:是一個只讀的模版,用來建立docker容器,容器在啓動的時候建立一層可寫層做爲最上層docker
容器:從鏡像建立的運行實例,能夠被啓動、開始、中止、刪除。容器間是相互隔離的,看上去是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序shell
倉庫:相似 git,集中存放鏡像文件的場所,分爲公開倉庫(Public)和私有倉庫(Private),最大的公開倉庫是 Docker Hub數據庫
註冊服務器:相似GitHub 這樣的託管服務,存放着多個倉庫
宿主機:docker所在的服務器
數據卷:可供一個或多個容器使用的特殊目錄,相似於 Linux 下對目錄或文件進行 mount,它繞過 UFS,能夠提供不少有用的特性:
- 在容器之間共享和重用
- 對數據卷的修改會立馬生效
- 對數據卷的更新,不會影響鏡像
- 卷會一直存在,直到沒有容器使用
網絡模式:用來實現容器的網絡通訊,大概包括五種:
- bridge模式,--net=bridge(默認)
- host模式,--net=host
- none模式,--net=none
- 其餘容器模式(即container模式),--net=container:NAME_or_ID
- 用戶自定義:docker 1.9版本之後新增的特性
Dockerfile:易於自動化的命令,包含建立鏡像所需的所有指令,基於dockerfile中的指令,咱們可使用
$ docker build
命令來建立鏡像,經過減小鏡像和容器的建立過程來簡化部署。語法命令:
- INSTRUCTION argument 指令不區分大小寫,但命名約定爲所有大寫
- FROM
- 格式爲
FROM <image>
或FROM <image>:<tag>
- 第一條指令必須爲
FROM
指令。而且,若是在同一個Dockerfile中建立多個鏡像時,可使用多個FROM
指令(每一個鏡像一次)- MAINTAINER
- 格式爲
MAINTAINER <name>
,指定維護者信息- RUN
- 格式爲
RUN <command>
或RUN ["executable", "param1", "param2"]
- 前者將在 shell 終端中運行命令,即
/bin/sh -c
;後者則使用exec
執行。指定使用其它終端能夠經過第二種方式實現,例如RUN ["/bin/bash", "-c", "echo hello"]
- 每條
RUN
指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時可使用 \ 來換行- CMD
CMD ["executable","param1","param2"]
使用exec
執行,推薦方式CMD command param1 param2
在/bin/sh
中執行,提供給須要交互的應用CMD ["param1","param2"]
提供給ENTRYPOINT
的默認參數- 指定啓動容器時執行的命令,每一個 Dockerfile 只能有一條
CMD
命令。若是指定了多條命令,只有最後一條會被執行- 若是用戶啓動容器時候指定了運行的命令,則會覆蓋掉
CMD
指定的命令- EXPOSE
- 格式爲
EXPOSE <port> [<port>...]
- 告訴 Docker 服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時須要經過 -P,Docker 主機會自動分配一個端口轉發到指定的端口
- ENV
- 格式爲
ENV <key> <value>
。 指定一個環境變量,會被後續RUN
指令使用,並在容器運行時保持。- ADD
- 格式爲 ADD
<src> <dest>
- 該命令將複製指定的
<src>
到容器中的<dest>
。 其中<src>
能夠是Dockerfile所在目錄的一個相對路徑;也能夠是一個 URL;還能夠是一個 tar 文件(自動解壓爲目錄)- COPY
- 格式爲
COPY <src> <dest>
- 複製本地主機的
<src>
(爲 Dockerfile 所在目錄的相對路徑)到容器中的<dest>
。當使用本地目錄爲源目錄時,推薦使用COPY
,能用COPY
的狀況下不用ADD
- ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
(shell中執行)- 配置容器啓動後執行的命令,而且不可被
docker run
提供的參數覆蓋- 每一個 Dockerfile 中只能有一個
ENTRYPOINT
,當指定多個時,只有最後一個起效- VOLUME
- 格式爲
VOLUME ["/data"]
- 建立一個能夠從本地主機或其餘容器掛載的掛載點,通常用來存放數據庫和須要保持的數據等
- USER
- 格式爲
USER daemon
- 指定運行容器時的用戶名或 UID,後續的
RUN
也會使用指定用戶- 當服務不須要管理員權限時,能夠經過該命令指定運行用戶。而且能夠在以前建立所須要的用戶,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres
。要臨時獲取管理員權限可使用gosu
,而不推薦sudo
- WORKDIR
格式爲
WORKDIR /path/to/workdir
爲後續的 RUN、CMD、ENTRYPOINT 指令配置工做目錄
可使用多個 WORKDIR 指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
則最終路徑爲 /a/b/c
- ONBUILD
格式爲
ONBUILD [INSTRUCTION]
配置當所建立的鏡像做爲其它新建立鏡像的基礎鏡像時,所執行的操做指令
例如,Dockerfile 使用以下的內容建立了鏡像
image-A
:[...] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/node-build --dir /app/src [...] 複製代碼
若是基於 image-A 建立新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎鏡像時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令:
FROM image-A #Automatically run the following ADD . /app/src RUN /usr/local/bin/node-build --dir /app/src 複製代碼
使用
ONBUILD
指令的鏡像,推薦在標籤中註明,例如ruby:1.9-onbuild
編寫完成 Dockerfile 以後,能夠經過
$ docker build
命令來建立鏡像
- 基本的格式爲
$ docker build [選項] 路徑
,該命令將讀取指定路徑下(包括子目錄)的 Dockerfile,並將該路徑下全部內容發送給 Docker 服務端,由服務端來建立鏡像。所以通常建議放置 Dockerfile 的目錄爲空目錄。也能夠經過.dockerignore
文件(每一行添加一條匹配模式)來讓 Docker 忽略路徑下的目錄和文件- 例如:
$ docker build -t ${dockerImageName} --force-rm -f ./Dockerfile .
=========================================================
以上是一些基本概念,如今ubuntu下開始安裝docker並啓動一個nginx容器(其實大多數場景下nginx不必跑在容器裏,這裏只是舉個例子)
=========================================================
$ cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
複製代碼
經過shell命令安裝:
$ curl -sSL https://get.docker.com/ | sh
檢驗安裝,顯示版本信息,說明已成功安裝:
$ docker -v
Docker version 18.09.5, build e8ff056
複製代碼
ps:$ docker info
可查看更多信息
下面開始建立一個容器:
$ docker run❶ \
-d❷ \
--name=demo❸ \
-u root❹ \
-p 8002:80❺ \
-v /var/demo:/var/demo❻ \
nginx:latest❼
複製代碼
該命令表示:基於nginx:latest這個鏡像,建立一個名稱爲demo的容器,並把容器內部的80端口與宿主機上的8002端口作映射,使得經過宿主機8002端口的流量轉發到容器內部的80端口上
❶:
run
新建並啓動容器,更多選項,其標準過程:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載(docker pull xxx)
- 利用鏡像建立並啓動一個容器
- 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
- 從地址池配置一個 ip 地址給容器
- 執行用戶指定的應用程序
- 執行完畢後容器被終止
❷:
-d
Daemonized模式,以守護態形式在後臺運行容器
❸:
--name=demo
爲容器起一個名字
❹:
-u
指定容器的用戶
❺:
-p
端口映射,規則是 -p 宿主機端口:容器端口,可屢次使用映射多個端口
❻:
-v
掛載數據卷,規則是 -v 宿主機目錄:容器目錄,可屢次使用掛載多個數據卷
❼:鏡像名,該容器所用的鏡像名,可經過
$ docker images
查看本地鏡像
查看正在運行的容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c24cfee8226a nginx:latest "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:8002->80/tcp demo
複製代碼
ps:$ docker ps -a
查看全部容器(包括正在運行的、已中止的)
如今訪問宿主機的8002端口(安全組開通),便可看到nginx的歡迎頁面:
進入容器:
執行 $ docker exec -it demo bash
,demo也能夠換成容器的id即:$ docker exec -it c24cfee8226a bash
在容器內可執行 $ netstat -lntp
查看端口使用狀況:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx: master pro
複製代碼
若發現netstat not found,先執行 $ apt update && apt install net-tools
執行 $ exit
退出容器
ps經常使用命令:
$ docker inspect demo
能夠查看該容器更多信息$ docker stop 容器名/id
終止容器$ docker rm 容器名/id
刪除未運行的容器$ docker rmi 鏡像名/id
刪除未佔用(無容器正在運行)的鏡像$ docker rmi $(docker images -f "dangling=true" -q)
批量刪除爲 none
(無容器正在運行)的鏡像【參考】:
===🧐🧐 文中不足,歡迎指正 🤪🤪===