Docker鏡像相當於是一個root文件系統
Docker鏡像的本質:
Linux文件系統有bootfs和rootfs兩部分組成
bootfs:包含bootloader(引導加載程序)和kernel(內核)
rootfs:root文件系統 /dev /bin /etc
鏡像原理:
由特殊的文件系統疊加而成
最低端是bootfs,並使用宿主機的bootfs
第二層是root文件系統rootfs(基礎鏡像)
然後再網上可以疊加其他的鏡像文件(組成只讀鏡像,對於裏面的鏡像不能修改)
當從一個鏡像啓動容器時,Docker會在最頂層加載一個讀寫文件系統作爲容器
轉存失敗重新上傳取消正在上傳…重新上傳取消轉存失敗重新上傳取消
Docker中一個centos鏡像只有200M,而centos操作系統得iso文件有幾個G:
Docker中的centos鏡像父用了linux的bootfs部分,提供rootfs部分
製作容器:
1.容器轉鏡像:鏡像不能直接傳輸,只能壓縮成壓縮文件
打包鏡像 docker commit 容器id 鏡像名稱:版本號
壓縮 docker save -o 壓縮文件 鏡像名稱:版本號
還原成鏡像 docker load -i 壓縮文件名稱
2.dockerfile
概念:包含一條條指令,每一條指令構建一層,基於基礎鏡像,最終構建出一個新的鏡像
FORM指定父鏡像
EXPOST 80 暴露端口
STOPSINGNAL SIDTERM
CMD ["nginx","-g","daemon off;"] 啓動nginx的命令
dockerfile實現:
1.定義父鏡像 FORM centos:7
2.定義作者信息 MAINTAINER ithe<[email protected]>
3.執行安裝vim命令 RUN yum install -y vim
4.定義默認的工作目錄: WORKDIR/usr
5.定義容器啓動執行的命令:CMD/bin/bash
執行文件:
docker build -f ./dockerfile -t(命名)it_centos:1 .(代表尋址路徑)
案例:定義dockerfile 發佈springboot項目
1.編輯dockerfile
FROM java:8
MAINTAINER author <[email protected]>
ADD demo-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
2.構建鏡像
docker build -f ./springboot_dockerfile -t app .
3.啓動容器
docker run -id -p 1688:1688 app
服務編排:
概念:按照一定的業務規則批量管理容器
編排工具:Docker Compose 多容器分佈式部署的工具,提供命令集管理容器化應用的完整開發週期,包括服務構建,啓動,停止,
使用步驟:
1.利用Dockerfile定義運行環境鏡像
2.使用docker-compose.yml定義組成應用的各服務
3.運行docker-compose up啓動應用
1.安裝docker-compose
2.編寫docker-compose.yml文件
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "1688"
3.創建nginx配置文件目錄
mkdir -p ./nginx/conf.d
4.創建nginx配置文件
vim it.conf
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:1688;
}
}
5.回到docker-compose文件夾並啓動
cd ../../
docker-compose up -d(表示後臺運行)
Docker私有倉庫
一:私有倉庫搭建
1.拉取倉庫鏡像
docker pull registry
2.創建容器
docker run -id --name=registry -p 5000:5000 registry
測試訪問:http://ip地址:5000/v2/_catalog,成功訪問就代表創建成功
3.修改daemon.json
vim /etc/docker/daemon.json
4.添加倉庫地址
"insecure-registries":["139.196.162.249:5000"]
5.重啓docker
systemctl restart docker
啓動私有庫容器:docker start registry
6.標記鏡像爲私有倉庫的鏡像
docker tag centos:7 ip地址:5000/centos:7
7.上傳標記的鏡像
docker push ip地址:5000/centos:7
成功後:
從倉庫拉取鏡像
docker pull ip地址:5000/centos:7
Docker容器虛擬化與傳統虛擬機的區別
容器就是將軟件打包成獨立軟件包,用於開發、交付和部署
相同點:
容器和虛擬機具有相似的資源隔離和分配優勢
不同:
容器虛擬化的是操作系統,虛擬機虛擬化的是硬件
容器只能運行同一類型系統,虛擬機可以運行不同的操作系統
服務操作:
啓動 systemctl start docker
查看狀態 systemctl status docker
停止 systemctl stop docker
重啓 systemctl restart docker
開機啓動 systemctl enable docker
鏡像操作:
查看鏡像:docker images
搜索鏡像:docker search redis(hub.docker.com查看版本)
拉取鏡像:docker pull redis:5.0(默認官方新版本)
刪除鏡像:docker rmi f0453552d7f2(image id)
刪除所有鏡像:docker rmi 'docker images -q
容器操作:
查看運行的容器:docker ps 查看正在運行的容器 docker ps -a(所有歷史的)
創建容器:docker run -it(退出立馬關閉容器) --name=c1(容器名字) ubuntu:18.04(鏡像和版本) /bin/bash
docker run -id(退出後不會關閉容器) --name=c2(容器名字)
-i保持容器運行
進入容器:docker exec 參數
啓動容器:docker start c2
停止容器:docker stop c2
刪除容器:docker rm c2
刪除所有容器:docker rm 'docker pa -aq'(查看所有容器的命令) 不能刪除正在運行的
查看容器信息:docker inspect c2
'
數據卷:
容器刪除後容器產生的數據還在嗎?
不在 ,docker產生的數據在docker容器裏 數據卷數據還在
docker容器和外部機器可以直接交換文件嗎?
不能,容器和外部機器網絡不互通 數據卷裏的數據可以交換
容器之間想要進行數據交互?
定義:數據卷是宿主機中的一個目錄或文件,
當容器目錄和數據卷目錄綁定後,對方修改的數據會立即同步
一個容器可以掛載多個數據卷
一個數據卷可以被多個容器掛載
數據卷作用:
容器數據持久化
外部機器和容器間接通信
容器之間的數據交互
配置數據卷:
啓動容器時使用-v參數設置數據卷:
docker run -it --name=c1 -v /root/data(被掛載的目錄):/root/data_container(容器裏的目錄) ubuntu /bin/bash
掛載多個目錄:
docker run -it --name=c2 \
-v /root/data(被掛載的目錄):/root/data_container1(容器裏的目錄) \
-v /root/data(被掛載的目錄):/root/data_container2(容器裏的目錄)\
ubuntu /bin/bash
docker部署tomcat
搜索鏡像 docker search tomcat
拉取鏡像 docker pull tomcat
啓動容器並啓動項目 docker run -id --name=x_tomcat \
> -p 8080:8080 \ //將容器的8080端口映射到主機的8080端口
> -v $PWD:/user/local/tomcat/webapps\ //將主機中當前目錄掛載到容器的/user/local/tomcat/webapps中
> tomcat
docker部署nginx
搜索鏡像 docker search nginx
拉取鏡像 docker pull nginx
啓動容器docker run -id --name=c_nginx\
> -p 80:80 \ //映射端口
> -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf\ //映射配置文件目錄
> -v $PWD/logs:/var/log/nginx\ //映射日誌目錄
> -v $PWD/html:/usr/share/nginx/html\ //映射訪問資源目錄
> nginx
docker部署redis
搜索鏡像 docker search redis
拉取鏡像 docker pull redis
啓動容器docker run -id --name=c_redis -p 6379:6379 redis:5.0