Docker 容器介紹

Docker 容器介紹

Docker 是一個基於 Go 語言的開源應用容器引擎,它既能實現虛擬化,又可用於將應用服務打包成輕量、可移植的容器,從而能夠發佈到任何 Linux 平臺。除了優秀了沙箱機制外,Docker 容器的開銷也極低。
正如其名,Docker 所作的事情正是以一個集裝箱的身份承載應用服務的運行,它與傳統的 KVMXen 等基於硬件虛擬化的雲計算系統不一樣,而是採用了 LXC (Linux Container) 內核虛擬化的模式,使得應用服務再也不須要獨立的貨輪(OS)爲其提供運做環境,而是裝載到集裝箱(Container)中運行服務。java

Docker 架構

組件

  • 鏡像Docker 容器的模板,通常是一套完整的根文件系統。不少發行版都提供了官方可用的容器鏡像,如 UbuntuCentOSAlpine 等。鏡像中還會記錄容器的基本信息如掛載點、外部端口和容器啓動時須要執行的命令等。
  • 容器Docker 系統中相互獨立的對象,它們是鏡像的實例,也是應用運行的實體。從虛擬化的角度來說,它們就相似一個個運行的虛擬機。容器能夠方便地進行建立/刪除操做,並隨時啓動/中止服務。爲了向外部服務和實現數據持久化,容器一般可以綁定到主機的端口映射,以及掛載主機的特定路徑。
  • 倉庫的概念對於熟知 Linux 軟件包管理的人來講已經不算是新鮮事物了,它在 Docker 系統中做爲一個代碼控制中心,主要負責鏡像的管理和存取。Docker 官方維護的公共倉庫:Docker Hub

核心

  • Server-Client 模式Docker 系統的本地工做模式,Docker Daemon 做爲一個服務端,控制着容器的運行,並監聽來自客戶端的請求。Docker Client 負責執行用戶的指令,向 Daemon 發出請求,從而完成操做。所以,儘管有些情形下沒有必要,但 Docker 服務確實是能夠進行遠程管理的。
  • LXC 系統使用了由 Linux 內核提供的 namespace 功能,其 pidnetipcmntuts 等各 namespace 組件實現了進程、網絡、消息、文件系統與主機名等各部分的隔離;它還經過 cgroups 來實現資源的配額與度量。
  • AUFS用於將不一樣目錄掛載到一個虛擬文件系統下,並對虛擬文件系統進行了分層。簡而言之,從一個鏡像 A 進行修改並構建另外一個鏡像 B,則對於鏡像 B 來講,A 原有的文件系統 Layer 是隻讀的,全部對 A 中原文件系統的更改只會存在於 B 新建的 Layer 中,這樣就實現了個多個子鏡像共用同一個父鏡像。在建立容器時,Docker 會從 bootfs 開始逐層加載,直到加載到目標鏡像並最終創建容器。在多容器並行的情形下,它們有着共同的底層鏡像,全部的修改都存在於各自的頂層 Layer 中。
  • GRSEC是由內核提供的安全補丁,主要用於保護 host 主機,並不是 Docker 組件。

Docker 運用

安裝

不少發行版的軟件倉庫裏已經爲您準備好了 Docker 相關的包——但或許您更喜歡使用最新的 Docker 版本,在這種狀況下,您能夠參照 Docker 官方的安裝文檔。官方提供了 CentOSDebianFedoraUbuntu 的安裝源和安裝說明,同時也提供了從二進制文件配置安裝的方法。參照官方文檔的流程安裝,一般不會出錯。linux

這裏給出 Debian 9 - Stretch 安裝 Docker 的示例。docker

  • 爲了安裝最新的官方版本,首先須要卸載本地已安裝的舊版 Docker 相關套件。(如未安裝過舊版,可跳過此步。)
sudo apt purge docker docker-engine docker.io containerd runc
  • 接下來執行添加源和安裝 Docker 的操做:
# 刷新數據庫
sudo apt update
# 一些必要的前置
sudo apt install apt-transport-https ca-certificates \
    curl gnupg2 software-properties-common
# 添加 Docker 官方 GPG key
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
# 以末8位字符查找其 fingerprint,應與文檔頁面所列一致
sudo apt-key fingerprint 0EBFCD88
# 添加軟件源,注意機器架構 arch = amd64/armhf/arm64
sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/debian \
    $(lsb_release -cs) stable"
