1. 程式人生 > >環境篇:Docker

環境篇:Docker

環境篇:Docker

www.docker.com

Docker 是什麼?

Docker 是一個開源的應用容器引擎,基於Go語言並遵從Apache協議的開源,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。

如果沒有Docker

環境和配置變動,導致專案等不能簡單的部署成功,我們將需要的配置、系統、資料等等整體打包成我們需要的映象,簡單啟動就可以了,

Securely build and share any application, anywhere一次構建,處處執行。

  • 虛擬機器和容器化的區別?
    • 虛擬機器:整套安裝環境的一種解決方案,它可以在一種作業系統裡面執行另一個作業系統,比如在Windows系統裡面執行Linux系統。應用程式對此沒有感知,因為虛擬機器看上去就和真實的作業系統一模一樣,能夠使應用程式,作業系統和硬體三者之間的邏輯不變,而對於底層系統來說,虛擬機器就是一個普通檔案,不需要了就刪掉。

    • 虛擬機器佔用的資源多、步驟多,啟動是分鐘級的太慢。
    • 容器化技術:因為如上的問題,Linux發展出了另一種虛擬化技術,Linux容器(Linux Containers縮寫LXC)。Linux容器不是模擬一個完整的作業系統,而是對程式進行隔離。有了容器,就可以將軟體執行所需要的所有資源打包到一個隔離的容器中,容器和虛擬機器不同,不需要捆綁一整套的作業系統,只需要軟體工作所需要的庫資源和設定。系統因此而變得高效輕量並保證部署在任何環境中的軟體都能始終如一的執行。

1 Docker架構

  • Docker 包括三個基本概念:
    • 映象(Image):Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。
    • 容器(Container):映象(Image)和容器(Container)的關係,就像是面向物件程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
    • 倉庫(Repository):倉庫可看著一個程式碼控制中心,用來儲存映象。
Docker 面向物件
映象
容器 物件

概念 說明
Docker 映象(Images) Docker 映象是用於建立 Docker 容器的模板,比如 Ubuntu 系統。
Docker 容器(Container) 容器是獨立執行的一個或一組應用,是映象執行時的實體。
Docker 客戶端(Client) Docker 客戶端通過命令列或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護程序通訊。
Docker 主機(Host) 一個物理或者虛擬的機器用於執行 Docker 守護程序和容器。
Docker Registry Docker 倉庫用來儲存映象,可以理解為程式碼控制中的程式碼倉庫。Docker Hub(https://hub.docker.com) 提供了龐大的映象集合供使用。一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個映象。通常,一個倉庫會包含同一個軟體不同版本的映象,而標籤就常用於對應該軟體的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟體哪個版本的映象。如果不給出標籤,將以 latest 作為預設標籤。
Docker Machine Docker Machine是一個簡化Docker安裝的命令列工具,通過一個簡單的命令列即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

2 Docker安裝

  • 以centos7以上為例。(安裝2019.03版本)
  1. 刪除老版本
yum -y  remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-logrotate \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine \
                  yum-utils \
                  device-mapper-persistent-data \
                  lvm2
  1. 安裝需要的軟體包
#更新yum
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 設定穩定儲存庫
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 更新yum軟體包索引
yum makecache fast
  1. 安裝的Docker Engine-Community和containerd
#指定版本安裝
yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
#最新版本安裝
yum -y install docker-ce docker-ce-cli containerd.io
  1. 啟動
systemctl start docker  
  1. 設定開機啟動
systemctl enable docker
  1. 測試
#版本
docker version
  1. 配置阿里雲映象加速
  • 訪問阿里雲映象加速器網頁:https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2F

設定密碼儘量簡單如:docker123

  • 如果覺得不方便可以使用網易雲加速,地址更改如下
#1
mkdir -p /etc/docker

#2
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF

#3
systemctl daemon-reload

#4
systemctl restart docker
  1. hello-world映象
docker run hello-world

3 Docker 命令

3.1 幫助命令

docker help

3.2 檢視本地映象

docker images

-a:顯示所有的映象

-q:僅顯示id

REPOSITORY 映象倉庫源
TAG 映象標籤
IMAGE ID 映象ID
CREATED 映象建立時間
SIZE 映象大小

同一個REPOSITORY(倉庫源)可以有多個TAG,代表這個倉庫源的不同版本,使用REPOSITORY:TAG來定義不同的映象。

如果不指定一個映象的版本標籤,例如:使用hello-world,docker將預設使用hello-world:latest映象

3.3 查詢映象

docker search 需要的映象

去 https://hub.docker.com/上去搜索需要的軟體,經常搭配-s引數查詢點贊數比較高的映象

3.4 下載映象

docker pull 需要的映象:需要的版本tag

3.5 刪除映象

#刪除單個
docker rmi -f 映象ID
#刪除多個
docker rmi -f 映象名1:TAG 映象名2:TAG
#刪除全部
docker rmi -f ${docker images -qa}

3.6 檢視容器

docker ps

-a:顯示所有的容器

-l:顯示最近一條容器

-n:顯示最近幾條容器

-q:僅顯示id

3.7 新建啟動停止容器

#新建容器並啟動,如果沒有映象,會先去hubdocker上pull映象
docker run 可選引數  映象名(或ID)
#重啟容器
docker restart 容器名(或ID)
#停止容器(普通<==>強制)
docker stop 容器名(或ID) <==>   docker kill 容器名(或ID)
#啟動之前建立的容器
docker start 容器名(或ID)
#刪除之前建立的容器<==>批量
docker rm -f 容器ID   <==>    docker ps -aq | xargs docker rm

-d:守護式後臺執行容器,並返回容器ID(如使用tomcat)

-v:資料卷,指定主機的某個目錄為容器的某個目錄(如使用tomcat-> /root/tomcat/:/usr/local/tomcat/webapps/)

-i:互動式執行容器,通常-t一起使用(如使用linux中的linux)

-t:為容器重新分配一個偽輸入終端,通常與-i一起使用(如使用linux中的linux)

--name="新容器名字":為容器指定一個名稱

-P:隨機埠對映

-p:指定埠對映,有以下4種格式

ip:hostPort:containerPort

ip::containerPort

hostPort:containerPort

containerPort

3.7.1 守護式例子

#新建啟動容器
docker run --name="tomcat1" -dp 8888:8080  tomcat:8.0.52

3.7.2 互交式例子

#1 新建啟動容器,如下圖中目錄變更為容器ID
docker run --name='centos1' -it centos

#2 退出容器
exit    -->容器停止退出
ctrl+p+q    -->容器不停止退出(注意有先後順序)

#3 進入一個執行的容器
docker exec -it 容器名(或ID) /bin/bash

3.8 提交容器

docker commit -a='作者' -m='修改內容' 容器名(或ID) 容器字首/容器名:TAG號
  • 使用上面守護式例子繼續
#進入容器目錄
docker exec -it tomcat1 /bin/bash
#替換index.jsp內容
cat > webapps/ROOT/index.jsp << EOF
Hello Tomcat
EOF

#提交容器
docker commit -a='Heaton' -m='my tomcat test' tomcat1 heaton/tomcat:0.0.1

#刪除現有的執行容器
docker rm -f $(docker ps -q)
#執行之前自己構建的映象容器
docker run --name="tomcat1" -dp 8888:8080  heaton/tomcat:0.0.1

3.9 上傳映象

  • 選擇阿里雲或者hub,如下是阿里雲的上傳方式

#登入阿里雲docker倉庫,輸入密碼
dockerlogin [email protected] registry.cn-hangzhou.aliyuncs.com

#標記tag
docker tag b60d74c216b8 registry.cn-hangzhou.aliyuncs.com/docker-tzy/rep1:0.0.1
#上傳
docker push registry.cn-hangzhou.aliyuncs.com/docker-tzy/rep1:0.0.1

4 容器資料卷

Docker容器產生的資料,如果不通過commit生成新的映象,持久化,那麼容器刪除以後,資料就沒有了。

為了能儲存資料在docker中我們使用資料卷。

  • 資料卷可以在容器之間共享或重用資料
  • 卷中的更改可以直接生效
  • 資料卷中的更改不會包含在映象的更新中
  • 資料卷的生命週期一直持續到沒有容器使用它為止

docker inspect 容器ID --> 返回Docker物件的資訊(檢視掛載情況)

4.1 例1(命令-v)

#建立可讀可寫
docker run -it -v /my_root:/my_docker centos
#建立可讀不可寫(Read-only)
#docker run -it -v /my_root:/my_docker:ro centos


#進入繫結資料夾,主機建立新檔案
touch root.txt

#進入繫結資料夾,容器修改檔案
echo "docker add" > root.txt


#停止容器,主機修改檔案
echo "root add" > root.txt
#在重新啟動容器
docker start -i 34fe34e36ada

4.2 例2(DockerFile)

#建立Dockerfile檔案   vim dockerFile,寫入如下內容
#效果為docker run -it -v /my_root:/my_docker centos

FROM centos
VOLUME ["my_docker1","my_docker2"]
CMD echo "success"
CMD /bin/bash

#構建映象
docker build -f /Dockerfile -t mybuild/centos:0.0.1 .

#執行,發現有2個容器卷
docker run -it mybuild/centos:0.0.1

如例1進行資料卷測試,發現數據共享

4.3 例3(volumes-from)

容器間資料共享

#執行容器1
docker run -it --name docker1 mybuild/centos:0.0.1
#執行容器2
docker run -it --name docker2 --volumes-from docker1 mybuild/centos:0.0.1
#執行容器3
docker run -it --name docker3 --volumes-from docker2 mybuild/centos:0.0.1

如例1進行資料卷測試

5 Dockerfile

Dockerfile是用來構建Docker映象的構建檔案,是由一系列命令和引數構成的指令碼。

Java HelloWord.java HelloWord.class
Docker images DockerFile
  • 基礎注意點
    • 每條保留字指令必須為大寫字母且後面需要更至少一個引數
    • 指令從上到下循序執行
    • #為註釋
    • 每條指令都會建立一個映象層且對映象進行提交
  • 執行流程
    1. docker從基礎映象執行一個容器
    2. 執行一條指令並對容器做出修改
    3. 執行類似commit操作提交一個新的映象層
    4. 再基於剛提交的映象執行一個新容器
    5. 繼續執行dockerfile中的下一條指令,迴圈制所有指令完成
  • 保留字
FROM 基礎映象,當前映象是基於那個映象的。
MAINTAINER 作者 郵箱。
RUN 容器構建時需要執行的命令。
EXPOSE 暴露埠號 啟動容器的時候還需使用 –p 指定埠。
WORKDIR 指定在建立容器後,終端預設登入後進來的工作目錄,一個落腳點,預設根目錄,通常絕對路徑,CMD ENTRYPOINT 都會在這個目錄下執行。
ENV 構建映象的過程中設定環境變數, 構建和執行時都有效可以使用$引用。
ADD 將宿主機目錄下的檔案拷貝到映象且會自動處理URL和 解壓tar 壓縮包。ADD 支援 URL 和 COPY後解壓縮包。
COPY 拷貝檔案和目錄到映象中,將從構建上下文目錄中<源路徑>的檔案/複製到新的一層映象內<目標路徑>的位置。一般都用ADD
VOLUME 容器資料卷, 資料儲存和持久化。
USER 指定該映象由什麼使用者執行 不指定由root 執行。
CMD 指定容器啟動時要執行預設的命令,Dockerfile中可以有多個cmd , 但只有最後一個生效。CMD 會被docker run 之後的引數替換。
ENTERPOINT 指定容器啟動時要執行的命令。ENTERPOINT docker run 之後的引數會被當做引數傳遞給ENTRYPOINT , 之後形成新的命令組合,追加
ONBUILD 觸發器, 當構建一個被繼承的dockerfile時執行命令, 父映象在被子繼承後的父映象的onbuild 被觸發。
  • CMD 與 ENTERPOINT區別
  • CMD

如 tomcat中,在Dockerfile最後有CMD ["catalina.sh","run"],意思為啟動容器後執行tomcat啟動命令,如果使用命令docker run -it -p 8888:8080 tomcat:8.0.52 ls -l,就會將ls -l這個查詢指令通過引數傳給CMD,這時容器執行就不會啟動,而是查詢目錄。

  • ENTERPOINT

如果是CMD ["ls","-l"]指令,我們需要在加入一個 -a 的引數,那麼CMD將不能完成在構建映象後增加引數,這個時候可以把指令改成ENTERPOINT ["ls","-l"] ,我們就可以在後面繼續追加引數而不會替換原來的引數。

5.1 例1 拓展centos

  1. 自建centos
  2. 修改執行後路徑
  3. 使之可以使用vim,ifconfig等命令
  • 建立Dockerfile檔案,加入如下內容
#繼承自centos
FROM centos
#作者-郵箱
MAINTAINER Heaton
#建立環境變數mypath
ENV mypath /usr/local/src
#指定建立容器後終端路徑
WORKDIR $mypath
#構建容器時執行命令
RUN yum -y install vim
RUN yum -y install net-tools
#暴露埠號
EXPOSE 80
#容器啟動時要執行預設的命令
CMD echo "success"
CMD /bin/bash
  • 構建映象
docker build -f /root/Dockerfile -t heaton/centos:0.0.1 .




  • 執行映象
docker run -it heaton/centos:0.0.1

5.2 例2 觸發器

  • 建立Dockerfile1檔案,加入如下內容
#繼承自centos
FROM centos
ONBUILD RUN echo "father onbuild----------------------------->"
  • 構建
docker build -f /root/Dockerfile1 -t heaton/father .

  • 建立Dockerfile2檔案,加入如下內容
#繼承自heaton/father
FROM heaton/father
RUN echo "son------>success"
  • 構建
docker build -f /root/Dockerfile2 -t heaton/son .

相關推薦

環境Docker

環境篇:Docker www.docker.com Docker 是什麼? Docker 是一個開源的應用容器引擎,基於Go語言並遵從Apache協議的開源,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使

第二Docker容器技術棧

watermark ffffff alt mark process 51cto mage .com proc 說明:學習Docker容器技術,先縱向了解大致內容架構,再橫向逐一分解涉及的各項技術內容 第二篇:Docker容器技術棧

第三Docker容器架構

通信 進程 核心 aca 虛擬化 比較 部署 fff 圖片 Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。 Docker 容器通過 Docker 鏡像來創建。 Docker Daemon是docker最核心的守護進程,

史上最簡單的SpringCloud教程 | 第十一 docker部署spring cloud項目

大數 imageview 建議 chapter 環境 多次 pan mas 存儲 Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare m

史上最簡單的SpringCloud教程 | 第十一 docker部署spring cloud專案

Docker是一個開源的引擎,可以輕鬆的為任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機器)、bare metal、OpenStack 叢集和其他的基礎應用平臺。 Docker通常用於如下場景:

