Docker基礎、Machine、Compose、Swarm入門與實踐
前言
你是否曾經和我一樣,想了解一個新的中介軟體,如redis、kafka、zookeeper等,發現無論是單點還是叢集搭建過程都異常繁瑣,甚至佔用了一半以上的學習時間?很多中介軟體都是基於linux系統的,但是你卻要在windows上做文章?作為一個後端程式設計師,我只想學習一下中介軟體怎麼使用,卻被這種繁瑣的過程限制住了手腳,抑或是半途而廢?
正所謂,工欲善其事,必先利其器。Docker可以完美的解決我們以上的痛點,而且安裝過程簡單。
本文參照Docker官方文件https://docs.docker.com/,基於windows系統,Linux和Mac系統除了安裝過程不同之外其餘過程均相同。
一、安裝Docker
步驟一
下載安裝DockerToolBox: https://docs.docker.com/toolbox/overview/
步驟二
安裝成功之後會有三個圖示出現,Docker Quickstart基本上不用,常用的是另兩個,開啟VM更新到最新版本(因為舊版本開啟Kitematic的時候容易卡死)
步驟三
開啟Kitematic軟體,點選hello-world-nginx的CREATE按鈕,建立一個容器,如果能正常跑起來就證明安裝成功了。
二、Docker Machine
經過上面過程我們已經在Windows裡面成功安裝了docker環境,但本質上Kitematic軟體底層利用的是VirtualBox虛擬機器和DockerMachine,那麼什麼是Docker Machine?
1、Docker Machine概念
Docker Machine就是建立Docker環境的機器,簡單說就是有了Docker Machine就可以在任何系統任何平臺上快速的搭建Docker環境了。
2、利用Docker Machine快速建立Docker環境
建立Docker虛擬機器
開啟cmd視窗,執行命令 docker-machine create --driver=virtualbox machine1
該命令以virtualbox為介質快速建立一個包含有docker環境的虛擬機器。命令執行完成之後開啟virtualbox介面如下:
可以看到machine1正在執行,雙擊進入該虛擬機器可以執行docker的所有命令。
你可以利用上面的命令繼續建立多個含有Docker Engine的多個虛擬機器
進入Docker虛擬機器
開啟cmd視窗,執行命令 docker-machine ssh machine1
該命令可以通過cmd視窗進入到machine1環境,因為virtualbox的複製貼上操作沒有cmd視窗那麼便捷,所以我一般複製命令的時候都使用cmd視窗ssh進入
其他Docker machine命令
docker-machine start/stop 可以刪除容器關閉和不刪除容器關閉虛擬機器
更多命令請參考 https://docs.docker.com/machine/reference/
三、Docker Compose
1、Dcoker Compose概念
Docker Compose可以有組織的啟動同屬於一個服務的多個容器
換句話說 當一個服務包含多個容器的時候,docker compose可以通過yaml檔案預先配置,然後統一啟動
2、Docker Compose安裝
三步走:進入machine1、切換root使用者、安裝及更改compose許可權
1.21.1為版本,可以到https://github.com/docker/compose/releases去檢視可更換的compose版本
sudo -i
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-uname -s
-uname -m
-o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
3、Compose的使用
以三節點的zookeeper偽叢集為例,最重要的就是yaml檔案,這個是構建服務的藍圖
首先:隨便在哪個目錄下建立一個docker-compose.yml檔案(注意名稱必須為docker-compose),內容如下
然後:進入docker-compose.yml目錄,執行docker-compose up -d (-d表示後臺執行)結果如圖
version: '3.1'
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
image: zookeeper
restart: always
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
zoo3:
image: zookeeper
restart: always
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
再次:檢查zookeeper偽叢集是否安裝成功,使用docker ps 檢視正在執行的容器,記下ID
然後:通過docker exec -it id /bin/bash進入zookeeper下,進入bin目錄,執行zkCli.sh就可以執行zookeeper命令了!
就這樣偽叢集瞬間搭建好,跟誰說理去?
4、yml模板說明:
-
version對應compose和Engine版本
- services對應多個容器
- zoo1/2/3為容器名稱
- image表示基於的映象為zookeeper
- environment表示環境變數
- ports前面的埠號表示容器宿主機的埠號,後面的埠號表示容器的埠號
- 其他顧名思義
4、Compose yml其他語法
https://docs.docker.com/compose/compose-file/
四、Docker Swarm
上面兩位劍客完成了Docker環境搭建和容器的編排工作,swarm則用來完成多臺機器(可物理可虛擬)之間容器叢集的管理,Swarm是docker自帶的一種模式,內嵌到docker裡,不用額外安裝。
1、Swarm中的重要概念
- 節點:NODE,一個節點本質上是一個包含Docker Engine環境的機器,可以是物理機也可以是虛擬機器,我們這裡可以是自己構建的docker machine。Node分為兩種,一種為leader,一種為worker,前者負責分派工作,後者負責執行工作,同一個NODE可以同時有兩種角色。
- 服務:Service,執行在節點上包含一個或者多個task的綜合體,每個task都由一個容器和容器內部執行的一些命令共同代表。
-
負載均衡:使用內部負載均衡,訪問任何節點埠都會通過負載均衡找到服務,即便當前node沒有服務
2、快速搭建一個Swarm叢集
步驟一:
開啟cmd視窗,使用docker-machine create xxx 建立一個manager環境和兩個worker環境,建立完成可以開啟virtualbox檢視
步驟二:
在manager節點即圖中的machine1節點內,執行命令
docker swarm init --advertise-addr 192.168.99.101 注意後邊的IP為當前機器的IP可以通過cmd視窗的docker-machine ip machine1檢視。--advertise-addr表示設定mannager
$ docker swarm init --advertise-addr 192.168.99.101
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
172.17.0.2:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
步驟三:
上一步中其實已經給出了加入swarm的命令了,如果沒記住可以在mananger節點執行docker swarm join-token worker 命令檢視
docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.99.101:2377
執行完上述命令後會有成功的提示
在Manager節點執行docker node ls可以檢視當前節點
步驟四:
至此Docker swarm叢集搭建完成,該叢集包含三個節點,一個Manager和兩個worker,Manager本質上也是一個worker,都可以執行任務。
3、在Swarm上操作服務
- 釋出:
隨便在哪個節點上執行命令
docker service create
--replicas 3
--name redis
--update-delay 10s
redis:3.0.6
就可以釋出一個3.0.6版本的Redis了,replicas表示有三個副本,update-delay表示當升級的時候,一個節點升級成功之後的10秒後才升級另一個節點 - 升級:
docker service update --image redis:3.0.7 redis
這個過程是滾動的,即一個接一個升級 - 檢視:
docker service inspect --pretty redis
或者docker service ps redis - 刪除:
docker service rm redis - 停止/重啟節點:
docker node update --availability drain worker1
該命令停止了節點worker1,停止之後不接受新的請求,不接受manager分派
docker node update --availability active worker1
該命令重啟了節點,使其恢復active狀態 - 指定埠:
docker service create
--name my-web
--publish published=8080,target=80
--replicas 2
nginx
該命令指定了訪問埠為8080,對映docker80埠,可以通過任何節點訪問到如192.168.99.101:8080
4、Swarm && Compose
上面Swarm釋出的Service都是單個容器的,多個容器如何操作呢?首先我們會聯想到Compose,但是Comopse舊版本只支援在單個Host上釋出,在叢集裡就需要Compose新版本了!先保證Compose是v3以上吧!
去這個網址https://github.com/docker/compose/releases/檢視compose版本和compose yml版本的對應關係
Swarm釋出Compose編排的Service過程:
步驟一:
編排docker-compose.yml模板檔案,此處命名可以隨便起,與Compose不同
下面的yml檔案來自官方https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md
- version必須是3及以上
- 該服務包含redis、db、vote服務(投票功能)、result服務(統計結果)等等
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
步驟二:
執行命令 docker stack deploy --compose-file docker-compose.yml vote 啟動基於yml檔案的名稱為vote的服務
注意docker stack不支援build,需要事先指定映象
步驟三:
這樣多個容器就以服務的形式釋出到叢集裡面了!通過192.168.99.101:5000訪問即可看到頁面!
docker stack services vote:可以檢視服務狀態
docker stack rm vote:可以刪除服務
Docker-Compose所有命令引數可以參考:https://docs.docker.com/compose/compose-file/
五、Docker基礎
docker主要由倉庫、映象、容器三個概念組成!下圖中顯示了三者之間的關係
- 把映象理解為軟體安裝包
- 把容器理解為使用的軟體
- 把倉庫理解為安裝包下載網站
一:對於映象:
1:增加映象:
A:從倉庫下載:docker pull NAME:TAG
A1:例子:docker pull ubuntu:latest
A2:例子:docker pull ubuntu 同上
A3:例子:docker pull ubuntu:14.04
B:建立映象:
B1:基於已有映象的容器建立:docker commit已經修改過的容器,如docker容器裡建立了檔案的映象
B11:docker commit -m “訊息” -a “作者資訊” a925948cb23d(容器ID) test:0.1(標籤)
B2:基於本地模板匯入
B3:基於Dockerfile建立
C:存出映象:docker save -o xxx.tar xxx:latest即可儲存成tar檔案
D:載入映象:docker load < xxx.tar即可載入tar檔案
2:刪除映象:
A:刪除映象:docker rmi image image可以為標籤也可以為id
A1:-f強行刪除
3:修改映象:
A:給映象打標籤:docker tag ubuntu:latest myubuntu:latest
4:檢視映象:
A:列出映象:docker images
A1:-a列出所有的映象檔案
A2:-q僅輸出ID資訊
B:詳細資訊:docker inspect ubuntu:latest
C:檢視歷史:docker history ubuntu:latest
5:搜尋映象:
A:搜尋映象:docker search -s 3 —automated ubuntu 搜尋3星以上自動建立的ubutnu映象
6:上傳映象:
A:先加標籤:docker tag xxx:14.04 user/test:latest
再往上推:docker push user/test:latest
B:上傳到docker hub裡面,跟git很類似
7:Dockerfile詳解:
構建:
Kind1:在dockerfile所在目錄執行:docker build -t nginx:v3 .
Kind2: 直接用gitRepo構建:docker build git路徑:版本
解釋:BS架構,dockerfile所在目錄應該為空目錄,所有需要複製或者新增的檔案都應該複製到該目錄下,這個路徑是一個上下文Context,構建過程中會把上下文傳送給Docker引擎
A:FROM命令:以什麼為基礎,可以是已經存在的映象,也可以是虛擬映象scratch
B:RUN命令:與直接在容器內命令列中輸入的命令一樣的效果,為了減少層數,可以使用\和&&結合的方式,換行並繼續的意思
C:COPY命令:COPY package.json /usr/src/app,前者為上下文中的路徑,後者可以為絕對路徑,也可以為WORKDIR目錄的相對路徑
D:ADD命令:與COPY一至,源路徑可以為url,可以為tar檔案,只在自動解壓縮的場合使用ADD,其餘一律用RUN
E:CMD命令:制定容器啟動時所要執行的命令,只能執行一次,多次會覆蓋,CMD 【“可執行程式”,“param1”,“parma2”】
F:ENTRYPOINT命令:格式與RUN相同,給容器配置一個可執行程式格式與CMD相同,docker run指令不會覆蓋ENTRYPOINT命令而會覆蓋CMD命令,比如-i
G:ENV命令:設dockerfile的環境變數 ENV key value,之後的命令可以使用ENV定義的環境變數,容器內也可以使用
H:VOLUME命令:VOLUME /data,匿名卷容器內的/data對映入主機了
I:EXPOSE命令:宣告埠 EXPOSE 80 8080
J:WORKDIR:指定工作目錄,或者成為當前目錄,如果目錄不存在WORKDIR會幫你建立
K:USER命令:制定當前使用者
二:對於容器:
1:建立容器:
A:建立容器:docker create -it ubuntu:latest
保持標準輸入開啟:-i
後臺執行容器:-d
分配一個偽終端:-t
B:建立並啟動容器:docker run ubuntu /bin/bash
2:刪除容器:
A:docker rm命令刪除:
B:刪除所有:sudo docker rm $(docker ps -a -q)
3:停止容器:
A:優雅的停止:docker stop dockerID
B:直接殺死:docker kill id
4:檢視容器:docker ps
A:獲取容器輸出資訊:docker logs id
5:進入容器:
A:exec命令:docker exec -it dockerID /bin/bash
B:nsenter工具:可以去查
6:容器互聯:
A:docker run -d -P —name dockerName1 --link dockerName2:dockerName2Alias ubuntu:14.04
B:
7:啟動容器:
A:docker start af(容器ID)
B:重啟:docker restart id
C:啟動容器會自動在映象層外掛載一層可讀寫層
D:直接從映象啟動容器:docker run -i -t -d -p 8080:8080 --name myname ubuntu:latest
8:匯入匯出容器:
A:匯出容器:docker export -o xxx.tar dockerID
B:匯入容器:docker import xxx.tar - dockerName
三:對於倉庫:
1:建立私有倉庫:
A:建立本地/tmp/registry 位置的倉庫 docker run -d -p 5000:5000 registry
B:建立制定路徑倉庫 docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
2:從國內映象下載映象:
A:從時速雲下載映象:docker pull index.tenxcloud.com/docker_library/映象:標籤
四:對於資料:
1:資料卷:
A:容器內資料直接對映到本地主機環境
B:資料卷可以被多個容器共享和重用
C:對資料卷修改立馬生效,並且更新資料卷不影響映象
D:資料卷會一直存在,直到沒有容器使用才可以安全解除安裝
E:掛載資料捲到容器內目錄的兩種方法:
E1:docker run -d -P --name web -v /webapp ubuntu:14.04 把容器的webapp目錄對映到主機上
E2:掛載指定目錄到容器:docker run -d -P --name web -v /src/webapp(主機目錄):/opt/webapp(容器內目錄):ro ubuntu:14.04 加上:ro後容器對鎖掛在的資料卷內資料就無法修改了
E3:可以掛載單個檔案到容器內目錄作為資料卷,不推薦
F:刪除資料卷:docker rm -v
2:資料卷容器:
A:使用特定容器維護資料卷
B:操作流程:
B1:建立資料卷容器:docker run -v /dbdata —name dbdata ubuntu
B2:在其他容器使用—volumes-from dbdata即可掛載改容器,可以寄連掛在,也可以掛載多個資料卷容器
總結:
本篇部落格涵蓋了Docker自家的所有內容,從Docker基礎到Docker三劍客都有解析,可以作為入門指導。
有了docker之後我們就可以隨便的安裝那些安裝過程複雜的軟體了,如果你看懂了,請給我一點鼓勵哦!
相關文章
- Docker 入門與實踐Docker
- Docker Compose 快速入門Docker
- Docker-Compose基礎Docker
- Docker Swarm 叢集搭建實踐DockerSwarm
- Docker入門實踐Docker
- Docker | 入門 & 基礎操作Docker
- Docker入門實踐(三)Docker
- Docker入門實踐(四)Docker
- Docker Compose 實踐及梳理Docker
- Docker從入門到精通(八)——Docker ComposeDocker
- 【docker】Docker入門到實踐 筆記Docker筆記
- 最火的容器技術|Docker入門與實踐Docker
- Spring Boot Docker入門模板與4個最佳實踐Spring BootDocker
- Kafka 入門與實踐Kafka
- TypeScript入門與實踐TypeScript
- locsut 入門與實踐
- 容器技術之Docker基礎入門Docker
- Docker從入門到動手實踐Docker
- docker和docker compose安裝使用、入門進階案例Docker
- LLM 鏈式架構基礎:從入門到實踐架構
- 函數語言程式設計入門實踐 —— Compose/Pipe函數程式設計
- GitOps快速入門與實踐Git
- Docker極簡入門:使用Docker-Compose 搭建redis叢集DockerRedis
- 這是一次 docker 入門實踐Docker
- docker使用經驗總結(三、Docker compose基礎應用)Docker
- NGINX 入門到企業級應用實踐-基礎篇Nginx
- 【Docker】 SwarmDockerSwarm
- Docker容器基礎入門認知-網路篇Docker
- 官方零基礎入門 Jetpack Compose 的中文課程來啦!Jetpack
- 聯調環境快速部署——基於docker-compose的CI/CD實踐Docker
- .Net Core微服務入門全紀錄(八)——Docker Compose與容器網路微服務Docker
- Git與Github入門實踐(上)Github
- 手摸手帶你 Docker 從入門到實踐Docker
- ROS基礎入門——實操教程ROS
- Git 和 GitHub:從入門到實踐2 Git 和 GitHub 基礎配置Github
- Redis從入門到高可用,分散式實踐(1)- 基礎介紹Redis分散式
- 微信小程式入門與實踐微信小程式
- Docker Swarm modeDockerSwarm