天天看點

【One by one系列】一步步學習docker(一)

Docker

Build,Ship and Anywhere

1.基本概念

【One by one系列】一步步學習docker(一)
  • Docker Client:Docker提供給使用者的用戶端,功能就是提供給使用者一個終端,使用者輸入docker提供的指令來管理本地或者遠端的伺服器。
  • Docker Server:Docker Daemon是主要組成部分,Docker服務的守護程序,功能-接受Docker Client發過來的指令請求,并按照相應的路由規則實作路由分發。
  • Docker Images:Docker鏡像,類比電腦裝系統的CD盤,隻讀的CD
  • Docker Registry:Docker Images的倉庫,類比git,有私人的,有公共的,如github,docker提供了官方的Registry,Dock Hub
  • Docker Container:Docker 容器,在容器裡,跑項目程式、消耗機器資源、提供服務的地方;容器(Docker Container)通過鏡像(Docker Images)啟動,在鏡像的基礎上運作程式。可以了解為容器提供了硬體環境,然後使用了鏡像這些制作好的系統盤,再加上項目程式,跑起來就可以提供服務。
了解上圖:搭載Docker的主機,通過Docker Client使用

docker build

docker pull

docker run

讓Docker Daemon從Docker Registry拉取Ubuntu,redis,nginx等鏡像,然後通過這些鏡像建立不同的容器

2.安裝Docker

以CentOs為例:可以參考https://docs.docker.com/install/linux/docker-ce/centos/

https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.2206199170TjX9

  • 安裝輔助工具:

    yum install -y yum-utils device-mapper-persistent-data lvm2

    yum-utils:管理repository及擴充包的工具 (主要是針對repository)

    device-mapper-persistent-data:Device Mapper支援Linux上的許多進階卷管理技術;

    lvm2:邏輯卷管理工具;

  • 添加軟體源資訊,這裡使用Docker CE版本

    從2017年3月開始docker在原來的基礎上分為兩個分支版本: Docker CE 和 Docker EE。Docker CE 即社群免費版,Docker EE 即企業版,強調安全,但需付費使用。

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    更新yum緩存:

    yum makecache fast

  • 移除舊的版本

    yum remove docker

  • 安裝

    yum -y install docker-ce

  • 啟動

    systemctl start docker

    或者
    #服務方式啟動
    service docker start
    #設定開機啟動
    chkconfig docker on
               
  • 測試運作hello-world

    docker run hello-world

  • 解除安裝:

    yum remove docker-ce

    rm -rf /var/lib/docker

  • 問題:
【One by one系列】一步步學習docker(一)

解決方案

yum clean all

yum install docker-ce

3.docker基本操作

檢視版本

docker version

檢視鏡像

docker images

docker image ls

檢視容器

docker ps

拉取鏡像

docker pull image-name

【One by one系列】一步步學習docker(一)
【One by one系列】一步步學習docker(一)

鏡像放到容器中跑

docker run image-name

【One by one系列】一步步學習docker(一)

檢視容器運作情況

docker ps -a

docker container ps

docker container ps -a

【One by one系列】一步步學習docker(一)

4.docker原理

4.1docker優勢

  • docker image的體積小,ubuntu-100M+,小就意味着傳輸與分享友善
  • docker run 啟動的耗時為0.
  • docker 占用資源少

    想象一下如下場景把一個項目build成一個image,然後友善分發出去,别人拿到後也不用關心你的項目需要什麼環境或者依賴,隻要docker run一下就能運作。。而且速度很快,甚至在一台開發機都可以管理成百上千的container,沒有業務處理的時候也不會占用你的系統資源。。。

4.2原理

4.2.1虛拟機 vs Docker容器
【One by one系列】一步步學習docker(一)
4.2.2Docker核心元件
  • AUFS(chroot) – 用來建立不同的作業系統和隔離運作時的硬碟空間
  • Namespace – 用來隔離Container的執行空間
  • Cgroup – 配置設定不同的硬體資源
  • SELinux – 用來保護linux的網絡安全
  • Netlink – 用來讓不同的Container之間的程序保持通信,話說docker是golang開發的,還記得golang中goroutine如何通信?
  • Netfilter – 建立Container埠為基礎的網路防火牆封包過濾
  • AppArmor – 保護Container的網路及執行安全
  • Linux Bridge – 讓不同Container或不同主機上的Container能溝通
  • 等等·等等等等~
4.2.3術業有專攻

docker運用linux的技術走了捷徑,不虛拟化任何硬體,而是對硬體資源在不同的容器中做了隔離,隔離使米格容器之間擁有了不同的環境(硬碟空間-網路-系統工具包),然後又可以共享需要的硬體資源(cpu-記憶體-系統核心),dokcer用的技術很多(如上),一項一項研究基本不可能,這也不是我們學習docker的目的,我們是讓docker用于實際生産過程中,至于原理,了解即可,是以我們應該docker是怎麼就能辦到?

AUFS -> Another Union File System