# 刷新數據庫並安裝 Docker
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io
# 啓動 docker 服務
sudo systemctl enable docker
sudo systemctl start docker
# 驗證安裝
sudo docker run hello-world
  • 到這裏 Docker 就已經安裝完成了,但爲了讓用戶不須要得到 root 權限就可以操做 Docker,咱們還須要繼續如下操做:
# 首先查看當前系統是否有 docker 組
grep docker /etc/group
# 若沒有,則創建 docker 組
sudo groupadd -g 233 docker
# 將用戶加入到 docker 組
# username 爲用戶名,可用 $USER 變量表示當前用戶
sudo gpasswd -a username docker
# 或新建一個用戶
sudo useradd -G docker -u 2333 newuser
# 重啓 docker 服務
sudo systemctl restart docker
# 從新登陸並驗證權限 <必定要從新登陸>
docker info
  • 如今,您已經能夠免 sudo 操做 Docker 了。

運行容器

要運行一個容器服務,咱們須要爲其準備一個鏡像。這裏咱們以 Docker Hub 上的一個公共鏡像:Alpine 爲例,介紹容器建立和管理的相關命令。shell

# 搜索鏡像
docker search alpine
# 從列表中選取鏡像並拉取:<鏡像名:標籤>。其中標籤可忽略,默認 latest
docker pull alpine # 或 alpine:latest
# 等待拉取完成,查看已有鏡像列表
docker images # 或 docker image ls
# 查看鏡像具體信息 <端口、掛載點等>
docker inspect alpine
# 新建容器並以交互模式 <-it> 運行 [/bin/ash] 命令
# ash 爲 alpine 的默認 shell
docker run -it [--name test] [-v /tmp/test:/root] [-p 8080:80] alpine [/bin/ash]
# 也可讓容器建立後在後臺以掛起模式 <-d> 運行
docker run -d --name background alpine
# 鏈接到一個已啓動的容器並執行命令
docker exec -it test /bin/ash # 以交互模式從 test 容器運行終端
# 中止、啓動或重啓容器
docker stop/start/restart test
# 刪除容器
docker rm [-f] test

構建鏡像

若是咱們要運行本身的應用服務,則須要本身構建合適的鏡像。雖然從一個基礎鏡像構建容器並在容器內部操做也能實現應用服務的部署,甚至在此基礎上還能夠將容器打包爲新的鏡像,但這樣作並不合適,其自己違背了 Docker 的初衷。Docker 鏡像應當被設計爲一個即插即用的模板,使得咱們只須要少許的配置就能輕鬆部署大規模的應用服務。故爲特定的應用服務構建合適的鏡像是必不可少的。數據庫

爲了構建一個鏡像,咱們須要先準備一個空目錄,並在其中新建一個 Dockerfile 文件。此目錄用來存放鏡像須要的全部資源,在構建操做中,整個目錄都會被提交到 Docker Daemon 上,所以目錄中不該包含無用的資源。若是存在大量零碎的文件,將之打包成 tar 檔案是推薦的作法。安全

Dockerfile 用於指定如何構建鏡像,一個 Dockerfile 一般包含這些內容:網絡

# 指定基礎鏡像
FROM alpine
# 鏡像維護者信息
MAINTAINER Lost-Melody xxx@xxx.com
# 環境變量
ENV HOME /root
# 向鏡像中添加文件目錄,tar 包會自動解壓
ADD dir.tar.gz /root/dir
# 向鏡像中添加文件,與 ADD 區別在於不會解壓 tar 包
COPY files/* /root/
# 指定工做目錄
WORKDIR /root/dir
# 指定運行用戶
USER root
# 構建時執行的命令,每一個 RUN 命令都會提交一次新的鏡像
# 兩種方式:exec 方式、shell 方式
RUN ["/bin/sed", "-i", "s/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g"]
RUN apk update && apk upgrade \
    && apk add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && apk add openjdk8
# 指定容器啓動命令,可被 docker run 指定的命令覆蓋。多條 CMD 只有最後一條生效
CMD echo "Hello, world!"
CMD ["/bin/ash"]
# 指定容器入口命令,不被 run 覆蓋。多條只有最後一條生效
ENTRYPOINT ["/usr/bin/java", "-version"]
ENTRYPOINT java -jar xxx.jar
# 暴露容器端口以供主機映射
EXPOSE 80
# 添加掛載點
VOLUME ["/root/dir"]
# 當以此鏡像爲基礎鏡像時執行命令
ONBUILD ADD dir2.tar.gz /root/dir
ONBUILD RUN rm -rf /root/dir

編寫好 Dockerfile 文件後,在該目錄中執行 docker build -t name . 構建鏡像。架構

相關文章
相關標籤/搜索