一、軟件部署的發(fā)展
1.1 直接部署
在物理服務(wù)器上直接安裝系統(tǒng),部署應(yīng)用
缺點(diǎn)
- 部署慢
- 成本高
- 資源浪費(fèi)
- 可移植性、擴(kuò)展性差
1.2 虛擬機(jī)部署
在主機(jī)上部署虛擬機(jī),在虛擬機(jī)中部署應(yīng)用或颊。
虛擬機(jī)架構(gòu)(從下到上)
- 服務(wù)器:可以是PC、服務(wù)器、云主機(jī)
- 主操作系統(tǒng):例如windows、linux痘昌、macos
- 虛擬機(jī)管理系統(tǒng):允許多個(gè)操作系統(tǒng)和應(yīng)用共享一套基礎(chǔ)物理硬件
- 從操作系統(tǒng):虛擬機(jī)
- 各種依賴:每個(gè)從操作系統(tǒng)都需要按照許多依賴
- 應(yīng)用
優(yōu)點(diǎn)
- 資源池:一個(gè)物理機(jī)可運(yùn)行多個(gè)虛擬機(jī)钥勋,資源也能充分分配
- 易擴(kuò)展:方便添加物理主機(jī)或虛擬機(jī)
缺點(diǎn)
- 資源占用多:虛擬機(jī)很耗費(fèi)資源炬转,因?yàn)樘摂M機(jī)有完整的操作系統(tǒng)
- 冗余步驟多:虛擬機(jī)有完整的操作系統(tǒng)
- 啟動(dòng)慢:?jiǎn)?dòng)操作系統(tǒng)要多久,啟動(dòng)虛擬機(jī)就要多久
1.3 容器化部署
什么是容器
- 對(duì)應(yīng)用軟件和其依賴的包進(jìn)行標(biāo)準(zhǔn)化打包
- 應(yīng)用之間相互隔離
- 共享OSKernel
- 可以運(yùn)行在多種主流OS上
- 標(biāo)準(zhǔn)化軟件單元
容器 | 虛擬機(jī) |
---|---|
應(yīng)用程序?qū)拥某橄笏憔模瑢⒋a和依賴項(xiàng)一起打包 | 物理硬件的抽象 |
多個(gè)容器共享OS內(nèi)核 | 需要啟動(dòng)單獨(dú)的VMOS |
僅有一個(gè)物理機(jī)的OS扼劈,共享資源 | 多個(gè)OS,獨(dú)享資源 |
可運(yùn)行數(shù)百個(gè)容器 | 最多幾十個(gè)VM |
輕量 | 包含OS菲驴、二進(jìn)制文件荐吵,最少幾個(gè)GB |
啟動(dòng)快(秒級(jí)) | 啟動(dòng)慢 |
啟動(dòng)應(yīng)用程序更多,消耗資源更少 | |
每個(gè)容器在用戶空間中進(jìn)程隔離 |
二、Docker
- Docker是一個(gè)開(kāi)源的應(yīng)用容器引擎
- 可以將應(yīng)用和依賴包打包到一個(gè)輕量級(jí)先煎、可移植的容器中
- 使用沙箱機(jī)制贼涩,容器相互間沒(méi)有接口
- 容器性能開(kāi)銷低
2.1 使用Docker進(jìn)行部署
- 服務(wù)器
- 主操作系統(tǒng)
- Docker引擎:Docker引擎替代了Hypervisor,是運(yùn)行在操作系統(tǒng)之上的后臺(tái)進(jìn)程薯蝎,負(fù)責(zé)運(yùn)行和管理容器
- 各種依賴:Docker應(yīng)用的所有依賴都打包在Docker鏡像中
- 應(yīng)用:應(yīng)用的源代碼與其依賴都打包在Docker鏡像中遥倦。不同應(yīng)用運(yùn)行在不同的容器中,互相隔離
2.2 Docker架構(gòu)
Docker使用C/S架構(gòu)占锯。用戶在客戶端輸入docker命令袒哥,客戶端將命令發(fā)送到docker daemon,完成docker的各種操作消略。
2.2.1 Docker Client
docker客戶端通過(guò)docker api或其他方式與docker daemon進(jìn)行通信堡称,進(jìn)而操作docker。
2.2.2 Docker Daemon
docker守護(hù)程序可以監(jiān)聽(tīng)docker客戶端的命令艺演,以及管理docker對(duì)象却紧,例如鏡像、容器钞艇、網(wǎng)絡(luò)等等啄寡。
2.2.3 Docker Registry
docker倉(cāng)庫(kù)存儲(chǔ)docker鏡像,docker hub是所有人都可訪問(wèn)的公共倉(cāng)庫(kù)哩照,用戶可從倉(cāng)庫(kù)中拉取鏡像或推送鏡像到倉(cāng)庫(kù)挺物。
2.2.4 Docker對(duì)象
鏡像
Docker鏡像是創(chuàng)建容器的模板,可通過(guò)Dockerfile
創(chuàng)建鏡像飘弧。同一個(gè)軟件可有不同版本的鏡像识藤,用tag表示鏡像版本。
容器
容器是運(yùn)行中的鏡像次伶。容器可以被創(chuàng)建痴昧、啟動(dòng)、停止冠王、刪除赶撰、暫停等。用戶還可以使用docker compose
來(lái)定義柱彻、運(yùn)行管理多個(gè)容器豪娜。
三、Docker的基本操作
3.1安裝Docker
# centos
yum install docker-ce-18.03.1.ce
# 啟動(dòng)docker
systemctl start docker
# 加入開(kāi)機(jī)啟動(dòng)
systemctl enable docker
3.2鏡像
鏡像常用操作命令:
操作 | 說(shuō)明 |
---|---|
docker search | 查詢鏡像 |
docker pull | 從倉(cāng)庫(kù)獲取所需鏡像 |
docker images | 顯示本地已有鏡像 |
docker save -o XXX.tar img_name | 導(dǎo)出鏡像到本地文件 |
docker rmi img_name | 刪除本地鏡像 |
docker builid | 創(chuàng)建鏡像 |
創(chuàng)建鏡像
創(chuàng)建鏡像時(shí)需要用到dockerfile
文件哟楷,該文件按照步驟列下了創(chuàng)建鏡像時(shí)的所有命令瘤载。例:
# syntax=docker/dockerfile:1
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
-
from
指定使用的鏡像源 -
copy
復(fù)制文件或目錄到指定的容器路徑 -
run
要執(zhí)行的命令行命令。有shell格式和exec格式 -
cmd
指定在容器中執(zhí)行的命令
配置好dockerfile
文件后卖擅,在該文件目錄下執(zhí)行命令docker build -t 鏡像 名:tag .
創(chuàng)建鏡像鸣奔,或使用命令docker build --no-cache -t helloapp:v2 -f dockerfiles/Dockerfile context
指定文件和上下文目錄創(chuàng)建鏡像墨技。
3.3容器
鏡像生成的運(yùn)行實(shí)例,docker中每個(gè)容器之間是互相隔離的挎狸,它可以被啟用扣汪、開(kāi)始、停止锨匆、刪除
容器的生命周期
參考文章《Docker容器的生命周期管理》私痹。
狀態(tài) | 說(shuō)明 | 操作 |
---|---|---|
created | 已創(chuàng)建但未啟動(dòng) | docker create |
running | 運(yùn)行中 | docker run/docker start/docker restart/docker unpause |
stopped | 停止?fàn)顟B(tài) | docker kill/ docker stop |
paused | 暫停狀態(tài) | docker pause |
deleted | 刪除狀態(tài) | docker rm |
常用命令
操作 | 說(shuō)明 |
---|---|
docker run img_name | 創(chuàng)建并啟動(dòng)容器(-d 后臺(tái)運(yùn)行 -v 目錄映射 -p 端口映射 ) |
docker start | 啟動(dòng)已終止的容器 |
docker ps | 查看容器信息(-a:查看所有容器) |
docker stop | 終止容器 |
docker exec -it con_name bash | 進(jìn)入容器 |
docker rm | 刪除容器 |
docker compose
一個(gè)系統(tǒng)通常含有多個(gè)服務(wù),使用docker compose
可以一次性管理多個(gè)容器统刮。
安裝docker compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 檢查是否安裝成功
docker-compose --version
編寫(xiě)docker-compose.yml文件
根據(jù)容器的運(yùn)行命令編寫(xiě)其docker-compose.yml
文件紊遵。例如,我們要部署兩個(gè)服務(wù)侥蒙,一個(gè)是應(yīng)用程序暗膜,其運(yùn)行命令為:
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
另一個(gè)是mysql,其運(yùn)行命令為:
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
根據(jù)運(yùn)行命令編寫(xiě)docker-compose.yml
文件鞭衩。
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
-
app/mysql
:自定義的容器別名学搜,對(duì)應(yīng)--name
命令
*image
:使用該鏡像創(chuàng)建容器 -
command
:在容器內(nèi)執(zhí)行的命令 -
ports
:端口映射 -
working_dir
:指定工作目錄,對(duì)應(yīng)-w
命令 -
volumes
:指定數(shù)據(jù)持久化的目錄映射论衍,對(duì)應(yīng)-v
命令 -
environment
:定義環(huán)境變量瑞佩,對(duì)應(yīng)-e
命令
啟動(dòng)多容器
docker-compose up -d
其他操作
停止docker-compose -f docker-compose.yml stop 服務(wù)名