目錄
- docker介紹與安裝
- 介紹
- docker的優勢或者特點
- 對比傳統虛擬機總結
- Docker的主要用途,目前有三大類
- docker的擴容與縮容
- docker的應用范圍
- 安裝
- 介紹
- docker常用的基本命令介紹
- 查詢docker鏡像資訊
- 拉取鏡像
- 洗掉鏡像
- 洗掉指定鏡像
- 強制洗掉指定鏡像
- 洗掉docker全部鏡像
- 運行鏡像檔案
- 查詢容器
- 進入docker容器命令
- 容器的啟動和關閉
- 洗掉容器(指定容器)
- 洗掉容器(全部容器)
- 匯出容器
- 匯入容器
- 匯出鏡像
- 匯入鏡像
- save-load和import-export對比
- 登錄docker hub
- 發布
- 第一個dockerfile的檔案創建
- dockerfile介紹
- dockerfile常用指令介紹
- FROM 指定基礎鏡像
- RUN 執行命令
- MAINTAINER
- EXPOSE
- ADD
- ENV
- 撰寫dockerfile注意事項
- 第一個dockerfile檔案(構建redis5)
- 構建redis6鏡像(dockerfile檔案),未執行過,需要嘗試
- 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入門到實踐
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/455605.html
標籤:其他
上一篇:二進制數的運算原理與門電路實作
