安裝
http://www.linuxidc.com/Linux/2014-01/95513.htm
根據上面安裝之後,啓動不起來。yum update device-mapper* 之後啓動ok.
linux與docker版本的兼容性問題
uname -r
yum update
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install docker-ce
systemctl start docker
systemctl enable docker
docker version
鏡像刪除不了辦法:
- cd /var/lib/docker/image/overlay2
- cat repositories.json
{"Repositories":{}} - rm imagedb/content/sha256/*
- rm layerdb/sha256/*
-
systemctl restart docker
概念
hostos:宿主機操作系統
guestos:虛擬機操作系統
一、主機級別虛擬化
1.完全虛擬化:vmware,kvm,xen(hvm)
|---guestos--------------|
|--------vmm-------------|
|----------hostos--------|
|------------hardware----|
2.半虛擬化:xen,uml
hypervisor(vmm)直接運行在硬件層
|---guestos(modfiled)----|
|--------vmm-------------|
|------------hardware----|
3.模擬:qemu
二、用戶空間虛擬化(容器)
lxc,openvz,solaris containers,freebsd jails
三、庫虛擬化
wine cygwin
四、應用程序虛擬化
jvm,pvm
用戶空間虛擬化(容器)
chroot+6個名稱空間+cgroups=容器
lxc,openvz,solaris containers,freebsd jails
隔離:namespace名稱空間
uts(主機名域名),mount,ipc,pid,user,net
其中user是內核3.8以後才加進內核
control groups(cgroups):是Linux內核提供的進程資源限制機制,對資源進行分組。
lxc-linux container
docker 是lxc的增強版
分層聯合掛載:每層都是隻讀,比如系統一層,應用一層。每層疊加放入容器。寫的時候在頂層加一層可以讀寫層。刪只讀層東西就是標記不可見。每個容器共享只讀層。
遷移,容器內部不要保存有效數據,需要的話掛載外網分佈式系統。
基礎用法
docker 架構:c/s架構
他們直接通信使用https/http 默認https.
client:docker build
docker pull
docker run
docker host: docker deamon
containers
images
registry: 認證+倉庫+其他 組成
倉庫:倉庫名+標籤唯一標識一個鏡像(nginx:1.1/nginx:latest;nginx:1.0/nginx:stable)
鏡像:靜態
容器:動態,有生命週期
docker 對象:images,containers,networks,volumes,plugins 這些對象都可以增刪改查。
安裝:內核3.10+ 必須大於3.8
yum install docker-ce #注意,使用extras裏的是yum install docker
systemctl start docker.service
配置文件:/etc/docker/daemon.json
docker鏡像加速:
docker cn
阿里雲加速器
中國科技大學
cat /etc/docker/daemon.json 顯示如下內容:
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
docker命令:
格式1: docker 命令
格式2:docker 分組 命令
docker version
docker info
docker search nginx
docker image pull nginx:1.14-alpine
docker image ls
docker image ls --no-trunc #顯示完整image id信息
docker image rm nignx:1.14-alpine # docker rmi
docker containers create
docker containers start
docker containers stop
docker containers kill
docker containers rm
docker containers run #創建並運行
docker run [options] image [command line] [arg..]
docker run --name wbl -it busybox:latest #i,t是終端交互模式
docker run --name wbl2 -d busybox:latest #-d是後臺運行模式
docker network ls
docker ps #查看容器列表
docker ps -a #查看停止後的容器列表
docker container ls
docker container ls -a
docker run -a # -a, --attach=[], 登錄容器(必須是以docker run -d啓動的容器)
docker inspect wbl #查看容器詳細信息
docker start -ai wbl #a是attach,i是交互。啓動容器
docker kill wbl #相當於-9
docker rm wbl #刪除
#注意:容器中程序不能運行在後臺,否則會終止
docker exec -it wbl /bin/sh #進入正在運行的容器
docker logs wbl #查看容器裏日誌,容器裏進程日誌不存文件而是輸出到控制檯。
鏡像介紹:
docker鏡像含有啓動容器所需文件系統及其內容。用於創建啓動鏡像。
docker鏡像採用分層機制:bootfs和rootfs
bootfs:是引導文件系統,包括bootloader和kernel,容器啓動完成後就卸載了。
rootfs: 在bootfs之上,表現爲docker容器的根文件系統,掛載爲只讀模式,而後通過聯合掛載一個外掛載可寫層。
啓動時候先從底層一層層聯合掛載,只讀的並是與其他容器共享的。最頂層是可寫層。刪除容器時可寫層一併刪除。
聯合掛載需要專用分層文件系統:aufs,overlayfs,overlay2fs,btrfs,devicemapper
docker info 可以查看存儲類型
啓動容器時,docker daemon 會試圖從本地獲取相關鏡像,本地鏡像不存在,將從registry中下載該鏡像並保存到本地。
docker client -----http----> docker daemon ----https-> docker registry
docker registry分類:
sponsor registry:第三方,供客戶和docker社區使用
mirror registry: 第三方,只讓客戶使用
vendor registry: 由發佈docker鏡像的供應商提供
private registry: 自建的有防火牆的安全的私有實體提供的。
registry 組成:
1)repository
一個registry有多個倉庫,一個倉庫可以分爲頂層倉庫(比如nginx)和用戶倉庫(wbl/nginx),每個倉庫還可以有多個tag
2)index
維護用戶賬戶,鏡像的校驗以及公共信息。爲registry提供用戶檢索功能。
docker registry中鏡像通常有開發人員製作,而後推送公共或私有registry保存,以供其他人員使用。
docker hub功能:
image repositories:
automated builds: 可以基於dockerfile;也可以commit
webhooks:
organizations:
dcoker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
git -> git hub -> docker hub -> docker repository
其他鏡像倉庫:quay.io : docker pull quay.io/coreos/flannel
鏡像生成途徑:
dockerfile
基於容器製作
docker hub automated builds
dockerfile------------build---------> images ----------push-------> docker registry
images <---------pull-------- docker registry
images ----------save--------> backup.tar
images <----------load-------- backup.tar
images -----------run--------> container
images <----------commit------ container
基於容器製作:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -p wbl nginx/wbl:v1.1.1 #-p 是暫停
docker commit -a "wbl" -c 'CMD ["/bin/httpd","-f","-h","/data/www"]' -p 基於鏡像名 新鏡像名和tag
push到docker-hub:
docker login -u wbl1232002a
[root@iZj6chmozc373fzvc4vs9sZ docker]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx/wbl v.wbl.1 219619953381 2 days ago 16.8MB
nginxdemos/hello latest aedf47d433f1 18 months ago 16.8MB
docker tag nginx/wbl:v.wbl.1 wbl1232002a/nginx-wbl:v.wbl.1 #注意上傳的倉庫名需要和docker-hub一樣。
docker push wbl1232002a/nginx-wbl
鏡像的導入和導出:docker save 和 docker load
docker save -o aaa.gz image1 image2
docker load -i aaa.gz
docker網絡
docker network ls #查看docker的網絡模式,橋接,僅主機
docker network inspect bridge
查看網卡相關命令:ifconfig ; brctl show ; ip link show #yum install bridge-utils
疊加網絡 overlay network :使用隧道技術,在原有包外再封裝一層物理網卡的包。
bridge 橋接模式:
docker 啓動後會創建一個docker0的交換機默認是橋接模式,還會默認配置好ip。docker創建容器後,會分配一對網卡,一半連接容器,一半連接docker0交換機。
並且自動修改防火牆添加nat
容器 eth0---->vethxx docker0 (nat)-----> 物理機網卡ip #開啓ip forward
host模式: 容器共享宿主機的物理網卡ip,容器裏的ip就是外網物理ip
user,mount,pid
---> 共享(宿主機)的uts,net,ipc
user,mount,pid
container模式:
user,mount,pid
---> 共享(容器)的uts,net,ipc
user,mount,pid
封閉模式none: 容器沒有network namespace,只有lo口。保證的容器的安全。
ip命令:ip netns help
ip netns add r1 #創建一個網絡命名空間名字是r1
ip netns exec r1 ifconfig -a #在r1裏執行命令查看網卡信息
ip link help
ip link show
ip link add name veth1.1 type veth peer name veth1.2 #創建一對網卡
ip link set dev veth1.1 netns r1 #將網卡veth1.1 移到網絡命名空間r1
ip netns exec r1 ifconfig -a
ip netns exec r1 ip link set dev veth1.1 name eth0 #更改namesapce r1裏網卡名稱
ip netns exec r1 ifconfig eth0 192.168.5.1/24 up
docker 命令參數 暴露端口
bridge橋接模式:
docker port wbl #顯示指定容器的映射。
docker -p #映射容器端口到物理端口地址 -p 80 容器80映射到物理網卡隨機端口。
docker -P #大P,將容器所有要暴露端口全部映射到主機端口。容器是80,宿主機就是80.
docker run wbl:v.1 --name wbl2 -p hostip::80 #映射物理ip端口隨機 到容器的80
docker run wbl:v.1 --name wbl2 -p hostip:80:80 #映射物理ip端口80 到容器的80
docker run wbl:v.1 --name wbl2 -p 80:80 #映射物理所有ip端口80 到容器的80
host模式:
docker run wbl:v.1 --name wbl2 --network host
container模式:
docker run wbl:v.1 --name wbl2 --network container:wbl1 #共享容器wbl1的網絡命名空間
none:
docker run wbl:v.1 --name wbl2 --network none
修改docker0橋默認的ip地址: vi /etc/docker/demon.json
{
"registry-mirrors" : ["https://registry.docker-cn.com"],
"bip" : "192.168.74.1/24",
"hosts" : ["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"
}
systemctl daemon-reload
systemctl restart docker
重啓docker 服務器即可。
自定義網絡模式:
- 創建網絡
docker network create wbl --subnet 192.168.75.0/24 #網關默認就是第一個ip - 使用網絡
docker run -tid --name t8800 --network wbl nginx:v.8800
存儲卷
cow:寫時複製 ,就是在修改寫入只讀層數據時候,先複製數據到可寫層,然後修改數據。
刪除數據:就是標誌只讀層數據爲刪除。然後用戶層不可見。
爲什麼使用volume:
- 關閉並重啓容器,數據不受影響,但是刪除docker容器,則其更改會全部丟失。
- 存儲於聯合文件系統中,不易於宿主機訪問。
- 容器之間數據共享不便
-
刪除容器數據丟失
解決方案:使用卷volume
通過外部掛載到容器目錄方式。volume卷類型:
- 手動創建容器和宿主機的目錄,並掛載
-
手動創建容器目錄,docker自動管理掛載宿主機目錄。/var/lib/docker/vfs/<some volume>
這種方式,如果刪除容器後再啓動,docker再次自動掛載的目錄可能和上次不一樣。因此數據不一樣。命令:
docker run -it --name wbl123 -v /data nginx:v1.1 #-v 指定容器目錄,自動創建宿主機上的卷並掛載
docker run -it -v 宿主機dir:容器dir --name wbl123 nginx:v1.1 #手動指定方式;兩邊目錄不存在都會自動創建;hostdir 是宿主機目錄:容器目錄
docker inspect -f {{.Mounts}} wbl123 #查看詳細內容,-f是指定,過濾意思
docker run -it --rm --name wbl0 -v /data/wbl0:/data/wbl0 nginx-wbl:v8800 ls /datasharing volumes複製其他容器的卷: docker run -it --name wbl1 -v /wbl:/data nginx:v.1.1 docker run -it --name wbl3 --volumes-from wbl1 nginx:v.1.1 docker run -it --name wbl4 --network container:wbl --volumes-from wbl1 nginx:v.1.1 #可以使用一個容器做基礎容器。只有存在就好。
Dockerfile: 命令 docker build #docker build -t wbl:v.1 .
前導:
想改變nginx的配置文件三種方式:{1:進入容器修改;2:容器的掛載卷使用宿主機;3:自己製作鏡像}
自己製作鏡像有兩種方式:{1:基於容器自制鏡像;2:基於Dockerfile自制鏡像}
dockerfile格式:{指令:參數}#指令不區分大小寫,但是潛規則都是大寫。
工作邏輯:
創建一個專用工作目錄wbl; wbl目錄裏要有文件Dockerfile(首字母必須大寫,沒有後綴),所有文件都需要放入wbl目錄不能是wbl的父目錄。
隱藏文件.dockeringore可以排除目錄文件,一行一個,可以使用通配符。
docker build: 基於wbl目錄裏的基礎鏡像和文件,隱藏啓動一個容器,然後製作成新的鏡像,和人工製作鏡像雷同。
docker 指令:
FROM: 必須爲dockerfile第一個非註釋行,引用基於哪個基礎鏡像來製作鏡像。後續所有指令運行都是基於此鏡像提供的環境。
docker build的時候它會先在主機本地查找,不存在會從docker hub registry拉取
語法:FROM 倉庫名:tag #沒有tag就是latest
FROM 倉庫名@digest #爲了安全使用hash碼
MAINTAINER: 作者信息
LABEL: 高版本代替maintainer
LABLE KEY=VALUE #LABLE maintainer="wbl"
COPY: 從宿主機的當前wbl目錄裏的文件複製到創建的新鏡像中
COPY aaa /data/aaa2
COPY ["aaa","/data/aaa2"] #目標使用絕對路徑,否則,COPY指定以WORKDIR爲起始路徑;源文件是目錄的話,子目錄和文件會遞歸複製,但是目錄本身
# 不會複製
#如果源目錄是多個或者使用通配符,目標必須是目錄,並且以/結尾
#如果目標目錄不存在,會自動創建
ADD: 類似COPY,支持打包壓縮和url路徑。
例如: ADD http://www.aaa.com/a.tar.gz /data/wbl/ #a.tar.gz 會下載到/data/wbl 目錄下,不展開
ADD a.tar.gz /data/wbl/ #a.tar.gz 會自動解壓展開到/data/wbl目錄下。
WORKDIR:/data/wbl # ADD a.tar.gz ./ workdir相當於根路徑
VOLUME:鏡像裏的哪個掛載路徑到宿主機上 # VOLUME /data/wbl 意思是把容量裏/data/wbl目錄 的卷使用的是宿主機的卷。docker inspect 查看
EXPOSE:指定暴露給外部的端口。只有指定了之後,在啓動容器時候加-P纔可以暴露出去。
一次可以指定多個端口
EXPOSE 11211/udp 11211/tcp #不加協助默認tcp
ENV: 定義環境變量
ENV key value #wbl=123 ;如果value包括空格,可以\轉義,也可以對value加引號,另外\也可以續行
ENV key=valude #wbl 123 456 ; 123 456 都是變量 調用${wbl}
EVN DOC_ROOT=/data/wbl/ \
NAME=wbl
啓動容器時候,可以傳入變量
docker run --name wbl --rm -P 鏡像名 printenv #打印環境變量
docker run --name wbl --rm -P -e NAME="WBL2" 鏡像名 printenv
文件----docker build{RUN}---->image ------docker run{CMD}------>容器 #RUN是生成鏡像時候運行命令。鏡像生成後運行爲容器時候RUN裏命令不再執行的。CMD會執行。
RUN: 使用在製作鏡像的過程中所要運行命令,基於基礎鏡像環境的命令。
語法:
RUN commad
RUN ["commad","param1","param2"]
RUN COMMAND1 && \
COMMAND2
RUN yum install -y lrzsz
說明:第一種通常是一個shell命令,以"/bin/sh -c"運行它,在容器進程pid不爲1,不能接收unix信號,docker stop 停止容器時,此進程接收不到信號。
第二種是json格式數組,這種格式命令不會以/bin/sh -c 發起運行。因此常見shell操作比如通配符不會起作用。想使用shell操作可以使用下面寫法
RUN ["/bin/bash","-c","commad","param1"]
CMD: 類似RUN,啓動容器指定默認要運行程序,且運行結束後容器也終止,CMD指定命令會被docker run的命令選項覆蓋。
和RUN的區別是:{1,運行時間點不同(RUN是docker build成鏡像時候運行;CMD是docker run成容器時候執行,這個時候RUN裏運行命令已經生成靜態的鏡像了。);
2,運行命令次數不同(RUN可以多次,CMD只有最後一次生效)}
語法:CMD command
CMD ["command","param1","param2"]
CMD ["param1","param2"]
第三種用於爲ENTRYPOINT指令提供默認參數