Docker $ 第六 Docker 網路功能

一.Docker網路功能簡介 1.Docker允許通過外部訪問容器,容器需要開放一個埠對映到容器外部的埠,外部可通過這個埠訪問到聯網的容器。 二.外部訪問容器 1.執行容器開放埠 # docker run --rm -d -p 80:80 --name webserver

Docker $ 第五 Docker 資料管理

一.Docker資料卷簡介 1.在Docker內部及容器之間對資料的管理有兩種方式,一種是資料卷,另一種是掛載主機目錄。 (1)資料卷(Volumes):提供一個或多個容器使用的特殊目錄,它的特性有 在容器之間可共享,可重用 對資料卷的修改立即生效

Docker $ 第四 Docker 倉庫的使用

一.Docker倉庫簡介 1.倉庫(Repository)是集中存放映象的地方,每個倉庫有多個映象。Docker hub是Docker官方維護的公共倉庫,這裡存放了大量的映象,大部分映象都可以在這裡拉取。 2.註冊伺服器(Registry)和倉庫不同,註冊伺服器是管理倉庫的地方,註冊

Docker $ 第三 Docker 容器的使用

一.Docker容器簡介 1.映象和容器的關係,就像面向物件的程式設計中的類和例項,映象是靜態的,容器是映象執行後產生的,容器1可被建立,啟動,停止,刪除。 2.容器是一個獨立的空間,就下宿主下的作業系統,有自己的檔案系統,網路配置,程序,由於容器的隔離性,在容器下執行的應用比在宿主

