計劃:Docker 學習筆記【2】 Docker 基礎操作實操記錄,Docker倉庫、數據卷,網絡基礎學習---40
注:所有操作在root下執行
--1--概念:
1、Docker鏡像:
鏡像就是一個只讀的模板,用於創建docker容器。
Docker提供了簡單的機制創建或者更新現有鏡像,也可以從別處拿來現成鏡像直接使用。
2、Docker容器:
可以認爲是精簡版的linux運行環境包含 【root權限,進程空間,用戶空間,網絡空間等】和應用程序
另外:鏡像是隻讀的,容器基於鏡像啓動後創建一層最上層的可寫層。
3、Docker倉庫:
如同git,註冊服務器就像github一樣的託管服務器
倉庫是集中放鏡像文件的場所。
倉庫註冊服務器,存放多個倉庫,每個倉庫中存在多個鏡像,每個鏡像有不通的標籤。tag
4、公有倉庫、私有倉庫概念:
公有倉庫:
最大的倉庫是Docker Hub
國內的倉庫如Docker Pool
私有倉庫:
本地網絡中創建自己的私有倉庫:
push 將自己製作的鏡像上傳
pull 將鏡像拉下來使用
--2--安裝:
1、centos6安裝:
epel源安裝docker
yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm yum install docker-io
2、centos7安裝:
centos-extras已經呆了docker直接安裝
yum install docker
--3--啓動:
服務啓動:
service docker start chkconfig docker on
--4--Docker鏡像:
鏡像就是一個只讀的模板,用於創建docker容器。
Docker提供了簡單的機制創建或者更新現有鏡像,也可以從別處拿來現成鏡像直接使用。
運行前必須要求本地存在對應鏡像,如果沒有,即從配置的鏡像倉庫下載。
1、獲取鏡像:
docker pull ubuntu:12.04
默認配置下,等同於:
docker pull registry.hub.docker.com/ubuntu:12.04
依此推,指定鏡像註冊服務器的pull爲[例中爲中國的服務器,會比較快:
docker pull dl.dockerpool.com:5000/ubuntu:12.04
2、使用鏡像啓動一個容器:
使用ubuntu:12.04鏡像,運行/bin/bash應用
docker run -t -i ubuntu:12.04 /bin/bash
【12.04爲標記的發行版本信息,TAG,如果不指定,默認是latest】
3、列出所有本地鏡像:
docker images
REPOSITORY:來自於那個倉庫
TAG:鏡像標記
IMAGE ID:唯一ID號【不管來自於的倉庫是否一樣,TAG是否一樣,只要ID一樣,就是同樣的鏡像】
CREATED:創建時間
VIRTUAL SIZE:鏡像體積
4、修改已有鏡像:
比如,在鏡像啓動的容器中,安裝了一些軟件或者配置了某些運行環境,如:安裝了json
yum install json exit
此時,容器已經被我們修改了,需要修改此鏡像生效,需要提交
-m message 提交說明信息
-a 更新的用戶信息
docker commit -m "ADDed json" -a "Docker new1109" ${CONTAINER_ID} ${REPOSITORY}:${TAG}
返回一個image_id信息
可以使用我們創建的心image啓動一個容器:
docker run -t -i ${REPOSITORY}:${TAG} /bin/bash
5、創建Docker鏡像:
使用Dockerfile:
注:除了註釋意外,每一行命令,算是一層,docker鏡像創建命令不能超過127層
mkdir image_maker_sinatra cd image_maker_sinatra touch Dockerfile
例:
#this is comment FROM ubuntu:14.04 MAINTAINER Docker Newbee <[email protected]> RUN apt-get -qq update RUN apt-get -qqy install ruby ruby-dev RUN gem install sinatra
語法解析:
註釋:#註釋一行
以哪個image爲基板:FROM ${REPOSITORY}:${TAG}
維護人信息:MAINTAINER ${USER_INFO} <${USER_EMAIL}>
容器中執行的命令:RUN 後面跟上要在鏡像啓動的容器中執行的命令
複製本地文件到鏡像中:ADD MYapp /var/www
開放容器某個端口對外:EXPOSE 80
容器啓動後執行的程序:CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]
在Dockerfile所在目錄執行
docker build -t "${REPOSITORY}:${TAG}" .
即可創建一個鏡像
-t:指定創建鏡像的tag信息
.:表示Dockerfile所在的目錄【目前是同一目錄,因此使用.】
使用openvz【容器虛擬化的先鋒技術】openvz的模板下載地址爲:
http://openvz.org/Download/template/precreated
下載一個鏡像,比如:ubuntu-14.04-x86_64-minimal.tar.gz
cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04 docker push ouruser/sinatra
6、docker導出、導入鏡像到:
docker save -o ubuntu_14.04.tar ubuntu:14.04 docker load --input ubuntu_14.04.tar 或者 docker load < ubuntu_14.04.tar
7、修改鏡像的TAG:
docker tag ${ID} ${REPOSITORY}:${TAG} docker images ${REPOSITORY}
8、刪除鏡像:
docker rmi ${REPOSITORY}:${TAG}
重要:
docker rm 是刪除依賴於這個鏡像所有的docker容器的命令
docker rmi執行前,需要先執行docker rm
9、鏡像學習擴展:
Docker如何實現增量修改和維護:
每個鏡像由很多層次構成,通過Union FS 將這些不通的層結構結合到一個鏡像中去
Union FS通常有兩個用途:
1、可以實現不借助lvm、RAID技術,將多個磁盤掛在在同一目錄下
2、較常用的功能是將一個只讀分支和一個可寫分支聯合在一起
--5--Docker容器:
容器是獨立運行的一個或者一組應用。對比起來,虛擬機就是模擬運行一整套操作系統,以及運行在操作系統中的應用。
1、啓動容器【從鏡像新建】:
新建並啓動容器,主要命令是 docker run
比如,使用:
docker run ubuntu:14.04 /bin/echo "what's your name"
含義爲:使用ubuntu這個repository中tag爲14.04的鏡像啓動一個容器,運行的應用爲/bin/echo "what's your name" 運行速度與在本地執行此命令幾乎無差別
docker run -t -i ubuntu:14.04 /bin/bash
含義爲:使用ubuntu這個repository中tag爲14.04的鏡像啓動一個容器,運行一個bash終端,並分配一個僞終端,和標準輸入進行綁定
-t:選項讓Docker爲容器分配一個僞終端(pseudo-tty)並綁定到標準輸入,
-i:讓容器的標準輸入保持打開
此時進入了docker中的交互模式,可以使用bash的基本命令,如:pwd ls等
Docker run時,Docker後臺的標準運行流程包括:
1、檢查所使用鏡像本地是否存在,存在則使用,不存在則從倉庫下載
2、利用鏡像啓動一個容器實例
3、分配一個文件系統,並在只讀的鏡像層外掛在一層讀寫層
4、從宿主主機配置的網橋中橋接一個虛擬接口到容器中去
5、從ip地址池配置一個ip地址給容器
6、執行用戶指定的應用程序
7、命令執行完畢後,容器終止
2、啓動容器【啓動一個已終止容器】:
啓動已經終止的容器,主要命令爲:docker start
容器的核心爲所執行的應用程序,所需要的軟件資源,就是運行程序所必須的,除此之外,別無其他。
如 啓動bash時,使用ps命令 僅僅可以看到bash ps 兩個進程 所以幾乎沒有資源浪費,十分高效的資源利用率
3、守護態運行:
docker run -d ubuntu:14.04 /bin/sh -c "while true;do echo what is your name;sleep 1;done"
返回一個id,此爲docker容器運行實例的唯一id
查看運行中的docker實例
docker ps
查看容器輸出內容:
docker logs insane_babbage what is your name what is your name what is your name what is your name . . .
4、終止運行中容器:
注:
1、docker運行時指定的應用運行完成時,容器自動終止
2、bash等交互界面下,執行exit或者ctrl+d後,退出bash,bash應用認爲運行完成,容器終止
docker stop
查看已經停止的docker容器實例
docker ps -a
可以通過docker start 啓動終止狀態的容器實例
可以通過docker restart 重啓運行態的容器實例
5、進入守護態運行的實例:
1>attach
docker run -idt ubuntu docker ps docker attach nostalgic_hypatia
缺點:
1、多個窗口attach到同一個容器的時候,所有操作同步顯示
2、某一個窗口命令阻塞,所有窗口都必須等待。
2>nsenter
此工具在util-linux包含2.23版本後包含,如果沒有該命令,需要手動安裝。
www.kernel.org下載源碼後configure make make install
特性:
1、此工具可以訪問另一個進程的名字空間【】,
2、必須要root權限
爲了連接到守護態容器,需要找到容器第一個進程的PID,例命令:
PID=$(docker inspect --format "{{ .State.PID}}" <container>)
步驟操作:
docker ps 獲得CONTAINER ID docker -pid ${CONTAINER ID} 獲得容器第一pid docker -enter ${CONTAINER ID} ls 在容器中執行一個命令
【注意】
下載 .bashrc_docker 並將內容加到.bashrc中
wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker
echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
通過這個容器,通過nsenter命令如下方式連接:
nsenter --target ${PID} --mount --uts --ipc --net --pid
6、容器實例的導出和導入:
1、導出:
docker export ${CONTAINER ID} > ubuntu.tar
2、導入【實際是將容器快照導入爲鏡像】:
cat ubuntu.tar| docker import - ${REPOSITORY}:${TAG}
此外可以通過url全路徑導入
docker import http://example.com/example.tar ${REPOSITORY}:${TAG}
7、docker load 和 docker import區別:
1>
load:導入鏡像存儲文件到本地鏡像庫
import:將容器快照導入到本地鏡像庫
2>
load:保留完整的記錄,包括歷史記錄和元數據信息
import:僅保留快照時的狀態,歷史記錄,元數據信息等都會丟失
3>
load:體積大
import:體積小
4>
load:不可重新制定標籤等元數據信息
import:可以重新制定標籤等元數據信息
8、刪除容器:
docker rm 刪除一個處於終止狀態的容器實例
docker rm trusting_newton
刪除一個運行中的容器實例,容器會收到SIGKILL信號
docker rm -f trusting_newton