1. 程式人生 > 其它 >Doker從0-1

Doker從0-1

1、docker思想:

它是一種集裝箱的思想,,在以前我們部署一個專案上線的時候,我們要部署各種各樣的環境、配置、依賴等,各種各樣的環境的配置是十分麻煩的,所以就有了docker。他就是將我們的專案和環境配置一起打包,然後發給部署人員進行部署。將每一個專案都打包成一個獨立的包,包與包之間又是隔離的,我們只需要將我們的包釋出,別人就可以直接拿上我們的包去執行,就能很快速的將專案部署起來。我們將打號的包叫映象。就像一個箱子一樣把他們裝在一起。docker思想也是虛擬機器的思想,不過與虛擬機器有些許的差異。docker是容器化技術,不完全是虛擬機器技術。

2、虛擬機器技術與docker容器化技術:

虛擬機器技術:虛擬出完整的作業系統,包括硬體介面驅動核心等。佔用的資源多,冗餘的步驟多,啟動慢。

容器化技術:不是完全模擬一個完整的作業系統。他是直接執行仔宿主機的核心上,容器是沒有核心的。每個容器都是相互隔離的,互不影響,並且每個容器都有自己的檔案系統。

3、docker的組成:

客戶端:操作docker

伺服器端:docker

倉庫:存放映象的地方

基本執行方式:先去倉庫拉去映象,然後仔docker的伺服器端執行映象,執行起來的映象叫做容器

映象就是我們打包好的想的專案,執行起來後我們也可以在裡面放上自己的東西,還能做成我們自己的映象。他就像一個模板,我們呢可以通過一個映象執行多個容器,每個容器的是互不干擾的。

4、安裝docker:

解除安裝老版本:
sudo yum remove docker \
docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
安裝依賴
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
設定源
$ sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安裝docker
$ sudo yum install docker-ce docker-ce-cli containerd.io

#啟動docker
$ sudo systemctl start docker
配置映象源
建立或修改 /etc/docker/daemon.json 檔案,修改為如下形式

{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}

docker啟動映象的流程:

docker底層原理:

docker是一個C/S結構的系統設計,他通過守護程序的方式執行在主機上,通過socket從客戶端訪問,docker-server接收docker-client的命令,然後執行命令。

5、docker常用命令和映象命令:

docker version  :檢視docker的版本資訊

docker info  :檢視docker的詳細的資訊

docker 命令 --help  :檢視該命令的幫助手冊

映象命令:

docker images  :檢視我們本地所有的映象

docker images -aq  :檢視我們所有映象的ID號

docker search 映象名  :搜尋映象(共有倉庫搜尋)

docker pull 映象名  :從遠端倉庫拉取映象到本地

docker rmi 映象名/id  :刪除映象

6、docker容器的命令:

docker  run  引數  映象名/id /bin/bash :建立一個容器並啟動他 // 引數:--name(給容器起一個名字),-d(後臺方式執行),-it(互動式執行並進入容器),-p(指定埠號:埠對映)

exit  退出容器

docker  ps  -a  :檢視執行及曾執行的容器

docker  rm  容器名/id  :刪除容器(無法刪除執行中的容器,加-f選項可以強制刪除)

 docker  start  容器名/id  :啟動一個容器

 docker  restart  容器名/id  :重啟一個容器

 docker  stop  容器名/id  :停止一個容器

docker  kill  容器名/id  :強制停止

docker  logs  -ft  容器名/id  :檢視容器的日誌

docker  top  容器名/id  :檢視容器內的程序資訊

docker  inspect  容器名/id  :檢視容器的詳細資訊詳情

docker  exec  -it  容器名/id  /bin/bash  :進入到正在執行中的容器

docker  cp  容器名/id:容器內的檔案地址 主機檔案地址  :將容器內的檔案拷貝到外面的主機上

docker  cp   主機檔案地址  容器名/id:容器內的檔案地址  :將主機上的檔案拷貝到容器內

7、使用docker安裝一個Nginx:

docker  pull  nginx  :拉取nginx映象,預設拉取最新版本,可在後面加版本號:版本號拉取其他的版本

docker  run  -it  --name  nginx_01  -p 8888:80  nginx  :使用nginx映象開啟一個名叫nginx_01的容器,容器內部80埠對映到外部的8888埠。

8、映象的原理:

