Docker值得關注的特性:?
o??? 文件系統(tǒng)隔離:每個進程容器運行在一個完全獨立的根文件系統(tǒng)里。
?o??? 資源隔離:系統(tǒng)資源,像CPU和內(nèi)存等可以分配到不同的容器中,使用cgroup。?
o??? 網(wǎng)絡隔離:每個進程容器運行在自己的網(wǎng)絡空間,虛擬接口和IP地址。
?o??? 日志記錄:Docker將會收集和記錄每個進程容器的標準流(stdout/stderr/stdin),用于實時檢索或批量檢索。
?o??? 變更管理:容器文件系統(tǒng)的變更可以提交到新的映像中,并可重復使用以創(chuàng)建更多的容器。無需使用模板或手動配置。
?o??? 交互式shell:Docker可以分配一個虛擬終端并關聯(lián)到任何容器的標準輸入上,?
一.安裝docker?
?1.centos6安裝docker
由于centos6系統(tǒng)內(nèi)核是2.6,因此必須要先升級內(nèi)核
? 升級內(nèi)核? yum安裝帶aufs模塊的3.10內(nèi)核
#cd?/etc/yum.repos.d?
#wget?http://www.hop5.in/yum/el6/hop5.repo
#yum?install?kernel-ml-aufs?kernel-ml-aufs-devel修改grub的主配置文件/etc/grub.conf,設置default=0,表示第一個title下的內(nèi)容為默認啟動的kernel(一般新安裝的內(nèi)核在第一個位置),重啟系統(tǒng),這時候你的內(nèi)核就成功升級了。
[root@localhost?~]#?uname?-r
3.10.5-3.el6.x86_64查看內(nèi)核是否支持aufs:?[root@localhost?~]#?grep?aufs?/proc/filesystems
nodev????aufs
對于 CentOS6,可以使用EPEL庫安裝 Docker,命令如下
#yuminstall http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
#yum install docker-io
啟動docker服務
#service?docker?start
2.centos7安裝docker
yum? -y install docker
systemctl? start? docker.service
3.查看docker版本
docker? version?
docker info
二.Docker image詳細介紹
docker把下載的 images 存儲到docker主機上,如果一個 image 不在主機上,docker會從一個鏡像倉庫下載,默認的倉庫是?DOCKER HUB? 公共倉庫。
接下來將介紹更多關于docker images 的內(nèi)容,包括:
?使用和管理本地主機上的images
?創(chuàng)建一個基礎的images
?上傳 images 到docker hub (公共 images 倉庫)
?列出本地主機上已經(jīng)存在的images
1)查看本機的鏡像文件? ?
docker? images

?REPOSITORY:來自于哪個倉庫,比如docker.io/centos
?TAG的標記,比如?latest
?IMAGE ID:鏡像它的 ID 號
?CREATED:創(chuàng)建時間
?SIZE:鏡像的SIZE
2)獲取images
docker? pull? docker.io/centos
當我們啟動容器使用的 image 不再本地主機上時,docker會自動下載他們。這很耗時,我們可以使用docker pull 命令來預先下載我們需要的 image 。下面的例子下載一個centos 鏡像

3)查找images
搜索sinatra的鏡像
docker search sinatra

4) 下載images
如下載ssh鏡像
docker pull? ?docker.io/jdeathe/centos-ssh

5) 查看鏡像完整信息
docker? inspect? docker.io/centos
當鏡像下載成功后,你可以看到 12 位的 hash 值像 05188b417f30,這是下載完整的鏡像的精簡 ID,這些短的鏡像 ID 是完整鏡像 ID 的前 12 個字符--可以使用docker inspect 或者docker images?--no-trunc來獲得完整的鏡像ID

6)創(chuàng)建自己的images
docker run -i? ?-t docker.io/centos /bin/bash
docker? commit? ? -m " add? mariadb app"? -a "jishu"? ?446819c3e6c3? centos:mariadb
1.先使用基礎images啟動容器, 更新后提交到新的images

