從國內daoclouddocker鏡像源中拉去鏡像
docker pull daocloud.io/centos:latest
docker run 命令(基於已有的鏡像創建容器,運行容器)
-t:分配一個僞終端,意思是運行一個容器需要一個終端。
-i:即使不連接也保持輸入狀態,即開啓終端後,該終端一直存在(不知道是否有超時),即交互的模式
-d:非交互的模式,即後臺模式運行該容器。
-u:指定用戶名
-w:容器內工作的目錄
docker commit命令(基於已有的鏡像的容器創建新鏡像)
-a: 作者信息
-m: 提交消息
-p: 提交時暫停容器運行
基於本地模板導入一個鏡像(推薦使用OpenVZ提供的模板來創建)
OPENVZ模板的下載地址爲http://openvz.org/Download/templates/precreated
使用命令導入鏡像:cat tar包|docker import - 鏡像名name:tag標籤
然後查看本地是否有該鏡像:docker images
使用docker save 和docker load命令來存儲和載入鏡像。
存儲鏡像:docker save -o 文件名.tar 倉庫:tag(哪個倉庫的tag)
導入鏡像:docker load從存出的本地文件中再導入到本地鏡像庫,例如:從文件nginx.1.8.tar導入鏡像到本地鏡像列表,如下所示:
docker load --input nginx.1.8.tar
或者
docker load < nginx.1.8.tar
上傳鏡像
使用docker push命令上傳鏡像到倉庫,默認上傳到DockerHub官方倉庫(需要登 錄),命令格式爲docker push name:tag
用戶在dockerhub網站註冊後,即可上傳自制的鏡像。例如用戶user上傳本地的 test:latest鏡像,可以先添加新的標籤user/test:latest,然後用docker push 命令上傳鏡像:
docker tag test:latest user/test:latest
docker push user/test:latest
容器就是鏡像的一個運行實例,容器是帶有可寫的文件層。
虛擬機是模擬運行的一整套操作系統和跑在上面的應用,那麼Docker容器就是獨立運行的一個或一組應用,以及它們的必須運行環境。
對容器的操作有:創建容器、啓動容器、終止容器、進入容器內執行操作、刪除容器和通過導入導出容器來實現容器遷移等。
1.創建容器
使用docker create 命令新建一個容器(使用該命令創建的容器是停止的,使用docker start命令啓動)
docker create -it nginx:latest
docker ps -a
新建並啓動容器
啓動方法有兩種:基於鏡像新建一個容器並啓動,另一個是將在終止狀態的容器重新啓動。所需要的命令主要爲:docker run,等價於先執行docker create後執行docker start。
例如:
docker run ubuntu /bin/echo 'Hello world'
Hello world
這跟在本地直接執行/bin/echo 'Hello world'幾乎感覺不出任何區別。
建議:用docker run
docker在後臺運行的標準操作包括:
1)檢查本地是否存在指定的鏡像,不存在就從
公有倉庫下載。
2)利用鏡像創建並啓動一個容器。
3)分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層。
4)從宿主主機配置的網橋接口中橋接一個虛擬接口道容器中去。
5)從地址池配置一個IP地址給容器。
6)執行用戶指定的應用程序。
7)執行完畢後容器被終止。
下面的命令則啓動一個bash終端,允許用戶進行交互:
docker run -t -i ubuntu:14.04 /bin/bash
這時候進入的是一個容器的僞終端。這時候用戶可以在這個容器內進行操作
退出容器的命令是:exit或按ctrl+d,這時候該容器就是處於終止的狀態。
守護態運行:即daemon形式運行。-d參數實現。
例如:docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
容器啓動後會返回一個唯一的ID,也可以通過docker ps命令來查看容器信息
要獲取容器的輸出信息:docker logs 容器ID(可以寫ID的前幾個字符)
終止容器:docker stop 它會先向容器發送SIGTERM信號,等待一段時間後(默認是10s),再發送SIGKILL信號終止容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。
注意:docker kill 命令會直接發送SIGKILL信號來強行終止容器。
docker ps -a -q用於查看終止的容器。
處於終止的容器可以通過docker start重新啓動。
docker restart 會重啓一個運行的容器。
進入容器:
使用-d,容器啓動後會進入後臺,用戶無法看到容器中的信息。某些時候如果需要進入容器進行操作,有很多方法,包括使用docker attach命令,docker exec命令,以及nsenter工具等。
attach命令:docker attach 容器name。attach命令不方便,即當多個窗口同時attach到同一個容器的時候,所有窗口都會同步顯示。當某個窗口音命令阻塞時,其他窗口也無法執行操作。
exec命令:docker exec -ti 容器ID
nsenter工具:需要額外安裝yum install util-linux -y
導出鏡像:docker save -o centos.tar docker.io/centos:latest
導入鏡像:docker load --input /tmp/centos.tar
導出容器:docker export 7691a814370e > centos.tar
導入容器爲鏡像:cat centos.tar | docker import - test/centos:v1.0
這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標籤等元數據信息。
docker inspect --format "{{.State.Pid}}" 867e6627a194 #找到容器的第一個進程PID
nsenter -t PID號 -m -u -i -n -p 輸入該命令便進入到容器中
nsenter --target上面查到的進程id --mount --uts --ipc --net --pid #輸入該命令便進入到容器中
–mount參數是進去到mount namespace中
* –uts參數是進入到uts namespace中
* –ipc參數是進入到System V IPC namaspace中
* –net參數是進入到network namespace中
* –pid參數是進入到pid namespace中
* –user參數是進入到user namespace中
可以寫個腳本進入容器
#!/bin/bash
# Use nsenter to access docker
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
nsenter -t $PID -m -u -i -n -p
}
main(){
docker_in $*
}
main $*
如何創建鏡像?
方法一:根據已有容器生成鏡像
在容器中安裝json和gem兩個應用,同時exit
使用docker commit命令提交更新後的副本
docker commit -m "說明信息" -a "指定更新的用戶信息" 容器ID 倉庫名 tag
方法二:利用Dockerfile來創建鏡像
利用docker commit來擴展一個鏡像比較簡單,但是不方便在團隊中分享。我 們可以使用docker build來創建一個新的鏡像。爲此,我們需要創建Dockerfile, 包含一些如何創建鏡像的指令。
1.新建一個目錄和Dockerfile
mkdir 101_tang_docker
cd 101_tang_docker
touch Dockerfile
Dockerfile中每一條命令都創建鏡像的一層。
Dockerfile語法:
使用#來註釋
FROM 指令告訴Docker使用哪個鏡像作爲基礎
接着就是維護者的信息
RUN開頭的指令會在創建中進行,比如安裝一個軟件包(yum或rpm),編寫完成 Dockerfile後,使用docker build來生成鏡像。
例如:
#This is comment
FROM Centos:7.1
MAINTAINTER Docker Newbee <[email protected]>
RUN yum install lrzsz -y
dockerfile做好後,使用docker build -t="倉庫名:tag" . 來生成鏡像,注 意.不要丟,-t標記來添加tag,指定新的鏡像的用戶信息,“.”是dockerfile 所在的路徑,也可以替換爲全路徑。
注意:一個鏡像不能超過127層
殺死所有正在運行的容器.
alias dockerkill='docker kill $(docker ps -a -q)'
# 刪除所有已經停止的容器.
alias dockercleanc='docker rm $(docker ps -a -q)'
# 刪除所有未打標籤的鏡像.
alias dockercleani='docker rmi $(docker images -q -f dangling=true)'
# 刪除所有已經停止的容器和未打標籤的鏡像.
alias dockerclean='dockercleanc || true && dockercleani'
# 給鏡像打標籤,同時進行倉庫的定義
docker tag friendlyhello username/repository:tag
#將鏡像推送到註冊服務器上
docker push username/repository:tag