Docker
Docker 是一個開源的應用容器引擎, docker將應用程序與程序的依賴,打包在一個文件裏面。運行這個文件就會生成一個虛擬容器。程序運行在虛擬容器裏,如同在真實物理機上運行一樣,有了docker,就不用擔心環境問題了。
docker與虛擬機的區別
特性 | 容器 | 虛擬機 |
---|---|---|
啓動 | 秒級 | 分鐘級 |
硬盤使用 | 一般爲 MB | 一般爲 GB |
性能 | 接近原生 | 弱 |
系統支持量 | 單機支持上千個容器 | 一般幾十個 |
docker的應用場景
web應用的自動化打包和發佈
自動化測試和持續集成、發佈
在服務型環境中部署和調整數據庫或其他應用
docker容器的優勢
1.更高效的利用系統資源
由於容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統 資源的利用率更高。
無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳 統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運 行更多數量的應用。
2.更快速的啓動時間
傳統的虛擬機技術啓動應用服務往往需要數分鐘,而 Docker 容器應用,由於直接 運行於宿主內核,無需啓動完整的操作系統,因此可以做到秒級、甚至毫秒級的啓 動時間。大大的節約了開發、測試、部署的時間。
3.一致的運行環境
開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環 境不一致,導致有些 bug 並未在開發過程中被發現。
而 Docker 的鏡像提供了除內 核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼 在我機器上沒問題啊” 這類問題。
4.更輕鬆的遷移
由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在 很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。
因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一 個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況。
docker三大概念
docker鏡像
Docker鏡像就是一個只讀的模板。鏡像可以用來創建Docker容器。
image的分層存儲
因爲鏡像包含完整的root文件系統,體積是非常龐大的,因此docker在設計時按照Union FS的技術,將其設計爲分層存儲的架構。
鏡像不是ISO那種完整的打包文件,鏡像只是一個虛擬的概念,他不是一個完整的文件,而是由一組文件組成,或者多組文件系統聯合組成。
docker容器(container)
容器是從鏡像創建的運行實例。它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的,保證安全的平臺。
docker倉庫(repository)
倉庫是集中存放鏡像文件的場所。分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。
使用Docker
安裝docker
yum install docker-server docker -y
檢查docker版本
docker version
啓動docker
systemctl start docker
docker鏡像加速器
https://www.daocloud.io/mirror#accelerator-doc
在 /etc/docker/daemon.json文件寫入如下配置
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
重啓docker
systemctl restart docker
docker命令
搜索鏡像
docker search name
下載鏡像
docker pull name
查看本地所有的鏡像
docker image ls
運行鏡像,生成容器
docker run 鏡像id
刪除鏡像
# 必須清除所有的容器記錄依賴
docker rmi 鏡像id
#批量刪除鏡像記錄
docker rmi `docker images -aq`
運行容器 ,進入容器空間
docker run -it centos /bin/bash
#-i 是交互式的操作
#-t 是開啓一個終端
刪除容器記錄
# 必須是掛掉的記錄才能刪除
docker rm 容器id
#批量刪除容器記錄
docker rm `docker ps -aq`
更新容器鏡像
docker commit 容器id 新的鏡像名
查看正在運行的容器
docker ps
查看所有運行過的容器
docker ps -a
導出本地docker鏡像
docker save 容器id > 鏡像壓縮文件
導入docker鏡像文件
docker load < 鏡像壓縮文件
修改docker鏡像名字
docker tag 鏡像id 新的鏡像名
後臺運行容器
docker run -d --name hello centos /bin/sh -c "while true;do echo hello; sleep 1;done"
# --name 容器名字
# -d 後臺運行
# /bin/sh Linux的shell解釋器
# -c 指定一段shell腳本
運行一個web程序,在容器中對外進行端口暴露
docker run -d -p 8090:5000 training/webapp python app.py
# -d 後臺運行
# -p 指定端口映射 宿主機/容器
# -P 隨機端口映射,.宿主機會隨機生成一個端口
查看docker的端口轉發情況
查看docker的端口轉發情況
暫停正在運行的容器
docker stop 容器id
再次運行容器
docker start 容器id
查看容器內所有的日誌
docker logs -f 容器id
# -f 實時刷新
進入一個運行中的容器
docker exec -it 容器id /bin/bash
dockerfile
鏡像是容器的基礎,每次執行docker run的時候都會指定鏡像作爲容器運行的基礎。當docker hub的鏡像無法滿足我們的需求時,就得自定製這些鏡像。鏡像的定製就是定製每一層所添加的配置、文件。如果可以吧每一層修改、安裝、構建、操作的命令都寫入到一個腳本,用腳本來構建、定製鏡像,這個腳本就是dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
dockerfile命令
FROM centos
# 指定docker鏡像操作系統
LABEL version=“1.0”
# 容器元信息,幫助信息,Metadata,類似於代碼註釋
RUN echo a
# RUN指令是一個完成指令,運行指定指令
WORKDIR /root
# 切換工作目錄,儘量使用絕對路徑,如果路徑不存在會自動創建目錄
ADD newfile.tar.gz /tmp/
# 把本地文件添加到鏡像中的指定目錄,並解壓
COPY newfile.tar.gz /tmp/
# 把本地文件添加到鏡像中的指定目錄
ENV MYSQL_VERSION 5.6
# 類似創建變量,增加可維護性
# RUN yum install -y mysql-server=“${MYSQL_VERSION}”
自定義flask的Dockerfile示例
flask代碼:
#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
return "hello word"
if __name__=="__main__":
app.run(host='0.0.0.0',port=8080)
編寫Dockerfile,名字是固定的
FROM python #指定以python爲基礎鏡像,它提供了python3
RUN pip3 install flask # 在容器內安裝flask
ADD s24flask.py /tmp/ #添加代碼到容器中
WORKDIR /tmp/ #切換工作目錄
CMD ["python","s24flask.py"]#通過CMD指令,讓容器運行命令 是 python s24flask.py
執行構建命令
docker build .
# 自動檢測當前目錄下的Dockerfile並構建成鏡像
執行鏡像文件,生成容器示例
docker run -d -p 9999:8080 5e7
docker hub倉庫
公有鏡像發佈
登陸docker hub
docker login
推送鏡像到dockerhub
# 注意要保證鏡像的tag是賬戶名,如果鏡像名字不對,需要改一下tag
docker push test/centps-cmd-exec:latest
下載鏡像
docker pull test/centos-entrypoint-exec
私有鏡像倉庫
下載registry鏡像並且啓動私有倉庫容器
私有倉庫會被創建在容器的/var/lib/registry下,因此通過-v參數將鏡像文件存儲到本地的/opt/data/registry下
端口映射容器中的5000端口到宿主機的5000端口
docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
推送鏡像到私有鏡像倉庫
私有倉庫,默認只支持http方式的推送,不支持https加密的推送,需要修改配置文件支持http形式的推送
1.修改docker的配置文件,添加如下配置
{
"insecure-registries":["ip地址:5000"]
}
2.修改docker的加載配置文件
vim /lib/systemd/system/docker.service
[Service]
Type=notify
NotifyAccess=main
#添加如下一行配置
EnvironmentFile=-/etc/docker/daemon.json
3.重啓docker
systemctl daemon-reload
systemctl restart docker
4.重新運行私有倉庫的鏡像
docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
#--privileged=true 以特權運行docker倉庫
5.推送鏡像
需要修改鏡像名稱
ip地址:5000/原鏡像名稱
推送鏡像
docker push ip地址:5000/原鏡像名稱
6.下載鏡像
docker pull ip地址:5000/原鏡像名稱