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 \
    //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”: [
“//hub-mirror.c.163.com”,
“//docker.mirrors.ustc.edu.cn”,
“//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 //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-net02 –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 —-完結————————(>_<)

 

Tags: