Docker快速入門(上)
docker介紹與安裝
介紹
Docker 是一個開源的應用容器引擎,你可以將其理解為一個輕量級的虛擬機器,開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上。
docker的優勢或者特點
1. 更高效的利用系統資源
2. 更快速的啟動時間
3. 一致的執行環境
4. 持續交付和部署
5. 更輕鬆的遷移
6. 更輕鬆的維護和擴充套件
對比傳統虛擬機器總結
特性 | 容器 | 虛擬機器 |
---|---|---|
啟動 | 秒級 | 分鐘即 |
硬碟使用 | 一般為MB | 一般為GB |
效能 | 接近原生 | 弱於 |
系統支援量 | 單機支援上千個容器 | 一般幾十個 |
Docker的主要用途,目前有三大類
1. 提供一次性的環境.比如,本地測試他人的軟體、持續整合的時候提供單元測試和構建的環境. 2. 提供彈性的雲服務.因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容. 3. 組建微服務架構.通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構.
docker的擴容與縮容
對於我們的系統來說在專案執行過程中會存在這最高峰值,和最低峰值;
整個專案執行過程中並不是一直是平穩的訪問,對於這種時候如果說一次性就部署N個機器但是實際上只有在某幾個時候有高峰期其餘時間沒有就會顯得比較浪費,
這個時候如果說通過docker虛擬多個機器,然後通過多docker進行控制啟動與停止實現擴容和縮容
1. 加速本地開發。通過Docker能夠快速搭建好開發和執行環境,並且該環境可以直接傳遞
2. 給測試和產品部署。
3. 自動打包和部署應用。
4. 建立輕量、私有的PaaS環境。
5. 自動化測試和持續整合/部署。
6. 部署並擴充套件Web應用、資料庫和後端伺服器。
7. 建立安全沙盒
docker的應用範圍
安裝
本次安裝的docker版本為docker-ce-18.03.1.ce,系統版本centos7
#1、更新update到最新的版本
yum update
#2、解除安裝老版本docker
yum remove docker docker-common docker-selinux docker-engine
#3、安裝需要的軟體包
yum install -y yum-utils device-mapper-persistent-data lvm2
#4、設定yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#5、檢視docker版本
yum list docker-ce --showduplicates|sort -r
#6、安裝docker
yum install docker-ce-18.03.1.ce -y
#7、啟動docker
systemctl start docker
#8、加入開機自啟
systemctl enable docker
#9、配置國內映象
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://cr.console.aliyun.com/"]
}
#10、重啟docker
systemctl start docker.service
#11.查詢docker執行狀態
ps -aux | grep docker
docker執行狀態
docker常用的基本命令介紹
查詢docker映象資訊
命令: docker images
執行結果:
名稱 | 含義 |
---|---|
REPOSITORY | 映象名稱 |
TAG | 映象標籤 |
IMAGE ID | 映象ID |
CREATED | 映象建立時間 |
SIZE | 映象大小 |
拉取映象
命令 docker pull 映象名(如:centos,ubuntu),例子:docker pull ubuntu
執行結果:
刪除映象
刪除指定映象
命令: docker rmi 映象id(image id) 如: docker rmi ff0fea8310f3
執行結果:
強制刪除指定映象
命令: docker rmi -f 映象id(image id) 如: docker rmi -f ff0fea8310f3
執行結果:
刪除docker全部映象
命令: docker rmi $(docker images -q)
執行結果:
執行映象檔案
命令 docker run --itd --name 容器名稱,可以自定義(如:ubuntu_base) 映象名:標籤(如 ubuntu:latest)
docker run命令詳解
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS說明:
-a stdin: 指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
-d: 後臺執行容器,並返回容器ID;
-i: 以互動模式執行容器,通常與 -t 同時使用;
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
--name="nginx-lb": 為容器指定一個名稱;
--dns 8.8.8.8: 指定容器使用的DNS伺服器,預設和宿主一致;
--dns-search example.com: 指定容器DNS搜尋域名,預設和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 設定環境變數;
--env-file=[]: 從指定檔案讀入環境變數;
--cpuset="0-2" or --cpuset="0,1,2": 繫結容器到指定CPU執行;
-m :設定容器使用記憶體最大值;
--net="bridge": 指定容器的網路連線型別,支援 bridge/host/none/container: 四種類型;
--link=[]: 新增連結到另一個容器;
--expose=[]: 開放一個埠或一組埠;
執行結果
查詢容器
命令: docker ps
docker ps命令詳解
OPTIONS說明:
-a :顯示所有的容器,包括未執行的。
-f :根據條件過濾顯示的內容。
--format :指定返回值的模板檔案。
-l :顯示最近建立的容器。
-n :列出最近建立的n個容器。
--no-trunc :不截斷輸出。
-q :靜默模式,只顯示容器編號。
-s :顯示總的檔案大小。
執行結果
進入docker容器命令
命令:docker exec -it 容器名稱(如:ubuntu_base) 執行型別,這個可以從docker ps容器列表中的COMMAND看到(bash/sh) 例子: docker exec -it ubuntu_base bash
OPTIONS說明:
-d :分離模式: 在後臺執行
-i :即使沒有附加也保持STDIN 開啟
-t :分配一個偽終端
執行結果:
容器的啟動和關閉
啟動命令: docker start 容器名稱(如:ubuntu_base)
啟動命令執行結果:
關閉命令: docker stop 容器名稱(如:ubuntu_base)
關閉命令執行結果 :
刪除容器(指定容器)
命令 : docker rm 容器名稱(如:ubuntu_base)
執行結果
刪除容器(全部容器)
命令 : docker rm $(docker ps -a -q)
匯出容器
命令: docker export 容器名稱(如:ubuntu_base) > 容器名稱.tar 例子: docker export redis5 > redis5.tar
執行結果:
匯入容器
命令 : docker import 容器檔案(redis5.tar) redis5:v1
執行結果:
匯出映象
命令 : docker save 映象名稱(ubuntu) > 檔名.tar 例子 : docker save ubuntu > ubuntu_base.tar
執行結果 :
匯入映象
命令 : docker load < 檔名.tar 例子: docker load < ubuntu_base.tar
執行結果 :
save-load和import-export對比
型別 | 匯出的物件 | 匯出檔案大小 | 是否可回滾到歷史層 |
---|---|---|---|
export & import | 將容器匯出 | 小 | 否 |
save & load | 用來將一個或多個image打包 | 大 | 是 |
相對於檔案大小來說,save方式匯出的檔案比export方式匯出的檔案大
正是因為save方式儲存了映象的歷史和層(layer),使其可以層回滾,即回滾到之前的歷史層,
所以save方式匯出的檔案稍微大一些反觀export方式,在匯出過程中丟失所有的歷史,導致其不可以層回滾,匯出的檔案會小一些可以通過 docker history 映象名看到層關係
登入docker hub
命令 : docker login
釋出
釋出映象的前提是必須要登入
執行命令結果:
第一個dockerfile的檔案建立
dockerfile介紹
Dockerfile 是一個文字檔案,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
dockerfile常用指令介紹
FROM 指定基礎映象
指定待擴充套件的父級映象。除了註釋外,在檔案開頭必須是一一個FROM指令, 接下來白指令便在這個父級映象的環境中執行,直到遇到下一一個FROM指令。
通過新增多個FROM命令可以在同一個Dockerfile檔案中建立多個映象。
所謂定製映象,那一定是以一個映象為基礎,在其上進行定製。
就像我們之前運行了一個redis映象的容器,再進行修改一樣,基礎映象是必須指定的。
而 FROM 就是指定基礎映象,因此一個 Dockerfile 中 FROM 是必備的指令,並且必須是第一條指令。
在 Docker Store 上有非常多的高質量的官方映象,有可以直接拿來使用的服務類的映象,如nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;
如果沒有找到對應服務的映象,官方映象中還提供了一些更為基礎的作業系統映象,如ubuntu 、 debian 、 centos、 alpine 等這些作業系統的軟體庫
一般會以alpine為主,因為節約的資源比較少
RUN 執行命令
RUN 指令是用來執行命令列命令的。
格式:
RUN \<command\> (類似/bin/sh -cshell格式)
RUN ["executable", "param1", "param2"] (exec格式)
類似shell指令碼風格的:
FROM alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers
RUN mkdir -p /usr/src/redis
RUN cd /usr/src/redis
RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz"
RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install
MAINTAINER
用來宣告建立的映象的作者資訊。在上述程式碼中,xxh是使用者名稱,[email protected] .是郵箱。這個命令並不是必需的。
EXPOSE
用來指明容器內程序對外開放的埠,多個埠之間使用空替隔力。
執行容器通過引數-p(大寫)即可將EXPOSE裡所指定的埠對映到主機上另外的隨機埠,容器或主機就可以通過對映後的埠與此容器通訊。
同時,我們也可以通過-p (小寫)引數將dockerfile中EXPOSE中沒有列出的埠設定成公開的。
ADD
向新映象中新增檔案,這個檔案可以是一個主機檔案,也可以是一個網路檔案, 也可以是一個資料夾
ENV
設定容器執行的環境變數。在執行容器的時候,通過-e引數可以修改這個環境變數值,也可以新增新的環境變數
編寫dockerfile注意事項
注:Dockerfile 中每一個指令都會建立一層, RUN 也不例外。
每一個 RUN 的行為,就和剛才我們手工建立映象的過程一樣:新建立一層,在其上執行這些命令,
執行結束後, commit這一層的修改,構成新的映象。
使用 Dockerfile 定製映象而上面的這種寫法,建立了很多層映象。
這是完全沒有意義的,而且很多執行時不需要的東西,都被裝進了映象裡,比如編譯環境、更新的軟體包等等。
結果就是產生非常臃腫、非常多層的映象,不僅僅增加了構建部署的時間,也很容易出錯。
這是很多初學Docker 的人常犯的一個錯誤。Union FS是有最大層數限制的,比如 AUFS,曾經是最大不得超過 42 層,現在是不得超過 127 層。
第一個dockerfile檔案(構建redis5)
構建redis5-docker前的軟體準備,如下圖所示
dockerfile檔案
#設定映象
FROM centos:centos7
#複製檔案
COPY ./Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo
#更新映象源
RUN yum clean all && yum makecache && yum -y update
#建立redis使用者組和使用者
RUN groupadd -r redis && useradd -r -g redis redis
#安裝redis前環境準備
RUN yum -y install epel-release wget gcc automake autoconf libtool make gcc gcc-c++
#建立data目錄和新檔案
RUN mkdir /data && touch /data/redis-5.0.7.tar.gz
#共享data資料夾
VOLUME /data
#複製redis5的壓縮包
COPY ./redis-5.0.7.tar.gz /data/redis-5.0.7.tar.gz
#解壓redis5
RUN tar -zxvf /data/redis-5.0.7.tar.gz
#進入解壓好的redis5並編譯
RUN cd /redis-5.0.7 && make && make PREFIX=/data/redis-5.0.7 install
#開放埠
EXPOSE 6379
構建命令: docker build -t 映象名稱,可以自定義(redis5) .
執行結果
構建redis6映象(dockerfile檔案),未執行過,需要嘗試
FROM centos
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum update -y && yum install epel-release -y
RUN yum install wget -y && yum -y install bzip2
RUN wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.gz
RUN mkdir -p /usr/src/gcc
RUN tar -xvf gcc-7.1.0.tar.gz -C /usr/src/gcc
RUN cd /usr/src/gcc/gcc-7.1.0 && ./contrib/download_prerequisites
RUN mkdir /usr/src/gcc/gcc-7.1.0/build
RUN cd /usr/src/gcc/gcc-7.1.0/build && ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
RUN cd /usr/src/gcc/gcc-7.1.0/build && make && make install
RUN wget https://github.com/antirez/redis/archive/6.0-rc2.tar.gz
RUN mkdir -p /usr/src/redis
RUN tar -zxvf 6.0-rc2.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-6.0-rc2/ && CC=/usr/local/bin/gcc make && make install
docker的映象結構
映象
Docker的映象概念類似於虛擬機器裡的映象,是一個只讀的模板,一個獨立的檔案系統,包括執行容器所需的資料,可以用來建立新的容器。
例如:一個映象可以包含一個完整的ubuntu作業系統環境,裡面僅安裝了Mysql或使用者需要的其它應用程式。
Docker的映象實際上由一層一層的檔案系統組成,這種層級的檔案系統被稱為UnionFS。 映象可以基於Dockerfile構建,Dockerfile是一個描述檔案,裡面包含若干條命令,每條命令都會對基礎檔案系統建立新的層次結構。
Docker提供了一個很簡單的機制來建立映象或者更新現有的映象,使用者甚至可以直接從其他人那裡下載一個已經做好的映象來直接使用。
容器
Docker利用容器來執行應用。
Docker容器是由Docker映象建立的執行例項。Docker容器類似虛擬機器, 可以支援的操作包括啟動,停止,刪除等。每個容器間是相互隔離的,容器中會執行特定的應用,包含特定應用的程式碼及所需的依賴檔案。
可以把容器看做是一個簡易版的Linux環境(包括root使用者許可權、程序空間、使用者空間和網路空間等)和執行在其中的應用程式。
倉庫
如果你使用過git和github就很容易理解Docker的倉庫概念。Docker倉庫的概念跟Git類似,註冊伺服器可以理解為GitHub這樣的託管服務。
Docker倉庫是用來包含映象的位置,Docker提供一個註冊伺服器(Register) 來儲存多個倉庫,每個倉庫又可以包含多個具備不同tag的映象。 Docker執行中使用的預設倉庫是Docker Hub公共倉庫。
倉庫支援的操作類似git,當用戶建立了自己的映象之後就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個映象時候,只需要從倉庫上pull下來就可以了。
映象結構
如下圖展示了Docker映象的系統結構。映象的最底層必須是一個稱為啟動檔案系統( bootfs )的映象,使用者不會與這一層直接打交道。bootfs的上層映象叫作根映象 ( rootfs ),它在通常情況下是一個作業系統,如Ubuntu、 Debian 和CentOS等。
使用者的映象必須構建於根映象之上。
圖中所示的映象1是通過在根映象ubuntu上安裝 MySQL來建立的。
在映象1的基礎上再安裝一個redis,就又建立了映象2。
利用映象2啟動的容器裡面執行的是一個已 經安裝好了MySQL和Nginx的centos系統。
參考資料
- docker入門到實踐