Docker 學習筆記【1】Docker 相關概念,基本操作

計劃: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章