他是一種聯合檔案系統,聯合問價系統是一種輕量級,分層並具有高效能的檔案系統,支援對檔案系統的修改以及層級的疊加。所以映象就是一個聯合檔案系統。不同的映象如果具有相同的層級部分,那麼他們是可以共享的,這就極大的節省的空間。所有的映象都是層級的疊加,每新增一個映象就在聯合檔案系統上新增一層。

注意:docker的映象都是隻讀的,也就是說源映象層我們是無法改變的,但是當映象啟動的時候,一個新的可寫層被新增到映象的頂部,然後我們在可寫層新增我們的東西,可以重新打包成一個新的映象。

打包一個自己的映象:docker  commit  -m=‘‘映象的描述資訊’’  -a=‘’作者‘’  容器名/id(原來的)  作者名/容器名(新的映象):版本號

我們可以通這種方式來儲存當前容器的狀態,可以當作快照功能來用。

9、容器的資料卷

當我們的服務在容中跑起來的時候,會產生一些資料(如mysql),但是當我們刪除容器的時候我們的資料就會同步的刪除,所有我們要做容器與資料分離的操作。docker用到的就是資料卷技術,資料卷技術本質就是掛載,將容器中的目錄掛載到物理機上,從而達到一種資料的同步,即使我們的容器被刪了,但是我們在物理機上的資料還存在的。保證資料的永續性。一旦做了資料卷掛載,那麼資料的操作就是雙向的,也就是外面對資料修改也會同步到容器內,而且處於未執行的容器資料也會同步(也就是隻要容器還在資料就會同步)。

使用資料卷:docker  run  -it  -v  掛載的主機的目錄:容器內部的目錄  :將容器內部該目錄下的所有資料同步到主機的該目錄下。(通過-v引數)

說明:資料卷掛載有三種方式:

1)、指定目錄掛載:-v  掛載的主機的目錄:容器內部的目錄  :掛載到該目錄下

2)、匿名掛載:-v  容器內部地址  :隨機生成一個掛載目錄名(掛載與/var/lib/docker/volumes/隨機掛載名字/_data)將資料掛載到這裡

3)、具名掛載:-v  掛載名  :(掛載與/var/lib/docker/volumes/掛載名/_data)將資料掛載到這裡

特別:-v  掛載的主機的目錄:容器內部的目錄:ro或者rw  :表示只可讀或者可讀可寫(表示許可權)

10、容器間的資料卷:

容器可以與主機進行資料共享同步,那麼容器之間如何資料共享?可以通過資料拷貝的方式來實現我們容器之間的資料共享。如:

docker  run  -d  -v  內路徑  --name  容器1   映象名  /bin/bash

docker  run  -d  -v  內路徑  --name  容器2  --volumes-from  容器1      映象名  /bin/bash

容器1為輻容器,容器2為子容器,將容器2掛載到容器1上去,就實現了容器間的資料共享。(關鍵字:--volumes-from)

11、Dockerfile:

Dockerfile:構建映象的檔案(相當於構建映象的原始碼),我們通過Dockerfile構建自己的映象。檔案裡面是一些命令引數的指令碼。

構建映象的步驟:編寫Dockerfile檔案;通過docker build命令執行Dockerfile檔案形成一個映象;docker run我們生成的映象;可以通過docker pull釋出我們自己的映象。

Dockerfile語法要點:

所有的關鍵字(指令)都必須要大寫;從上到下一次執行;#為註釋;每個指令都會建立一個新的層並提交。

Dockerfile的指令:

FROM  :指定基礎映象,一切從這裡開始(就是在該基礎映象上構建映象)

MAINTAINER  :映象的作者

RUN  :構建映象的時候映象執行的指令,如:RUN  yum  -y install  vim  (構建映象的時候就會去給我們安裝vim,我們的映象中就會有vim工具)

ADD  :往映象裡面新增東西,如:ADD /test1.txt /home/test1.txt.bak(構建映象時將/text檔案copy到/home/test.txt.bat)

WORKDIR  :映象的工作目錄

VLOUME  :在主機上掛載的卷位置

EXPOSE  :映象啟動預設暴露的埠,沒有設定則啟動時通過-p引數設定

CMD  :指定容器啟動時執行的命令(預設只要最後一個有效)切不可追加命令

ENTRYPOINT  :指定容器啟動時執行的命令,不可追加命令

COPY  :類似於ADD

ENV  :構建映象時設定環境變數

Dockerfile例子:

FROM ${base_img}

FROM ${base_img}
 
RUN mkdir -p /etcd /opt/etcd/data; \
    chown -R csmp.csmp /opt/etcd; \
    curl -sL http://10.47.0.26/${arch}/etcd-v3.5.1-linux-${arch}.tar.gz -o /etcd/etcd.tgz; \
    tar --strip=1 -C /etcd -xzvf /etcd/etcd.tgz;\
    cp /etcd/etcd    /usr/local/bin/; \
    cp /etcd/etcdctl /usr/local/bin/; \
    cp /etcd/etcdutl /usr/local/bin/; \
    /usr/local/bin/etcd --version; \
    /usr/local/bin/etcdctl version; \
    rm -rf /etcd/etcd.tgz /etcd
 
COPY files/etcd.yaml   /opt/etcd/etcd.yaml
 
ENV ETCD_DATA_DIR=/opt/etcd/data
 
EXPOSE 2379 2380
 
USER csmp
WORKDIR /opt/etcd
CMD “----end----”

編寫好我們的Dockerfile檔案時,可以通過docker  build  -f   Dockerfile檔案的路徑   -t    生成的映象名      :來生成我們的映象

我們可以通過docker  history  映象名/id  :來檢視我們的構建映象的步驟(和我們寫的Dockerfile裡面的步驟一樣)

12、docker的網路

每當執行一個容器的時候,docker會給這個容器分配一個IP地址,物理機可以通過docker作為跳板與容器通訊。特別:容器與docker或者與其他容器之間通訊時通過雙網絡卡實現的,也就是說容器的網絡卡是成對出現的,成對出現的網絡卡技術叫evth-pair技術,一段連著協議,一段連著彼此。從而達到通訊的功能。所有所有的容器都是都可以與docker通訊,而容器間又是通過docker做為中間橋樑來做資料轉發通訊的(此時docker相當於路由器)。

docker是與物理機直接相連的(通過橋接模式),docker的預設網絡卡是docker0,如果不指定容器的網路,那麼docker容器就會預設連線docker0網路(通過evth-piar技術)。

docker0網路所具有的問題(docker的預設網路):不支援一容器名來通訊,只能通過容器的IP地址來通訊。(可以在啟動是加--link  容器名)來解決這個問題,原理:就是在host檔案中新增ip地址到容器名的對映。弊端:需要兩個容器都要新增才能互相以容器名來通訊,雖然可以解決但是過於笨重。這就是docker預設網路的問題。

解決docker網路的不足:(自定義網路)

我們可以通過自定義網路啦解決容器間不能以容器名來通問題。docker  network  ls  :檢視所有docker網路命令

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet  :通過橋接模式建立一個網路名叫mynet,網段為92.168.0.0/16,閘道器為--gateway 192.168.0.1 。以後每加入一個容器在這個網路中,就給他分配一個該網路的IP地址。

將一個容器加入到該網路:docker run -d -P --name tomcat-net-02 --net mynet lengcz/tomcat:1.0  :(關鍵字:--net mynet)

我們自定義的網路就可以以容器名來進行通訊了。

注意:兩個自定義網路中的容器如何通訊?  由於兩個自定義的網路不是同一個網段,無法通訊。解決:就是將mynet1中的容器加入到mynet2中,這是mynet2會給這個容器分配一個自己網路的IP地址,這是這個容器既有了mynet1中的IP地址又有了mynet2中的IP地址(雙IP),所有就實現了容器間的跨網路通訊。

命令:docker  network  connect  mynet2網路   mynet1中的容器名    :將mynet1中的噶容器加入到mynet2的網路中。

--------------------------以上為docker的基礎部分-----------------------------

--------------------------下面是docker的進階部分-----------------------------

Docker  compose和Docker  Swarm

1、docker  compose:

 docker compose是一個用來管理容器的工具,可以一鍵啟停容器:比如有一百個容器需要啟動或者關閉,那麼我們原始的方法是手動的執行100次docker  run命令,但是我們使用docker   compose工具就能啟動著一百個容器。對容器的管理是非常的方便。

他是通過一個執行YAML檔案來統一管理容器的。所以說YMAL檔案時docker  compose的一個核心。

下載docker  compose:下載下來他是一個檔案,把他放一個目錄裡面,然後給他賦許可權(可讀可寫可執行),然後把他加到環境變數中。就可以使用docker  compose命令了。使用docker  compose  -v 檢視他的版本資訊。

YMAL檔案編寫規則:可以將他的結構概括有三層,第一層是版本號(所有版本號都向下相容),第二層是服務層(所有的服務和服務的配置都在這一層),第三層是其他配置(像一些網路、卷等配置)

如:

第一層:version:’版本號‘

第二層:services:

      服務1:web

         web服務的配置

      服務1:redis

         redis服務的配置

      。。。。

第三層:volumes:

    networks:

    。。。。

說明:服務的配置裡面,docker的所有的命令都可以在這裡面執行

案例:使用docker  compose部署一個開源的部落格系統(workpress):

1)建立一個目錄:mkdir  workpress

2)進入該目錄

3)編寫YAML檔案:vim workpress.yml(該檔案一定是yml為字尾)

4)將docker官網的這個yml檔案拷下來:

version: '3.7'
services:
 db:
   image: mysql:8.0.19
   command: '--default-authentication-plugin=mysql_native_password'
   restart: always
   volumes:
     - db_data:/var/lib/mysql
   environment:
     - MYSQL_ROOT_PASSWORD=somewordpress
     - MYSQL_DATABASE=wordpress
     - MYSQL_USER=wordpress
     - MYSQL_PASSWORD=wordpress
 wordpress:
   image: wordpress:latest
   ports:
     - 80:80
   restart: always
   environment:
     - WORDPRESS_DB_HOST=db
     - WORDPRESS_DB_USER=wordpress
     - WORDPRESS_DB_PASSWORD=wordpress
     - WORDPRESS_DB_NAME=wordpress
volumes:
 db_data:

5)通過docker  compose  up  -d 執行yml檔案就OK了

總結:這裡我們部署了一個部落格系統,裡面有mysql和一個wordpress映象,執行的時候它會自動的給我們拉取映象爬起來,就不要我們自己去一個一個run。簡單快捷。

2、Docker  Swarm(docker叢集)

docker swarm是一個docker叢集。就是可以讓多個docker在一個叢集裡面。docker swarm叢集有兩部分,一部分是管理結點(Manager)一部分是工作結點(Worker),管理結點又可以工作,但是工作結點不具有管理結點的功能,

Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排專案,但不同的是,Docker Compose 是一個在單個伺服器或主機上建立多個容器的工具,而 Docker Swarm 則可以在多個伺服器或主機上建立容器叢集服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。

Swarm deamon只是一個排程器(Scheduler)加路由器(router),Swarm自己不執行容器,它只是接受Docker客戶端發來的請求,排程適合的節點來執行容器,這就意味著,即使Swarm由於某些原因掛掉了,叢集中的節點也會照常執行,放Swarm重新恢復執行之後,他會收集重建叢集資訊。
操作:

1)初始化一個swarm叢集:docker  swarm    init   --advertise-addr   該伺服器的地址  :此時就開啟了一個swarm叢集,該叢集中現在就只有一個docker結點(預設為manager)。

2)使用該結點生成worktoken或者managertoken:用來給別的docker加入該叢集的鑰匙:docker  swarm  jion-token   worker或者manager  :生成token。

3)將生成的token複製到其他的docker上執行就OK了,此時這個docker結點也加入到了這個叢集了。

特別:swarm叢集為了保證該可用性,所有要保證大多數的manager的存活。為了保證一致性和高可用性,swarm使用了Raft一致性演算法。

重要:swarm的一個特性,可以動態的擴縮容,也就是說可以按照需求動態的執行伺服器,需求大就在docker叢集中多執行幾個相應的伺服器。

在單個伺服器上開啟服務使用命令:docker   run  。。。。

1)在叢集中開啟服務(在manager結點上):docker    service  。。。

如:docker   service    create   -p   8888:80   --name   mynginx   nginx  :表示在這個叢集中開啟了一個服務。

他是不一定執行在當前的manager結點上,可能在其他的docker結點上執行這個服務(隨機的執行某個結點上)。

2)通過docker   service    ps   myngingx     :檢視啟動的服務的狀態資訊

通過docker    service    ls      :可以檢視服務的副本數量等資訊

3)動態擴容,使用:docker    service    update   --replicas   3    mynginx     :就是將該叢集中執行的mynginx服務由原來的1個變成現在的3個(也就是說現在這個叢集中由三個一摸一樣的mynginx服務在執行)。而且這些執行的服務都是一樣的,無論訪問哪一個都是一樣,哪怕這個服務沒有在某個結點上執行,用這個伺服器的IP訪問這個服務,一樣可以訪問到,只要這個結點在這個叢集裡面就行。

--------------------docker ----完結------------------------(>_<)