在容器中安裝一個mariadb-server
然后使用exit退出容器,現(xiàn)在容器已經(jīng)被改變l,使用docker commit 命令提交相應的副本

?-m? 來指定提交的說明信息,跟我們使用的版本控制工具一樣
?-a? ?可以指定更新用戶信息
之后是創(chuàng)建鏡像的容器ID,最后是指定目標鏡像的倉庫名和tag信息
使用docker? images 來查看新創(chuàng)建的鏡像

啟動新創(chuàng)建的鏡像來啟動容器
[root@VM_82_228_centos src]# docker run -i -t centos:mariadb /bin/bash
[root@64ace5cf689e /]# rpm -qa | grep mariadb
mariadb-libs-5.5.56-2.el7.x86_64
mariadb-5.5.56-2.el7.x86_64
mariadb-server-5.5.56-2.el7.x86_64
2.使用dockerfile來創(chuàng)建images
使用docker build?來創(chuàng)建一個新的 image 。為此,我們需要創(chuàng)建一個dockerfile,
vim dockerfile

Dockerfile基本的語法是
使用#來注釋
FROM? 指令告訴 Docker 使用哪個鏡像作為基礎(docker使用哪個 image 源)
MAINTAINER? 是維護者的信息
RUN? ?開頭的指令會在創(chuàng)建中運行,比如安裝一個軟件包,在這里使用 yum來安裝了一些軟件
編寫完成Dockerfile后可以使用docker build?來生成鏡像。
docker build? -t="centos:httpd"

其中? -t? 標記來添加 tag,指定新的鏡像的用戶信息。
“.”是Dockerfile所在的路徑(當前目錄),也可以替換為一個具體的Dockerfile的路徑。
可以看到 build 進程在執(zhí)行操作。它要做的第一件事情就是上傳這個Dockerfile內(nèi)容,因為所有的操作都要依據(jù)Dockerfile來進行。然后,Dockfile中的指令被一條一條的執(zhí)行。每一步都創(chuàng)建了一個新的容器,在容器中執(zhí)行指令并提交修改(就跟之前介紹過的docker commit? 一樣)。當所有的指令都執(zhí)行完畢之后,返回了最終的鏡像 id。所有的中間步驟所產(chǎn)生的容器都被刪除和清理了。
*注意一個鏡像不能超過 127 層

還可以使用docker tag 命令來修改標簽
docker tag? ID? ?修改后的標簽

7)從本地文件導入鏡像
cat? centos-6.tar.gz? ?| docker import -? centos:6
8) 上傳鏡像
用戶可以通過docker push?命令,把自己創(chuàng)建的鏡像上傳到倉庫中來共享。例如,用戶在 Docker Hub 上,完成注冊后,可以推送自己的鏡像到倉庫中。
這里有兩種訪問可以創(chuàng)建和注冊一個 Docker Hub 賬戶:
1.通過網(wǎng)站,(https://hub.docker.com)
2.通過命令行
你可以通過使用命令行輸入?docker login?命令來創(chuàng)建一個 Docker Hub 賬號
#docker login
郵箱確認
一旦你填寫完畢表格,請查看你的電子郵件,通過點擊歡迎信息中的鏈接來激活您的賬戶。
基本思路:
首先注冊docker的賬戶,然后使用docker login登錄。使用docker push可以將自己的鏡像上傳上去了

如果有其他的倉庫,例如:
#docker push docker.sina.com.cn:5000/commit
9)用dcokerrmi移除本地images
docker? rmi? 鏡像名或鏡像id
注意:在刪除 images 之前要先用dockerrm刪掉依賴于這個 images 的容器
可以使用docker ps -a?
查看要刪除的images被那個容器使用著,所以需要先刪除這個容器,
使用docker? stop? 容器ID 停止容器
然后使用docker rm 容器ID 刪除這個容器
最后使用docker rmi? 鏡像ID刪除這個鏡像
停用全部運行中的容器:
docker? stop $(docker ps -q)
刪除全部容器:
docker? rm $(docker ps -aq)
可以加& 一起執(zhí)行
10)存出和載入鏡像
導出鏡像
docker save? ?-o? centos6.tar? ?centos:6
載入鏡像
docker? load --input? ? centos6.tar??
或者docker? load? < centos6.tar? (會導入鏡像以及相關的元數(shù)據(jù)信息,標簽等
三. docker容器
當利用docker run來創(chuàng)建并啟動容器時,Docker在后臺運行的標準操作包括:
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載。
利用鏡像創(chuàng)建并啟動一個容器。
分配一個文件系統(tǒng),并在只讀的鏡像層外面掛在一層可讀寫層。
從宿主主機配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去。
從地址池配置一個IP地址給容器。
執(zhí)行用戶指定的應用程序。
執(zhí)行完畢后容器被終止
1)新建容器
docker? run -i? -t centos:centos6 /bin/bash
-t? 選項讓 Docker 分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上,
?-i? 則讓容器的標準輸入保持打開(即交互式),可以使用—name給容器起個形象的名稱。