:AUFS的技術可以讓多個檔案目錄union成一個新的目錄,并且可以對這個新的目錄進行讀寫操作。

【One by one系列】一步步學習docker(一)

​ 如果你有一張隻讀的cd資料盤,但是你卻想編輯裡面的内容,你通常的做法是不是把内容拷貝到本地硬碟,然後再編輯。

​ 但如果你可以利用AUFS技術,你就可以将硬碟中的一個空目錄和你的cd資料盤進行union形成一個新的目錄,接着你對這個目錄讀取,會得到的cd盤内的資料,當你對這個目錄的内容進行編輯,編輯的内容AUFS會自動講修改内容儲存在你union的那個空目錄内,當你再次讀取的時候,AUFS也會将你硬碟中記錄的改動内容優先于CD資料盤中的内容讀取出來,這樣對使用者而言,這就完全是一個可編輯的目錄内容了。——docker要的就是這個效果

  • 想象一下docker的Image,其實也就是一個事先制作好的隻讀的檔案目錄,當我們要使用這個系統功能的時候,docker為我們開辟了一個新的檔案夾和這個image做了union,提供給docker container做為系統運作的存儲;
  • 這個image裡面已經包含了系統程式、工具軟體、以及程式,當系統啟動後産生的運作時檔案(如logs、臨時目錄等)或新安裝的軟體都在這個新的檔案夾内。
  • 這樣我們在啟動一個container的時候,其實并沒有加載鏡像的過程,也不會像虛拟機一樣需要安裝一個系統這麼負責,隻是做了一次unoin,一切就和安裝過系統的虛拟機同樣使用了。
  • 另外docker還提供了一個

    docker commit

    指令,這個指令可以随時将你現在的運作中的cantainer建構成一個新的image。

4.3docker指令補充

檢視目前的container清單

docker ps -a

通過一個image生成一個新的image,包含container中的改動

docker commit container-id

5.docker加速鏡像為阿裡雲

由于衆所周知的原因,使用

docker pull

,指令下載下傳鏡像太慢了,預設是從國外的。

https://help.aliyun.com/document_detail/60743.html?spm=a2c4g.11186623.6.550.764e11be5adPKN

#阿裡雲鏡像服務
https://help.aliyun.com/document_detail/60743.html?spm=a2c4g.11186623.6.550.764e11be5adPKN

#密碼
在阿裡雲容器鏡像服務控制台-預設執行個體-通路憑證取 修改即可

#鏡像加速器可以提升docker官方鏡像的速度
在阿裡雲容器鏡像服務控制台-鏡像中心-鏡像加速器
           

6.docker實戰-萬物皆鏡像

以nginx官方鏡像為例https://hub.docker.com/_/nginx

6.1擷取官方鏡像:docker pull

docker pull nginx

【One by one系列】一步步學習docker(一)

6.2檢視已有鏡像:docker image ls

docker image ls

【One by one系列】一步步學習docker(一)

6.3檢視鏡像詳情:docker image inspect

docker image inspect nginx

6.4運作容器:docker run

一個鏡像可以跑多個容器

docker run --name nginx-test -d -p 8082:80 nginx

nginx-test

容器名稱,獨一無二,不能重複

-d

背景運作

-p

指定端口,宿主端口:容器内部端口

-p 80

随機映射一個主控端端口,通過

docker port nginx-test

-p ip::containerport

容器端口映射主機指定ip動态端口

-p ip:hostport:containerport

-P

暴露所有(容器開發的所有)端口

nginx

鏡像名稱,

nginx:tag

,其中

nginx

預設

nginx:latest

,是簡寫,其他版本,就需要

nginx:版本号

主控端ip:

192.168.1.105

http://192.168.1.105:8082/

【One by one系列】一步步學習docker(一)

6.5檢視運作中的容器:docker container ps

docker container ps
docker  ps
           

6.6檢視所有的容器:docker container ps -a

docker container ps -a
docker  ps -a
           

6.7檢視容器詳情:docker container inspect

docker container inspect nginx-test

6.8進入容器:docker container exec

容器中必須運作有運作的程式,否則docker會把容器程序殺死,nginx是運作,如果隻是一個linux系統的容器,會執行失敗

docker container exec -it nginx-test /bin/bash

【One by one系列】一步步學習docker(一)

來吧,你可以在容器,為所欲為之為所欲為。

6.9退出容器:exit

exit

【One by one系列】一步步學習docker(一)

6.10删除容器

#停止容器
docker stop nginx-test

#删除容器
docker rm nginx-test

#強制删除容器
docker rm -f nginx-test
           

6.11挂載容器檔案

#Mounts節點
docker container inspect nginx-test  
#容器中無Mounts節點,mysql有,nginx沒有

#自主挂載
#1.建立一個檔案
mkdir -p /docker-mount/nginx/conf

#2.檢視容器檔案的路徑
cd /etc/nginx/conf.d/
more default.conf
#沒錯!,檔案路徑/etc/nginx/conf.d/default.conf
#2.把docker的檔案挂載到主控端上
docker cp nginx-test:/etc/nginx/conf.d/default.conf  /docker-mount/nginx/conf

#3.主控端檢視檔案
 more docker-mount/nginx/conf/default.conf
 
 #4.編輯檔案
vim docker-mount/nginx/conf/default.conf
#5.挂載至容器
docker run --name nginx-test -d -p 8080:80 -v docker-mount/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf

           

6.12容器日志

docker logs nginx-test

6.13容器生命周期圖

【One by one系列】一步步學習docker(一)

Docker的四種網絡模式

1.Bridge 橋接模式,docker預設
#配置容器的主機名
docker run --name t1 --network bridge -h [自定義主機名] -it --rm busybox

#自定義DNS
docker run --name t1 --network bridge --dns 114.114 -it --rm busybox

#給host檔案添加一條
docker run --name t1 --network bridge --add-host [hostname]:[ip] -it --rm busybox
           
2.Host

與主控端一模一樣 不需要端口映射

3.None

不使用網絡

4.Container

一個容器共享另外一個容器的network namespace,與host模式差不多,隻是這裡不是使用主控端網絡,而是使用的容器網絡

配置docker0網絡屬性資訊

vim /etc/docker/daemon.json

核心選項為bip,即bridge ip,用于指定docker0橋自身的ip位址;其他選項可以通過此位址計算出

7.生成鏡像

方法一:更新

建立容器

docker run ..

修改容器

為所欲為

commit

docker commit -a="作者" 容器名稱 新鏡像名稱

方法二:dockerfile建構

  • 建構docker鏡像的源碼
  • 文本文檔
  • docker build 自動執行指令行,自動建構docker鏡像
  • 注釋
  • 指令(不區分大小寫),約定大寫,參數小寫
  • 順序執行
  • start
    #FROM 基礎鏡像
    FROM image-name:tag
    LABEL author=carfield
    
    #ADD 可以從網絡上下載下傳
    ADD source-file dest-file
    ADD URL 容器目錄
    
    #COPY 可以不用 與 ADD類似
    COPY 主控端檔案 容器檔案
    #EXPOSE 暴露端口
    EXPOSE 80/tcp
    #ENTRYPOINT 容器内部生效
    ENTRYPOINT ["<executable>","<param1>","<param2>"] 
    
    #ENV 環境變量 key=value
    ENV PATH 
    
    #ARG 同ENV
    
    #RUN 指定docker build過程中運作指令
    RUN <command>
    
    #WORKDIR 工作目錄 執行目錄
    WORKDIR $
    
    #ONBUILD 觸發器:被作為基礎鏡像觸發
    ONBUILD 
    
    #CMD 容器啟動生效
    CMD [""]
               
    • 建構鏡像

      docker build -t image-name:tags .

      .

      目前目錄
    #test
    FROM centos
    
    #鏡像作者 中繼資料标簽
    LABEL author=carfield
    
    #複制檔案到鏡像
    ADD ... ...
    ADD ... ...
    
    #配置環境變量
    ENV DOTNET 路徑
    
    #WORKDIR
    WORKDIR ...
    
    RUN yum -y install vim
    
    VOLUME ["/data1"]
    
    EXPOSE 8080
    
    CMD ls
    
    ENTRYPOINT ....
               

8.釋出鏡像

8.1登入阿裡雲容器鏡像服務

8.2推送至阿裡雲

# 登入docker倉庫
sudo docker login --username=[使用者名] registry.cn-hangzhou.aliyuncs.com
# 建立指定鏡像的tag,歸入某個倉庫
sudo docker tag [鏡像id] registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:[鏡像版本号]
# 鏡像推送至倉庫
sudo docker push registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:[鏡像版本号]
           

8.3拉取鏡像

docker pull registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:v1

參考資料

  • https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html 你必須知道的Dockerfile
  • https://yq.aliyun.com/articles/110806 Docker CE 鏡像源站
  • https://blog.csdn.net/TMDUODUO/article/details/101094677 将docker下載下傳鏡像改為阿裡雲下載下傳鏡像
  • https://www.cnblogs.com/cac2020/p/11359412.html 【Docker學習之二】Docker部署安裝
  • https://yq.aliyun.com/articles/63035 大白話Docker入門(一)
  • https://yq.aliyun.com/articles/63517 大白話Docker入門(二)

作者:Garfield

同步更新至個人部落格:http://www.randyfield.cn/

本文版權歸作者所有,未經許可禁止轉載,否則保留追究法律責任的權利,若有需要請聯系[email protected]

微信公衆号

掃描下方二維碼關注個人微信公衆号,實時擷取更多幹貨

【One by one系列】一步步學習docker(一)

同步更新至:http://www.randyfield.cn/

出處:http://www.cnblogs.com/RandyField/

本文版權歸作者和部落格園共有,未經許可禁止轉載,否則保留追究法律責任的權利,若有需要請聯系[email protected].