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-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 —-完結————————(>_<)