使用logout,exit或者ctrl+c? 退出容器,docker ps -a? 查看容器處于exit狀態(tài),正常退出的話,應該使用ctrl -p? + ctrl -q? 退出偽終端
下面的容器輸出一個“hello world ” ,之后終止容器

當利用docker run? 來創(chuàng)建容器時,Docker 在后臺運行的標準操作包括:
1.檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
2.利用鏡像創(chuàng)建并啟動一個容器
3.分配一個文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層
4.從宿主主機配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去
5.從地址池配置一個ip地址給容器
6.執(zhí)行用戶指定的應用程序
7.執(zhí)行完畢后容器被終止
2) 啟動容器
docker start 容器ID

終止容器
docker stop 容器ID
docker? kill? 容器ID
重啟容器
docker restart 容器ID
守護態(tài)運行,
docker? ?run? -d? -t centos:centos6? /bin/bash

容器啟動后會返回一個唯一的 id,也可以通過dockerps命令來查看容器信息。
1.docker run -d 運行提個新的容器,我們通過-d 命令讓他作為一個后臺運行
2.centos:centos6 是一個我們想要在內(nèi)部運行命令的鏡像
3./bin/sh -c 是我們想要在容器內(nèi)部運行的命令
4.while true; do echo hello weibo;
sleep 1; done 這是一個簡單的腳本,我們僅僅只是每秒打印一次 hello word 一直到我們結束它
使用docker? ?inspect 容器iD 查看容器信息
使用docker? ?inspect? 查看容器的ip地址

3) 進入容器
docker? ?attach? 容器ID
使用以下命令打開容器的交互界面
$ docker? exec -it 容器ID /bin/bash
進使用-d參數(shù)時,容器會進入后臺運行,需要進入容器操作時,可以使用docker attach? 命令 或者nsenter命令


1.docker attach 允許我們進入后臺進程.
2.--sig-proxy=false 不使用容器轉發(fā)信號,允許我們使用 ctrl -c 來退出,執(zhí)行dockerps查看在后臺運行
但是使用? attach? 命令有時候并不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執(zhí)行操作了。
也可以執(zhí)行docker exec進入運行的容器
docker? exec?-it? 容器ID/名稱/bin/bash
以上命令返回一個命令界面,exec代表直接在容器中運行命令
4) 容器的導入和導出
導出容器
docker? export 容器ID? > 導出文件

導入容器
可以使用docker import? 從容器快照文件中再導入為鏡像
# catcentos6.tar | docker import – centos6:test
此外,也可以通過指定 URL 或者某個目錄來導入,例如
#docker
import http://example.com/exampleimage.tgzexample/imagerepo
*注:用戶既可以使用docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用docker import 來導入一個容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當時的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標簽等元數(shù)據(jù)信息
刪除容器
使用docker rm? ?只能刪除一個處于停止狀態(tài)的容器
加 -f? 參數(shù),可以刪除正在運行的容器
docker? ?rm? ?[容器ID/容器name]??
批量刪除
docker rm $(docker ps -a -q)??