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


Docker

Build,Ship and Anywhere

1.基本概念

  • 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)啟動,在鏡像的基礎上運行程序。可以理解為容器提供了硬件環境,然后使用了鏡像這些制作好的系統盤,再加上項目程序,跑起來就可以提供服務。

img

理解上圖:搭載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

  • 問題:

解決方案

yum clean all

yum install docker-ce

3.docker基本操作

查看版本

docker version

查看鏡像

docker images

docker image ls

查看容器

docker ps

拉取鏡像

docker pull image-name

鏡像放到容器中跑

docker run image-name

查看容器運行情況

docker ps -a

docker container ps

docker container ps -a

4.docker原理

4.1docker優勢

  • docker image的體積小,ubuntu-100M+,小就意味着傳輸與分享方便

  • docker run 啟動的耗時為0.

  • docker 占用資源少

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

4.2原理

4.2.1虛擬機 vs Docker容器

img

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成一個新的目錄,並且可以對這個新的目錄進行讀寫操作。

​ 如果你有一張只讀的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

6.2查看已有鏡像:docker image ls

docker image ls

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/

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

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

6.9退出容器:exit

exit

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容器生命周期圖

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

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM