一、為什么使用容器?
1. 上線流程繁瑣
開發->測試->申請資源->審批->部署->測試等環節
2. 資源利用率低
普遍服務器利用率低,造成過多浪費
3. 擴容/縮容不及時
業務高峰期擴容流程繁瑣,上線不及時
4. 服務器環境臃腫
服務器越來越臃腫,對維護、遷移帶來困難
Docker設計目標:
提供簡單的應用程序打包工具
開發人員和運維人員職責邏輯分離
多環境保持一致性
Kubernetes設計目標:
集中管理所有容器
資源編排
資源調度
彈性伸縮
資源隔離
容器與vm對比:
二. Docker的基本使用
Docker 分為 CE 和 EE 兩大版本。CE 即社區版(免費,支持周期 7 個月),EE 即企業版,強調安全,付費使用,支持周期 24 個月。
官方網站上有各種環境下的 安裝指南,這里主要介紹 Docker CE 在 centos7 上的安裝
2.1 安裝
CentOS7.x安裝Docker # 安裝依賴包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker軟件包源 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 安裝Docker CE yum install -y docker-ce # 啟動Docker服務並設置開機啟動 systemctl start docker systemctl enable docker 官方文檔:https://docs.docker.com 阿里雲源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.2理解容器鏡像
鏡像是什么?
• 一個分層存儲的文件
• 一個軟件的環境
• 一個鏡像可以創建N個容器
• 一種標准化的交付
• 一個不包含Linux內核而又精簡的Linux操作系統
鏡像不是一個單一的文件,而是有多層構成。我們可以通過docker history <ID/NAME> 查看鏡像中各層內容及大小,每層
對應着Dockerfile中的一條指令。Docker鏡像默認存儲在/var/lib/docker/\<storage-driver\>中。
鏡像從哪里來?
Docker Hub是由Docker公司負責維護的公共注冊中心,包含大量的容器鏡像,Docker工具默認從這個公共鏡像庫下載鏡像。
地址:https://hub.docker.com
配置鏡像加速器:https://www.daocloud.io/mirror
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
#配置完重啟生效
systemctl restart docker
#配置文件
cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
管理鏡像常用命令
docker容器之間使用什么做的資源隔離?
1、namespace:資源隔離
1)UTS:主機名和域名
2)IPC:比如消息隊列、共享內存
3) PID:進程編號
4)Network:網絡協議棧,例如IP、端口
5)Mount:文件系統
6)User:用戶和用戶組
2、cgroups:資源限制,比如CPU、內存、磁盤IO
3、UFS:聯合文件系統,Copy-on-write
創建容器需要考慮:
1、應用暴露出去
2、主機名,IP
3、數據要不要持久化
4、變量傳入,做相關動作
5、資源限制,例如cpu、內存
docker container run -d \ -p 8888:8080 \ --name web \ -e abc=123456 \ #變量傳入 -v $PWD/wwwroot:/opt \ #數據持久:將容器的opt目錄映射到宿主機 -m=1G \ --cpus="2" \ lizhenliang/java-demo
先測試模擬創建個目錄跟文件
[root@k8s-node1 ~]# mkdir wwwroot [root@k8s-node1 ~]# cd wwwroot/ [root@k8s-node1 wwwroot]# touch index.html
查看鏡像
[root@k8s-node1 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bdd00191db91 lizhenliang/java-demo "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:8888->8080/tcp web
進入鏡像
[root@k8s-node1 ~]# docker exec -it web bash
查看傳遞的參數
[root@bdd00191db91 tomcat]# echo $abc 123456
宿主機wwwroot目錄下的文件已經映射到opt目錄下
[root@bdd00191db91 tomcat]# ls /opt/ index.html
容器里邊創建的文件同時也會在宿主機的目錄中
[root@bdd00191db91 tomcat]# touch /opt/a.html
[root@bdd00191db91 tomcat]# exit
exit
[root@k8s-node1 ~]# ls wwwroot/
a.html index.html
#查看容器的資源限制
[root@k8s-node1 ~]# docker stats web
持久化容器中應用程序數據
Docker提供三種方式將數據從宿主機掛載到容器中:
• volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)。保存數據的最佳方式。
• bind mounts:將宿主機上的任意位置的文件或者目錄掛載到容器中。
• tmpfs:掛載存儲在主機系統的內存中,而不會寫入主機的文件系統。如果不希望將數據持久存儲在任何位置,可以使用
tmpfs,同時避免寫入容器可寫層提高性能。
bind mounts 默認是-v bind mounts模式 ,這種模式只要是同個鏡像創建,即使刪除容器,數據也不會丟失 我們來測試下,先停止,然后刪除 [root@k8s-node1 ~]# docker stop web [root@k8s-node1 ~]# docker rm web 執行 docker container run -d \ -p 8888:8080 \ --name web \ -e abc=123456 \ -v $PWD/wwwroot:/opt \ -m=1G \ --cpus="2" \ lizhenliang/java-demo 進入容器查看數據是否還在 [root@k8s-node1 ~]# docker exec -it web bash 這個opt目錄下創建的內容都會持久化到宿主機的目錄上 [root@d95dddf521ec tomcat]# ls /opt/ a.html index.html 宿主機上wwwroot目錄 [root@k8s-node1 ~]# ls wwwroot/ a.html index.html volumes volumes是由docker進行管理的,bind mounts是由宿主機進行管理,docker去進行映射 創建一個volume [root@k8s-node1 ~]# docker volume create wwwroot 查看 [root@k8s-node1 ~]# docker volume ls DRIVER VOLUME NAME local wwwroot 查看宿主機上的目錄 [root@k8s-node1 ~]# docker volume inspect wwwroot [ { "CreatedAt": "2019-11-23T09:02:59+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/wwwroot/_data", "Name": "wwwroot", "Options": null, "Scope": "local" } ] 這個目錄默認是空的,只要容器使用這個volumes,數據就會持久化到這個目錄 [root@k8s-node1 ~]# ls -l /var/lib/docker/volumes/wwwroot/_data 使用格式: --mount bind=volumes,src=wwwroot,dest=/opt2 也可以-v來指定,絕對路徑就是bind mounts去掛載, 直接跟volume的名字就是volume 去掛載,/opt2 就是數據產生的目錄 -v wwwroot:/opt2 我們來測試下,先停止,然后刪除 [root@k8s-node1 ~]# docker stop web [root@k8s-node1 ~]# docker rm web 執行 docker container run -d \ -p 8888:8080 \ --name web \ -e abc=123456 \ -v $PWD/wwwroot:/opt \ -v wwwroot:/opt2 \ -m=1G \ --cpus="2" \ lizhenliang/java-demo 進入容器后創建文件 [root@k8s-node1 ~]# docker exec -it web bash [root@6d785e95541c tomcat]# ls /opt2 [root@6d785e95541c tomcat]# touch /opt2/123.html [root@6d785e95541c tomcat]# exit exit 數據已經持久化到這個目錄 [root@k8s-node1 ~]# ls /var/lib/docker/volumes/wwwroot/_data 123.html