Docker $ 第二Docker 映象的使用

一.Docker映象簡介 1.映象是Docker三大元件之一,Docker執行容器需要對應的映象,如果說映象是程式,那容器就是程序,如果本地不存在映象,Docker就會從倉庫自動下載映象。 二.Docker使用映象 拉取映象 # docker pull

Docker $ 第二Docker映象的使用

一.Docker映象簡介 1.映象是Docker三大元件之一,Docker執行容器需要對應的映象,如果說映象是程式,那容器就是程序,如果本地不存在映象,Docker就會從倉庫自動下載映象。 二.Dock

Docker $ 第三 Docker容器的使用

一.Docker容器簡介 1.映象和容器的關係,就像面向物件的程式設計中的類和例項,映象是靜態的,容器是映象執行後產生的,容器1可被建立,啟動,停止,刪除。 2.容器是一個獨立的空間,就下宿主下的作業系

Docker $ 第四 Docker倉庫的使用

一.Docker倉庫簡介 1.倉庫(Repository)是集中存放映象的地方,每個倉庫有多個映象。Docker hub是Docker官方維護的公共倉庫,這裡存放了大量的映象,大部分映象都可以在這裡拉取

Docker $ 第七 Docker部署SpringBoot+Mysql

一.Dockerfile常用指令 FROM 目的 指定基礎映象 特點 需要寫在其他指令之前,之後的指令都依賴於該指令指定的映象。 語法 FROM <image> FROM

