【linux】docker

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倉庫

公有鏡像發佈

https://hub.docker.com/

登陸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/原鏡像名稱
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章