Docker重要概念及基本操作
阿新 • • 發佈:2018-11-10
一.Docker架構和底層技術簡介
1.Docker Platform
- Docker提供了一個開發,打包,執行app的平臺
- 把app和底層infrastructure(physical/virtual物理裝置和虛擬裝置)隔離開來
2.Docker Engine
- 後臺程序(dockerd)
- 提供REST API Server
- CLI 介面(docker)
3.Docker Architecture(Docker整體架構)
- Client(命令列中常用的命令)
- DOCKER_HOST
- image映象
- containers容器
- Registry(儲存映象的公共伺服器,用於images的儲存與獲取)
4.底層技術支援
- Namespaces:做隔離pid,net,ipc,mnt,uts
- Control groups:做資源限制(指定容器用多少記憶體)
- Union file systems:Container和image的分層
5.實驗環境介紹
- 使用已經搭建好的實驗環境【暫時還沒有釋出】
- 執行
vagrant up
命令開啟centos7的虛擬機器,這個虛擬機器中已經安裝好docker了 - 執行
vagrant ssh
二.Docker image概述(Image即映象)
1.什麼是Image
- 檔案和meta data的集合(root filesystem)
- 分層的,並且每一層都可以新增改變刪除檔案,成為一個新的image
- 不同的image可以共享相同的layer
- Image本身是read-only的
2.例項瞭解Image
- 執行
docker image ls
檢視本地的所有image
3.Image的獲取
-
通過Dockerfile格式的檔案build出來對應的image(Build from Dockerfile)
-
從Registry拉取Image(Pull from Registry)
sudo docker pull ubuntu:14.04#從registry中拉取ubuntu14.04的image,不加版本號取的是最新版本 #上述拉取的方式是從docker hub中取出的,https://hubs.docker.com
- 上述拉取的方式是從docker hub中取出的,https://hubs.docker.com
- 如果不攜帶版本號的拉取,拿到的是最新版本
- 如果pull的內容帶對應路徑,如
sudo docker pull binami/wordpress
,該內容不是官方給提供的,其中binami為使用者名稱;若想取官方image則需要執行sudo docker pull wordpress
三.DIY一個Base Image
1.提升docker命令的執行許可權
#我們通常執行
#sudo docker image ls 檢視docker中的image
#執行 docker image ls 會提示許可權不足
#執行如下命令提升許可權
sudo groupadd docker
sudo gpasswd -a vagrant docker
sudo service docker restart#重啟docker服務
#使用vagrant ssh重新登入後,執行docker image ls可以直接檢視結果
2.使用官方hello-world的image
docker pull hello-world#從registry中獲得hello-world的baseimage,執行hello-world會建立一個容器
docker run hello-world#執行hello-world的container
3.通過c語言編寫hello world,將hello wrold編譯執行成二進位制的可執行檔案
-
執行
vim hello.c
建立hello.c -
編寫hello.c
#include<stdio.h> int main() { printf('hello docker\n') }
-
編譯c語言檔案成二進位制檔案(編譯c語言使用gcc)
#安裝gcc sudo yum install gcc #安裝glibc-static sudo yum install glibc-static #安裝後執行如下命令進行編譯c語言檔案 gcc -static hello.c -o hello #此時我們將hello.c檔案編譯成名為hello的可執行檔案 #可以使用./hello直接執行hello檔案
-
編寫Dockerfile檔案
FROM scratch #表示當前image是base image ADD hello / #將hello執行到根目錄中 CMD [~/hello~]
-
執行
docker build -t jack/hello-world .
構建Base image,最後的點表示在當前路徑找Dockerfile -
通過dockerfile將此可執行檔案打成docker image
-
使用
docker run jack/hello-world
執行建立的container,會列印hello docker
四.初識container
1.什麼是Container
- 通過Image建立(copy)
- 在Image layer之上建立一個container layer(可讀寫)
- 類比面向物件:類(Image)和例項(Container)
- Image負責app的儲存和分發,Container負責執行app
2.container命令
- docker container ls檢視當前正在執行的container
- docker container ls -a檢視所有的container(當前正在執行的和退出的)
- 如上述docker run jack/hello-world建立並執行container,執行後就會退出,故直接使用ls檢視不到
- 若想建立後不退出則可以使用命令
docker run -it centos
,則會建立container並不會退出,直接使用ls可以檢視到對應的contianer,相當於在image上多了一個layer - 執行
docker container rm ID號
即可將對應退出的container刪除【使用docker rm ID號
預設移除的就是container】 - 執行
docker image rm ID號
即可移除image【使用docker rmi ID號
移除Image】 - 餘下命令及引數請查閱相關文件
五.構建自己的Docker映象
1.Docker命令
docker container commit Container名字 Image名字
[簡寫:docker commit Container名字 Image名字
]先基於某個image建立一個container,之後在container中做某些變化(如新增軟體),之後將其commit成一個新的imagedocker image build
[簡寫:docker build
]通過Dockerfile建立一個image
2.Docker命令應用例項
- 場景一:
- 在image1中建立一個container,並安裝vim
- 執行
docker commit...
將container變成image2【image2的大小比image1大,相當於填了一層並安裝了vim】
- 場景二:
- 在image1中建立一個Dockerfile,內容如下
FROM centos #表示base image是centos RUN yum install -y vim #表示執行相關命令
- 通過
docker build -t Image名 .
會建立臨時的container並安裝vim,安裝後會將container變成image並移除臨時的container
- 在image1中建立一個Dockerfile,內容如下