什麼是容器
一種虛拟化的方案
作業系統級别的虛拟化
隻能運作相同或相似核心的作業系統
依賴于linux核心特性:namespace和cgroups(control group)
linux namespaces 命名空間
通過namespaces将以下資源隔離:
uts(unix timesharing system)主機名和域名
ipc(inter-process communication)信号量、消息隊列和共享記憶體 跨程序通信的通路
pid(processid) 程序編号
net(network) 管理網絡接口,網絡裝置、網絡棧、端口等
mnt(mount) 管理挂載點(檔案系統)
user 使用者和使用者組
control groups(cgroups)控制組 使用者空間的資源配置設定
blkio:塊裝置io
cpu:cpu
cpuacct:cpu資源使用報告
cpuset:多處理器平台上的cpu集合
devices: 裝置通路
freezer:挂起或恢複任務
memeory:記憶體用量及報告
perf_event:對cgroup中的任務進行統一性能測
net_cls:cgroup中的任務建立的資料封包的類别
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcugjM1IDO2cTM4ETL1MTMzQTOyITM3AjMwAjMwITLyUTM0YzMx8CXyADMyAjMvwlM1EDN2MTMvwVY0VmYtk2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
鏡像:靜态
容器:動态的,有生命周期
安裝docker
依賴環境:
- 64bits cpu
- linux kernel 3.10+
- linux kernel cgroups and namespaces
最好是安裝在centos7,因為yum的倉庫docker版本比較老,直接使用清華大學的鏡像
配置yum源:
# wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
修改
# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
安裝
# yum install docker-ce
docker配置檔案
mkdir /etc/docker #預設不存在,需要自己建立
vim /etc/docker/daemon.json
定義鏡像加速器:
可以使用docker cn/阿裡雲加速器/中國科技大學加速器
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
Daemon:
# systemctl start docker
# docker version #檢視docker client和server 的version資訊
# docker --help
docker 對象有images,containers,networks,volumes,plugin等對象,都可以執行增删改查操作。
# docker container --help
# docker info #檢視docker詳細資訊
鏡像
# docker search nginx
alpine:(微型發行版,小鏡像,提供基礎環境,不帶調試工具,不建議用在生産環境)
# docker [image] pull
# docker inspect 1e1148e4cc2c #檢視鏡像的詳細資訊
容器
docker container ls # 列出正在運作的容器
docker container ls -a # 列出所有容器,包括停止運作的
docker ps 等同于docker container ls
docker [container] run
docker container stop 9a34a9f0e7d2
docker container rm 9a34a9f0e7d2
運作容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- -t (tty) 讓docker配置設定一個僞終端
- -i 互動式通路
- --name 容器名稱
- --network 容器網絡,預設bridge。 通過docker network ls 可以檢視到
- -d 運作在背景
運作一個容器:
# docker run -d --name web1 nginx:1.14-alpine
# docker run --name b1 -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # httpd --help
/ # mkdir /data/html -p
/ # vi /data/html/index.html
/ # httpd -f -h /data/html/ 運作httpd
在容器外部可以通路該httpd服務,打開另一個終端:
# docker inspect b1 檢視容器資訊,容器ip
# curl 172.17.0.2
docker ps -a (docker container ls -a) 檢視所有容器
啟動已停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
Start one or more stopped containers
Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--detach-keys string Override the key sequence for detaching a container
-i, --interactive Attach container's STDIN
# docker start -a -i b1 重新啟動b1容器
停止容器
docker stop
docker kill
删除容器
docker rm b1
進入一個背景啟動的容器中:
docker attach container_name/container_id
在容器中執行指令
docker container exec -it web1 /bin/sh
/ # ps
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
6 nginx 0:00 nginx: worker process
17 root 0:00 /bin/sh
23 root 0:00 ps
檢視容器日志
# docker container logs 63e704e720fa
Docker Images
docker鏡像中含有啟動容器所需要的檔案系統及其内容,是以,其用于建立并啟動容器。
- 采用分層建構機制,最底層為bootfs,上面是rootfs
- bootfs: 用于系統引導的檔案系統,包括bootloader和kernel,容器啟動完成後會被解除安裝以節約記憶體資源
- rootfs:位于bootfs之上,表現為docker容器的根檔案系統;
傳統模式中,系統啟動時,核心挂載rootfs時會首先将其挂載為隻讀模式,完整性自檢完成後将其重新挂載為讀寫模式
docker中,rootfs由核心挂載為“隻讀”模式,而後通過聯合“挂載技術”額外挂載一個“讀寫層”。
dockers image layer
- 位于下層的鏡像為父鏡像(parent image),最底層的為基礎鏡像
- 最上層為“可讀寫”層,其下的均為“隻讀”層,如果容器被删除,最上層的讀寫層會一并被删除
docker 分層鏡像
docker分層鏡像,除了aufs,還支援btrfs,devicemapper,overlay2和vfs等
Docker Registry
啟動容器時,docker daemon 會試圖從本地擷取相關鏡像,本地鏡像不存在時,會從Registry中下載下傳鏡像并儲存到本地。
Registry用于儲存docker鏡像,包括鏡像的層次結構和中繼資料
分類:
- Sponsor Registry:第三方的registry,供客戶和docker社群使用
- Mirror Registry:第三方的registry,隻讓客戶使用
- Vendor Registry:由釋出docker鏡像的供應商提供的registry
- Private Registry:通過設有防火牆和額外的安全層的私有實體提供的registry
Registry(repository and index)
Repository
- 由某特定的docker鏡像的所有疊代版本組成的鏡像倉庫
- 一個Registry可以存在多個Repository
- Repository可分為“頂層倉庫”和“使用者倉庫”
- 使用者倉庫名稱格式為“使用者名/倉庫名”
- 每個倉庫可以包含多個Tag(标簽),每個标簽對應一個鏡像。一個鏡像可以有多個tag,一個tag隻能屬于一個鏡像
Index
- 維護使用者賬戶、鏡像的校驗以及公共命名空間的資訊
- 相當于為registry提供了一個完成使用者認證等功能的檢索接口
docker registry中的鏡像通常由開發人員制作,而後推送至“公共”或“私有”registry上儲存,公其它人員使用,例如部署到生産環境
鏡像的生成途徑
- Dockerfile build
- 基于容器制作 commit
- Docker Hub automated builds
基于容器制作鏡像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options:
-a, --author string Author (e.g., "John Hannibal Smith <[email protected]>")
-c, --change list Apply Dockerfile instruction to the created image 改變dockerfile指令
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
例如:
docker run --name b1 -it busybox (啟動一個容器)
/ # mkdir /data/html -p
/ # vi /data/html/index.html
基于容器建立鏡像
docker commit -p b1
sha256:ae437fa992d9c8182cffcf60e382f8d15a44e26065871b447e2838421b9231a1
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> ae437fa992d9 3 seconds ago 1.2MB
給鏡像打标簽
docker tag ae437fa992d9 abao/bbox:v0.1
REPOSITORY TAG IMAGE ID CREATED SIZE
abao/bbox v0.1 ae437fa992d9 5 minutes ago 1.2MB
一個鏡像可以打多個标簽:
docker tag abao/bbox:v0.1 abao/bbox:latest
鏡像建立完成後,啟動容器檢視
docker run --name t1 -it abao/bbox:latest
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # cat data/html/index.html
檢視鏡像詳細資訊
busybox container t1可以看到t1這個鏡像的詳細資訊
"Cmd": [ #預設執行的指令,通過建構鏡像時的-c可以更改
"sh"
],
docker commit -a "abao <[email protected]>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 abao/bbox:v0.2
啟動鏡像
docker run --name t2 abao/bbox:v0.2
可以檢視到
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea4d55c5ad60 abao/bbox:v0.2 "/bin/httpd -f -h /d…" About a minute ago Up About a minute t2
也可以通過curl通路到
docker push
docker login 先
docker push (如果不是push到docker hub,必須先打tag,tag包含伺服器位址/名稱空間/倉庫名稱:标簽)
鏡像的導入和導出
主機1:
docker save -o myimages.gz abao/bbox:v0.1 abao/bbox:v0.2
主機2:
docker load -i myimages.gz