天天看點

docker(一)--基礎指令

什麼是容器

一種虛拟化的方案

作業系統級别的虛拟化

隻能運作相同或相似核心的作業系統

依賴于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中的任務建立的資料封包的類别      
docker(一)--基礎指令

 鏡像:靜态

 容器:動态的,有生命周期

安裝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(一)--基礎指令

Docker Images

docker鏡像中含有啟動容器所需要的檔案系統及其内容,是以,其用于建立并啟動容器。 

  • 采用分層建構機制,最底層為bootfs,上面是rootfs
    • bootfs:  用于系統引導的檔案系統,包括bootloader和kernel,容器啟動完成後會被解除安裝以節約記憶體資源
    • rootfs:位于bootfs之上,表現為docker容器的根檔案系統;

      傳統模式中,系統啟動時,核心挂載rootfs時會首先将其挂載為隻讀模式,完整性自檢完成後将其重新挂載為讀寫模式

      docker中,rootfs由核心挂載為“隻讀”模式,而後通過聯合“挂載技術”額外挂載一個“讀寫層”。

docker(一)--基礎指令

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上儲存,公其它人員使用,例如部署到生産環境

docker(一)--基礎指令

鏡像的生成途徑

  • 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  

繼續閱讀