運維 docker 如何製作映象?

1 將容器 變成 映象 2 buildfile 建立新映象。 常見的一些問題? 把一個容器 變成一個映象。 docker commit <容器id> [版本號] 當我們在製作自己的映象的時候,會在container中安裝一些工具,修改配

用WebStorm進行Angularjs 2開發(環境Windows 10,Angular-cli方式)

自己學習使用了Angular JS 1一段時間,由於沒有具體的專案進行嘗試加上其它研究工作的影響,就擱置了一段時間。在與同事討論技術選型時,才知道Angular JS 2的差別之大(孤陋了,莫見笑),所以決定弄弄Angular 2。WebStorm是進行JS和前

Spring Cloud Learning | 第十二Docker部署Spring Cloud專案

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>sprin

環境嘔心瀝血@CDH線上調優

# 環境篇:嘔心瀝血@CDH線上調優 ![](https://img2020.cnblogs.com/blog/1235870/202006/1235870-20200604135334576-1518959957.png) - 為什麼出這篇文章? > 近期有很多公司開始引入大資料,由於各方資源有限,並

環境Kylin3.0.1整合CDH6.2.0

# 環境篇:Kylin3.0.1整合CDH6.2.0 ![](https://img2020.cnblogs.com/blog/1235870/202005/1235870-20200509195838572-60673219.png) > Kylin是什麼? > Apache Kylin™是一個開源的

環境DolphinScheduler-1.3.1安裝部署及使用技巧

# 環境篇:DolphinScheduler-1.3.1安裝部署 ##