Docker基礎一

一、Docker入門


Docker是什麼?

Docker 是一個開源的應用容器引擎,你可以將其理解為一個輕量級的虛擬機,開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上。

為什麼要使用 Docker?

作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。

更高效的利用系統資源

<code>由於容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統資源的利用率更高。  

無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。
因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數量的應用。/<code>

更快速的啟動時間

傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由於直接運行於宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。

一致的運行環境

開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些 bug 並未在開發過程中被發現。而 Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 「這段代碼在我機器上沒問題啊」 這類問題。

持續交付和部署

對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。

使用 Docker 可以通過定製應用鏡像來實現持續集成、持續交付、部署。開發人員可以通過 Dockerfile 來進行鏡像構建,並結合持續集成(Continuous Integration) 系統進行集成測試,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。

而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。

更輕鬆的遷移

由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況。


更輕鬆的維護和擴展

Docker 使用的分層存儲以及鏡像的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的 官方鏡像,既可以直接在生產環境使用,又可以作為基礎進一步定製,大大的降低了應用服務的鏡像製作成本。


二 Centos 安裝docker

<code>   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": ["http://hub-mirror.c.163.com"]
}/<code>


docker基本概念

<code>Docker 包括三個基本概念:
鏡像(Image)
容器(Container)
倉庫(Repository)/<code>

Docker 鏡像就是一個只讀的模板。

例如:一個鏡像可以包含一個完整的 ubuntu 操作系統環境,裡面僅安裝了 Apache 或用戶需要的其它應用程序。

鏡像可以用來創建 Docker 容器。

Docker 提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那裡下載一個已經做好的鏡像來直接使用。

Docker 容器

容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。

可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。

Docker 倉庫

倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混為一談,並不嚴格區分。實際上,倉庫註冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。

倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。

Docker常用指令

<code>1.查看鏡像
docker images
2.刪除鏡像
docker rmi 鏡像名
3.創建鏡像
docker build -t 名稱 .
Usage:docker build [OPTIONS] PATH | URL | -

OPTIONS:
-t ,--tag list  #構建後的鏡像名稱
-f, --file string #指定Dockerfiile文件位置
示例:
1,docker build .
2,docker build -t redis:v1 .
3,docker build -t redis:v2 -f /path/Dockerfile /path


一般常用第2種方式構建,我們在構建時都會切換到Dockerfile文件的目錄下進行構建,所以不需要指定-f參

4.指定自定義網絡
docker network create --subnet=192.168.1.0/24 mynetwork
5.創建容器
docker run -itd --name 容器名 --net mynetwork -p 6380:6379 --ip 192.168.1.2 鏡像名
-d: 後臺運行容器,並返回容器ID;
-i: 以交互模式運行容器,通常與 -t 同時使用;
-p: 端口映射,格式為:主機(宿主)端口:容器端口
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
-V: 為容器掛載目錄,比如 /usr/docker/data:/data 前者為數宿主機目錄後者為容器內目錄
--ip: 為容器制定一個固定的ip
--net: 指定網絡模式

6.查看容器日誌
docker logs 容器名
7.啟動
docker start 容器名
8.刪除
docker rm 容器名
9.停止所容器
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
10.重啟容器
docker restart 容器名
11.進入容器
docker exec -it 容器名 bash/<code>


Dockerfile快速入門指令

<code>   1.FROM 指定基礎鏡像

所謂定製鏡像,那一定是以一個鏡像為基礎,在其上進行定製。就像我們之前運行了一個redis鏡像的容器,再進行修改一樣,基礎鏡像是必須指定的。而 FROM 就是指定基礎鏡像,因此一個 Dockerfile 中 FROM 是必備的指令,並且必須是第一條指令。
在 Docker Store 上有非常多的高質量的官方鏡像,有可以直接拿來使用的服務類的鏡像,如nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;如果沒有找到對應服務的鏡像,官方鏡像中還提供了一些更為基礎的操作系統鏡像,
如ubuntu 、 debian 、 centos、 alpine 等這些操作系統的軟件庫

2、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
之前說過,Dockerfile 中每一個指令都會建立一層, RUN 也不例外。每一個 RUN 的行為,就和剛才我們手工建立鏡像的過程一樣:新建立一層,在其上執行這些命令,執行結束後, commit這一層的修改,構成新的鏡像。使用 Dockerfile 定製鏡像
而上面的這種寫法,創建了很多層鏡像。這是完全沒有意義的,而且很多運行時不需要的東西,都被裝進了鏡像裡,比如編譯環境、更新的軟件包等等。結果就是產生非常臃腫、非常多層的鏡像,不僅僅增加了構建部署的時間,也很容易出錯。 這是很多初學
Docker 的人常犯的一個錯誤。Union FS是有最大層數限制的,比如 AUFS,曾經是最大不得超過 42 層,現在是不得超過 127 層。/<command>/<code>


Docker容器的遷移處理

1.導出鏡像

<code>導出容器可以導出一個已經創建的容器到一個文件,不管容器處於什麼狀態,可以使用docker export 命令。

命令格式為:docker export [-o|--output[=""]] CONTATINER

其中可以通過-o來指定導出的tar文件名,也可以直接通過重定向來實現。


另一種格式為:docker export 容器id/name >文件名.tar/<code>

2.導入容器

<code>導入的文件可以使用docker import 命令導入變成鏡像,該命令的格式為:

docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:YAG]]

其中-c 選項可以在導入的同時執行對容器進行修改的Dockerfile指令(網絡等修改)/<code>

3.用export&import 還是 save & load ?

<code>export&import 和 save & load 是docker中的兩組命令,我們先主要看看他們的區別:
類型 \t導出的對象\t 導出文件大小\t 是否可回滾到歷史層
export & import\t 將容器導出 \t 大\t 是
save & load\t 用來將一個或者多個image打包\t 小\t 否/<code>
<code>相對於文件大小來說,save方式導出的文件比export方式導出的文件大
正是因為save方式保存了鏡像的歷史和層(layer),使其可以層回滾,即回滾到之前的歷史層,所以save方式導出的文件稍微大一些
反觀export方式,在導出過程中丟失所有的歷史,導致其不可以層回滾,導出的文件會小一些
可以通過 docker history 鏡像名 看到層關係/<code>

注意事項

<code> 如果容器運行就退出,並且無報錯
1、docker容器必須有一個前臺進程,如果沒有,容器會被認為空閒,自動退出
2、top、tail、腳本掛起到前臺/<code>


分享到:


相關文章: