【Docker】簡介及環境搭建

1、Docker的簡介

什麼是Docker

docker是一個開源的應用容器引擎,基於go語言開發並遵循了apache2.0協議開源。docker是一種容器技術,它能夠對軟件及其依賴進行標準化的打包;容器之間先對獨立,基於容器運行的應用之間也是相互隔離的;而且容器之間是共享一個OS kernel的,充分利用服務器資源,容器能夠運行在不少主流的操做系統之上。python

容器和虛擬機的區別

容器時在linux上運行,並與其它容器共享主機的內核,它運行一個獨立的進程,不佔用其它任何可執行文件的內存,很是輕量。虛擬機運行的是一個完成的操做系統,經過虛擬機管理程序對主機資源進行虛擬訪問,相比之下須要的資源更多。
image.pngmysql

  • 容器是app層面的隔離
  • 虛擬機是物理資源層面的隔離

docker架構和底層技術簡介

docker本質就是宿主機的一個進程,docker是經過namespace實現資源隔離,經過cgroup實現資源限制,經過寫時複製技術(copy-on-write)實現了高效的文件操做(相似虛擬機的磁盤好比分配500g並非實際佔用物理磁盤500g)
image.pnglinux

底層技術簡介

namespace名稱空間

namespace的六項隔離
namepace 系統調用參數 隔離內容
UTS CLONE_NEWUTS 主機名與域名
IPC CLONE_NEWWIPC 信號量、消息隊列和共享內存
PID CLONE_NEWPID 進程編號
NEWWORD CLONE_NEWNET 網絡設備、網絡棧、端口等
MOUNT CLONE_NEWNS 掛載點(文件系統)
USER CLONE_NEWUSER 用戶和用戶組(3.8之後的內核才支持)

control group控制組

cgroup的功能
  • 資源限制:能夠對任務使用的資源總額進行限制
  • 優先級分配:經過分配的cpu時間片數量以及磁盤IO帶寬大小,實際上至關於控制了任務運行優先級
  • 資源統計:能夠統計系統的資源使用量,如cpu時長,內存用量等
  • 任務控制:cgroup能夠對任務執行掛起、恢復等操做

2、Docker的環境搭建

CentOS安裝docker

sudo yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engine
  • 安裝yum-utils工具包
sudo yum install -y yum-utils
  • 添加docker倉庫
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 安裝最新版docker引擎(社區版)
sudo yum install docker-ce docker-ce-cli containerd.io
  • 安裝指定版本的docker引擎
#查詢docker版本,版本從高到低排序
yum list docker-ce --showduplicates | sort -r

#安裝指定版本的docker,替換<VERSION_STRING>便可
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  • 啓動docker
sudo systemctl start docker
  • 查看docker版本
sudo docker version

image.png

  • 檢驗docker引擎被成功安裝
sudo docker run hello-world

image.png

3、Docker的鏡像、容器和倉庫

image.png
docker基於linux內核空間,在基礎鏡像的基礎上一層層構建出用戶鏡像。容器是鏡像的運行實例。經過鏡像啓動一個容器,一個鏡像是一個可執行的包,其中包括運行應用程序所須要的全部內容包含代碼,運行時間,庫、環境變量、和配置文件。git

Docker image鏡像

Docker鏡像是什麼

docker鏡像就是一個只讀模板,好比,一個鏡像能夠包含一個完整的centos,裏面僅安裝apache或用戶的其餘應用,鏡像能夠用來建立docker容器。github

  • 文件(root filesystem)和meta data的集合
  • image是分層的,而且每一層均可以添加、修改、刪除文件,成爲一個新的image
  • 不一樣的image能夠共享相同的layer
  • image自己是read-only只讀的

Docker鏡像相關命令

  • 查看本地已有的鏡像列表
docker image ls

docker images

image.png

  • 刪除鏡像
docker image rm f6509bac4980

#簡寫
docker rmi f6509bac4980
  • 構建鏡像
#根據dockerfile構建一個鏡像
docker image build

#從一個被改變的容器建立一個新的鏡像
docker container commit

#簡寫,從一個被改變的容器建立一個新的鏡像
docker commit
  • 從鏡像倉庫拉取鏡像
#默認從docker hub拉取
docker pull ubuntu:14.04
  • 查看指定鏡像的建立歷史
#經過鏡像名稱
docker history mysql:5.7

#經過鏡像ID
docker history f6509bac4980

Dockerfile語法及實踐

dockerfile語法

FROM關鍵字
#製做base image
FROM scratch

#使用base image
FROM centos

FROM ubuntu:14.04

說明:爲了安全起見,儘可能使用官方的鏡像做爲基礎鏡像sql

LABEL關鍵字
LABEL version="1.0"
LABEL description="this is description"

說明:此關鍵字的做用是定義鏡像的元數據,相似於註釋及幫助信息,仍是很是必要的docker

RUN關鍵字
RUM yum update && yum install -y vim \
python-dev #反斜線換行

說明:RUN關鍵字用來執行命令,值得注意的是每運行一次RUN,都會生成一層layer,爲了不無用分層,務必合併多條命令成一行,反斜線換行,&&合併成多條命令apache

WORKDIR關鍵字
#若是不存在此目錄,則會自動建立目錄,並進入目錄 
WORKDIR /test 
WORKDIT demo 
RUN $PWD #輸出結果應爲/test/demo

說明:WORKDIR設定當前工做目錄,進入目錄應當使用WORKDIR,避免使用RUN cd,由於RUN會新增層,還有儘可能使用絕對目錄。ubuntu

ADD和COPY關鍵字
ADD test.tar.gz / #添加到根目錄並解壓縮
COPY hello /

說明:AND and COPY本地文件添加到Docker Image裏面,大部分狀況,COPY優於ADD,ADD相比COPY有解壓縮的功能。如須要添加遠程文件或目錄,請使用RUN關鍵字執行curl或者wget命令。vim

ENV關鍵字
ENV MYSQL\_VERSION 5.7 #設置常量 
RUN apt-get install -y mysql-servier= "${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* #引用常量

說明:設置常量,增長可維護性

VOLUME關鍵字
EXPOSE關鍵字
CMD關鍵字
ENTRYPOINT關鍵字

Docker container容器

Docker container容器是什麼

docker利用容器來運行應用,容器是從鏡像建立的運行實例,它能夠被啓動,開始、中止、刪除、每一個容器都是互相隔離的,保證安全的平臺,能夠吧容器看作是要給簡易版的linux環境(包括root用戶權限、鏡像空間、用戶空間和網絡空間等)和運行再其中的應用程序

image.png

  • 容器經過image建立(copy)
  • 容器在imagelayer之上創建要一個container layer(可讀寫)
  • image負責app的存儲和分發,container負責運行app
  • 容器與鏡像的關係相似於類和實例的關係

Docker容器相關命令

  • 查看容器列表
#當前正在運行的容器列表
docker container ls

#列出全部容器,包含已退出的
docker container ls -a

docker ps -a

image.png

  • 運行一個容器
docker run centos

#以交互模式運行一個容器
docker run -it centos
  • 刪除容器
#指定容器ID刪除
docker container rm d02f80816fbb

#簡寫
docker rm d02f80816fbb

#刪除全部的容器,-q選項只列出容器ID
docker rm $(docker container ls -aq)

#刪除退出狀態的容器,-q選項只列出容器ID
docker rm $(docker container ls -f "status=exited" -q)

Docker repository倉庫

Docker repository倉庫是什麼

倉庫是集中存儲鏡像文件的地方,registry是倉庫註冊服務,實際上倉庫註冊服務器上存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。倉庫分爲兩種,即公有倉庫和私有倉庫,最大的公開倉庫是docker Hub,存放了數量龐大的鏡像供用戶下載,國內的docker pool,這裏倉庫的概念與Git相似,registry能夠理解爲github這樣的託管服務

相關文章
相關標籤/搜索