Docker基本使用(一)


一、為什么使用容器?

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 commit 將容器保存成一個新鏡像。
• 一個鏡像創建多個容器
• 鏡像增量式存儲
• 創建的容器里面修改不會影響到鏡像

管理鏡像常用命令

ls 列出鏡像
build 構建鏡像來自Dockerfile
history 查看鏡像歷史
inspect 顯示一個或多個鏡像詳細信息
pull 從鏡像倉庫拉取鏡像
push 推送一個鏡像到鏡像倉庫
rm 移除一個或多個鏡像
prune 移除未使用的鏡像。沒有被標記或被任何容器引用的。
tag 創建一個引用源鏡像標記目標鏡像
export 導出容器文件系統到tar歸檔文件
import 導入容器文件系統tar歸檔文件創建鏡像
save 保存一個或多個鏡像到一個tar歸檔文件
load 加載鏡像來自tar歸檔或標准輸入

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

創建容器常用命令:
-i, –interactive 交互式
-t, –tty 分配一個偽終端
-d, –detach 運行容器到后台
-e, –env 設置環境變量
-p, –publish list 發布容器端口到主機
-P, –publish-all 發布容器所有EXPOSE的端口到宿主機隨機端口
–name string 指定容器名稱
-h, –hostname 設置容器主機名
–ip string 指定容器IP,只能用於自定義網絡
–network 連接容器到一個網絡
–mount mount 將文件系統附加到容器
-v, –volume list 綁定掛載一個卷
–restart string 容器退出時重啟策略,默認no,可選值:[always|on-failure]
 
容器資源限制:
-m,–memory 容器可以使用的最大內存量
–memory-swap 允許交換到磁盤的內存量
–memory-swappiness=<0-100> 容器使用SWAP分區交換的百分比(0-100,默認為-1)
–oom-kill-disable 禁用OOM Killer
--cpus 可以使用的CPU數量
–cpuset-cpus 限制容器使用特定的CPU核心,如(0-3, 0,1)
–cpu-shares CPU共享(相對權重)
 
示例:
內存限額:
允許容器最多使用500M內存和100M的Swap,並禁用 OOM Killer:
docker run -d --name nginx03 --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx
CPU限額:
允許容器最多使用一個半的CPU:
docker run -d --name nginx04 --cpus="1.5" nginx
允許容器最多使用50%的CPU:
docker run -d --name nginx05 --cpus=".5" nginx
 
管理容器常用命令:
ls 列出容器
inspect 查看一個或多個容器詳細信息
exec 在運行容器中執行命令
commit 創建一個新鏡像來自一個容器
cp 拷貝文件/文件夾到一個容器
logs 獲取一個容器日志
port 列出或指定容器端口映射
top 顯示一個容器運行的進程
stats 顯示容器資源使用統計
stop/start/restart 停止/啟動一個或多個容器
rm 刪除一個或多個容器

持久化容器中應用程序數據

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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM