Docker簡介
1、什么是容器(虛擬機通過中間層將一臺或者多臺虛擬機運行在物理硬件之上,容器直接運行在操作系統內核之上,容器也叫做操作系統虛擬化)
依托Linux內核功能的虛擬化技術
依賴于Linux內核特性,Namespace和Cgroups
2、docker特點
提供簡單清亮的建模方式
職責的邏輯分離
職責的落地分離
快速高效的開發生命周期
鼓勵使用面向服務的架構
3、docker的使用場景
使用docker容器開發、測試、部署服務(輕量 開發環境部署 提交至私有庫 測試環境下載)
創建隔離的運行環境(同一服務不同版本可能服務不同客戶)
搭建測試環境(學習成本下降)
4、docker的基本組成
客戶端/守護進程
CS架構
本地/遠程
鏡像(構建和打包階段)
容器的基石
層疊的只讀文件系統
1層,引導文件系統bootfs
2層,root文件系統 加載更多的只讀文件
聯合加載 指一次同時加載許多個文件系統,將各層文件系統疊加在一起,最終的文件將包含所有的底層文件和目錄,docker將這樣的文件系統稱為鏡像
寫實復制
當一個容器啟動時,docker會在最頂層加一個讀寫層,第一次啟動的初始的讀寫層是空的,如果想修改文件,會先從制度成復制到讀寫層,只讀層版本依然存在,創建一個新容器時,讀寫層+鏡像=容器
倉庫
公有(dockerHub)
私有
5、Docker的主要特性如下
文件系統隔離:每個進程容器運行在完全獨立的根文件系統里
資源隔離:可以使用cgroup為每個進程容器分配不同的系統資源,例如cpu和內存
網絡隔離:每個進程容器運行在自己的網絡命名空間里,擁有自己的虛擬接口和IP地址
寫實復制:采用寫實復制方式創根文件系統,這讓部署變得極其快捷,并且節省內存和硬盤空間。
日志記錄:Docker將會收集和記錄每個進程容器的標準流(stdout/stderr/stdin),用于實時檢索或批量檢索
變更管理:容器文件系統的變更可以提交至新的映像中,并可重復使用以創建更多的容器。無需使用模板或者手動配置。
交互式Shell:Docker可以分配一個虛擬終端并關聯到任何容器的標準輸入上,例如運行一個一次性交互shell
6、Docker客戶端和守護進程
Docker守護進程
service docker stop
service docker start
service docker restart
docker -d [options]
# -d 以守護進程運行
# 啟動配置項
/etc/default/docker
# docker的啟動選項
tcp
uninx
soketfd
7、Docker容器
容器的基本操作
docker run IMAGE [COMMAND][ARG...]
# run在新容器中執行命令
docker run -i -t IMAGE /bin/bash
# -i --interactive 為容器始終打開標準輸入
# -t --tty=true 創建一個偽tty終端
# --name 自動以容器名字
查看容器
docker ps [-a][-l]
# 不指定參數默認返回正在運行的容器
# -a列出所有容器
# -l列出最新創建的一個容器
docker inspect [name][id]
重新啟動已經停止的容器
docker start [-i] 容器名
刪除停止的容器
docker rm [name][id]
# -f 強制刪除
守護式容器
能夠長期運行
沒有交互式回話
使用運行應用程序和服務
ctrl+c/ctrl+p退出不影響
docker run -d 鏡像名 [COMMAND][ARG]
# -d使用后臺的方式啟動
附加到運行中的容器
docker attach ID/NAME
查看容器日志
docker logs [-f][-t][--tail]
# -f 一直跟蹤日志變化并返回結果
# -t 在返回結果上加上時間戳
# --tail 返回結尾處多少數量的日志,默認返回所有
查看容器內進程
docker top [name]
在運行中的容器內啟動新的進程
docker exec [-d][-i][-t] 容器名 [COMMAND][ARG...]
停止守護式容器
docker stop 容器名 # 發送信號等待停止
docker kill 容器名 # 直接停止
docker部署靜態網站
# 端口映射
run [-P][-p]
# -P 隨機映射端口
# -p 指定端口映射
鏡像與倉庫
查看和刪除鏡像
docker images [OPTIONS][REPOSITORY]
# -a 顯示所有鏡像
# -f 過濾條件
# --no-trunc 不使用截斷形式顯示數據,默認是截斷唯一id
# -q 是顯示唯一id
docker rmi [OPTIONS] IMAGE [IMAGES...]
# -f 強制刪除
# --no-prue=false 保留未打開標簽的父鏡像
# 刪除所有鏡像
docker rmi $(docker image -q)
# 查看鏡像的存儲目錄和文件
tree /opt/data/registestry/repositories/
獲取鏡像
# 查找鏡像
# Docker Hub
docker search [OPTIONS] TEAM
# --automated 只顯示自動化構建的鏡像
# --no-trunc 不適用截斷形式顯示數據,默認是截斷唯一id的
# -s 限制顯示結果的最低星級
拉取鏡像
docker pull
# -a,--a-tags 將所有匹配標記的都下載
# 使用--registty-mirror(提高下載速度)
# 1.修改:/etc/default/docker
# 2.添加:DOCKER_OPTS="--registry-mirror=本地鏡像的連接"
推送鏡像
docker push 鏡像
構建鏡像
1.保存對容器的修改,并在此使用
2.自定義容器的能力
3.以軟件的形式打包并分發服務及其運行環境
docker commit # 通過容器構建
docker commit [OPTION] CONTAINER [REPOSITROY[:TAG]]
# -a 指定鏡像作者
# -m 記錄鏡像的構建信息
# -p 指示commit命令可以不暫停上傳
docker build # 通過Dockerfile文件構建
# 1.FROM
FROM <image>
FROM <image>:<tag>
# 必須是已經存在的鏡像
# 2.MAINTAINER(作者信息)
# 包含鏡像的作者,所有者和聯系信息
# 3.RUN
# 指定當前鏡像中運行的命令
RUN <command> (shell模式)
# 4.CMD(容器運行時運行的)
# 5.EXPOSE
# 指定運行該鏡像的容器使用的端口
# 6.ENV
ENV REFERSH_DATE 2016-07-25(多次執行時,更改時間,則會帶來此條以下命令刷新緩存)
# 7.ADD(提供tar解壓功能)
ADD <src> <dest>
# 8.COPY(淡出能提供復制)
COPY <scr> <dest>
# 9.ENTRYPOINT
# 不會被docker run中的啟動命令所覆蓋
# 10.VOLUME
VOLUME["/data"]
# 向基于鏡像創建的容器添加卷
# 11.USER
# 指定鏡像會以什么樣的用戶運行(不指定用戶默認以root)
# 12.WORDIR
# 從鏡像創建一個新容器時,在容器內部設置工作目錄
# 13.ONBUILD
# 鏡像出發器(當一個鏡像被其他鏡像作為基礎鏡像時執行)
# buil命令
docker build [OPTIONS] PATH |URL| -
# --force-rm
# --no-cache 跳過構建緩存
# --pull
# -q 不顯示構建過程
# --rm
# -t
Dockerfile構建過程
- 從基礎鏡像運行一個容器
- 指定一條命令,對容器作出修改
- 執行類似commit的操作,提交一個新的鏡像層
- 再基于剛提交的鏡像云心給一個新容器
- 執行Dockerfile中的下一條指令,直至所有的指令執行完畢
構建緩存
- --no-cache 跳過構建緩存
- 查看鏡像構建過程
docker history [image]
Docker容器的網絡連接
Linux虛擬網橋(docker0)
可以設置ip地址
相當于擁有一個隱藏的虛擬網卡
添加虛擬網橋
sudo brctl addbr br0
修改docker0地址
sudo ifconfig docker0 192.168.100.1 netmask 255.255.255.0
修改docker守護進程的啟動配置
/etc/default/docker 中添加DOCKER_OPS值 -b=br0
重啟守護進程
docker容器的互聯
--icc=true #默認false(拒絕所有容器間的互聯)
--link
docker run --link=[CONTAINER_NAME]:[ALIAS][IMAGE][COMMOND0]
# 允許特定的連接
--icc=false
--iptable=true
--link
docker容器與外部網絡的連接
ip_forward
Linux系統的一個變量,值決定系統是否會轉發流量
sysctl net.ipv4.conf.all.forwarding = 1(允許流量轉發)
iptables
iptables是基于Linux內核集成的包過濾防火墻系統,幾乎所有的Linux發行版都會包含iptables的功能
允許端口映射訪問
限制IP訪問容器
8、Docker容器的數據卷
什么是數據卷(Data Volume)
數據卷設計的目的,在于數據的持久化,它完全獨立于容器的生成周期,因此Docker不會再容器刪除時刪除其掛在的數據卷,也不會存在類似垃圾回收機制,對容器醫用的數據卷進行處理
docker的數據卷是獨立于docker的存在,它存在于docker host,與docker容器的生成周期分離
docker數據卷存在于docker宿主機的文件系統
docker數據卷可以使目錄頁可以使用文件
docker容器可以利用數據卷的技術與宿主機進行數據共享
同一目錄或者文件可以支持多個容器訪問,實現了容器間數據的共享和交換
數據卷的特點
數據卷在容器啟動時初始化,如果容器在使用鏡像掛在點包含了數據,這些數據會拷貝至初始化的數據卷中。
數據卷可以在容器里的內容直接進行修改
數據卷的變化不會影響鏡像的更新
卷會一直存在,即使掛載的容器已經被刪除
為容器添加數據卷
docker run -v 本機目錄:容器映射目錄名 -it ubuntu /bin/bash
docker的數據卷容器
命令的容器掛載數據卷,其他容器通過掛載這個容器實現數據共享,掛載數據卷的容器,就叫做數據卷容器
掛載數據卷容器的方法
docker run --volume-from [CONTAINER NAME]
在docker中,如果一個數據卷還在被容器使用,它就會一直存在。使用數據卷容器掛載數據,實際上此容器起到的作用,僅僅是將數據卷的配置傳遞到新容器中。
docker數據卷的備份還原操作(ubuntu)
數據備份方法
# 需要備份容器name,存放的本地backup目錄
docker run --volumes-from [container name] -v$(pwd):backup ubuntu
tar cvf /backup/backup.tar [container data volume] # 需要備份的目錄
數據還原方法
# 需要還原的容器name,存放的本地backup目錄
docker run --volume-from [container name] v$(pwd):backup ubuntu
tar xvf /backup/backup.tar [container data volume] # 還原的目錄