全文預計閱讀時間: 15分鐘 1、什么是Docker 2、Docker的架構 3、Docker基礎操作 4、Docker使用實例 Docker是dotCloud公司開源的一個基于LXC的高級容器引擎,源碼托管在Github上,基于go語言并且遵從Apache2.0協(xié)議開源。Docker是一個開源的應用容器引擎,可以輕松的為任何應用創(chuàng)建一個輕量級的、可移植的、自給自足的容器。開發(fā)者在筆記本上編譯測試通過的容器可以批量地在生產環(huán)境中部署,包括VMs(虛擬機)、 bare metal、OpenStack 集群和其他的基礎應用平臺。 - 在服務型環(huán)境中部署和調整數(shù)據(jù)庫或其他的后臺應用;
- 從頭編譯或者擴展現(xiàn)有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環(huán)境;
虛擬機(Virtual Machine,簡稱VM)是一種完全模擬硬件的虛擬化技術,它在物理服務器上創(chuàng)建一個完整的操作系統(tǒng)實例,包括操作系統(tǒng)內核和應用程序。每個虛擬機都有自己的內存、處理器、磁盤和網絡等資源,它們是相互隔離的,并且可以運行不同的操作系統(tǒng)。虛擬機通常需要較多的資源和啟動時間較長。Docker是一種容器化平臺,它利用操作系統(tǒng)級虛擬化技術,在物理服務器上創(chuàng)建一個或多個獨立的容器。容器與宿主機共享操作系統(tǒng)內核,但是在容器內部可以運行獨立的應用程序和文件系統(tǒng),實現(xiàn)了進程級別的隔離。相比虛擬機,Docker容器更輕量級、啟動快速,并且占用更少的資源。總結來說,虛擬機提供了完整的操作系統(tǒng)虛擬化,而Docker提供了應用程序級別的虛擬化。虛擬機更適合運行不同的操作系統(tǒng)和需要完全隔離的應用場景,而Docker更適合部署和管理分布式應用、快速擴展和遷移應用等場景。Docker是一種開源的容器化平臺,它采用了客戶端-服務器(C/S)架構模式,使用遠程API來管理和創(chuàng)建Docker容器。Docker架構分為四個部分:Docker主機、Docker客戶端、Docker守護進程和Docker鏡像倉庫。 - Docker主機是運行Docker守護進程的機器。
- Docker客戶端是用戶與Docker進行交互的工具,包括命令行工具和RESTful API。
- Docker守護進程是負責管理Docker對象(如鏡像、容器)的核心組件,它包括多個子系統(tǒng),如鏡像管理子系統(tǒng)、網絡管理子系統(tǒng)、文件系統(tǒng)子系統(tǒng)等,它負責管理Docker對象,如鏡像、容器和網絡。
- Docker鏡像倉庫是用來保存Docker鏡像的地方,用戶可以通過Docker Hub或者私有倉庫來存儲和管理自己的鏡像。
- 鏡像:是一個只讀的模板,它可以是一個可運行軟件(如tomcat、mysql),也可以是一個配置文件(如nginx、redis)等。鏡像是由Dockerfile文件生成的,Dockerfile文件包含了構建鏡像所需的指令和參數(shù)。
- 容器:是鏡像的一個運行實例(和編程的面向對象相似,鏡像為類、容器為對象),可以在容器中運行應用程序。每個容器都是相互隔離的,擁有自己的文件系統(tǒng)、網絡棧和進程空間。
- 倉庫:用于存放鏡像和容器的地方。Docker Hub是一個公共的鏡像倉庫,用戶可以上傳自己的鏡像或者下載別人公開的鏡像。
# 查看已安裝的Docker版本 docker version
# 搜索Docker鏡像 docker search <關鍵詞>
# 拉取Docker鏡像 docker pull <鏡像名稱>
# 列出所有本地的Docker鏡像 docker images
# 創(chuàng)建一個新的容器 docker create <鏡像名稱>
# 啟動一個容器 docker start <容器ID或名稱>
# 停止一個運行中的容器 docker stop <容器ID或名稱>
# 重新啟動一個容器 docker restart <容器ID或名稱>
# 進入容器的命令行終端 docker exec -it <容器ID或名稱> /bin/bash
# 列出所有正在運行的容器 docker ps
# 列出所有容器(包括運行中和已停止的) docker ps -a
# 刪除一個容器 docker rm <容器ID或名稱>
# 查看容器日志 docker logs <容器ID或名稱>
docker run [可選參數(shù)] image # 參數(shù)可選說明 # --name='name' 容器名字:用來區(qū)分容器 # -d 后臺方式運行:相當于nohup # -it 使用交互式運行:進入容器查看內容 # -p 指定容器的端口(四種方式)小寫字母p: # 1、-p ip:主機端口:容器端口 # 2、-p 主機端口:容器端口 # 3、-p 容器端口 # 4、容器端口 # -P 隨機指定端口(大寫字母P)
案例: docker run -it ubuntu /bin/bash # 參數(shù)說明: # -i: 交互式操作 # -t: 終端 # ubuntu: ubuntu鏡像 # /bin/bash:放在鏡像名后的是命令,這里我們希望有個交互式Shell,因此用的是/bin/bash # exit:退出終端
# 列出當前正在運行的容器 docker ps # 參數(shù)可選說明 # 列出當前正在運行的容器+歷史運行過的容器 -a # 顯示最近創(chuàng)建的容器(可以指定顯示幾條,比如-n=1) -n=? # 只顯示容器的編號 -q
# 案例: docker ps -a
docker start <容器ID>
# 開啟暫停容器案例 docker start 27e32be85b0e
docker stop <容器ID>
# 停止容器案例 docker stop 27e32be85b0e
docker restart <容器ID>
# 重啟容器案例 docker restart 27e32be85b0e 啟動容器時如果使用-d參數(shù),容器啟動后會進入后臺。此時想要進入容器,可以通過docker attach或者docker exec命令。docker attach <容器ID> docker exec -it <容器ID>
# 進入容器案例 docker attach 27e32be85b0e docker exec -it 27e32be85b0e /bin/bash 注:如果使用docker attach命令從這個容器退出,會導致容器的停止。注:如果使用docker exec命令從這個容器退出,容器不會停止,推薦使用這個命令進入容器。docker export [容器ID] > 導出文件名
# 導出容器快照到本地文件ubuntu.tar案例 docker export 27e32be85b0e > ubuntu.tar
cat 本地快照文件 | docker import - 鏡像名:tag
# 將快照文件ubuntu.tar導入到鏡像test/ubuntu:v1 cat ubuntu.tar | docker import - test/ubuntu:v1
docker logs # 參數(shù)可選說明 # 顯示日志 -tf # 要顯示的日志條數(shù) --tail number
# 案例: docker logs -tf 5f5c92a0c964 docker logs -tf --tail 5 5f5c92a0c964
docker top <容器ID>
# 查看容器的進程信息 docker top 27e32be85b0e
docker rm <容器ID> # 刪除容器(不能刪除正在運行的容器)如果要強制刪除,如下命令: docker rm -f <容器id>
# 刪除容器案例: docker rm -f 5f5c92a0c964
docker images
# 各個選項說明: # REPOSITORY:表示鏡像的倉庫源 # TAG:鏡像的標簽 # IMAGE ID:鏡像ID # CREATED:鏡像創(chuàng)建時間 # SIZE:鏡像大小
docker pull
# 獲取ubuntu13.10版本的鏡像 docker pull ubuntu:13.10
docker search
# 各個選項說明: # NAME: 鏡像倉庫源的名稱 # DESCRIPTION: 鏡像的描述 # OFFICIAL: 是否 docker 官方發(fā)布 # stars: 類似 Github 里面的 star,表示點贊、喜歡的意思。 # AUTOMATED: 自動構建。
# 查詢鏡像案例 docker search ubuntu
docker rmi <鏡像名:版本>
# 刪除鏡像案例: docker rmi test/ubuntu:v1
當docker 鏡像倉庫中下載的鏡像不能滿足需求時,可以通過以下兩種方式對鏡像進行更改: 1、從已經創(chuàng)建的容器中更新鏡像,并且提交這個鏡像# 更新鏡像之前,需要使用鏡像來創(chuàng)建一個容器 docker run -t -i ubuntu:15.10 /bin/bash # 在運行的容器內進行我們需要的修改 xxx # 在完成操作后,輸入exit命令退出容器 exit # 通過命令docker commit來提交容器副本 docker commit -m='我的更新' -a='th' ca34bd7196b5 test/ubuntu:v1 # 各個參數(shù)說明: # -m: 提交的描述信息 # -a: 指定鏡像作者 # ca34bd7196b5:容器 ID # test/ubuntu:v2: 指定要創(chuàng)建的目標鏡像名 2、使用Dockerfile指令來創(chuàng)建一個新的鏡像# 零開始來創(chuàng)建一個新的鏡像 docker build # 1、需要創(chuàng)建一個Dockerfile文件,內容如下 FROM nginx Run echo '<h1>hello, docker!</h1>' > /usr/share/nginx/html/index.html # FROM:指定使用哪個鏡像源 # RUN:指令告訴docker在鏡像內執(zhí)行命令
# 2、通過docker build命令創(chuàng)建鏡像 docker build -t test/nginx . # 參數(shù)說明: # -t :指定要創(chuàng)建的目標鏡像名 # . :Dockerfile文件所在目錄,可以指定Dockerfile的絕對路徑 Dockerfile文件的指令(詳細Dockerfile文件編寫還需要單獨學習):
Dockerfile指令 | 說明 |
---|
FROM | 指定基礎鏡像,用于后續(xù)的指令構建。 | MAINTAINER | 指定Dockerfile的作者/維護者。(已棄用,推薦使用LABEL指令) | LABEL | 添加鏡像的元數(shù)據(jù),使用鍵值對的形式。 | RUN | 在構建過程中在鏡像中執(zhí)行命令。 | CMD | 指定容器創(chuàng)建時的默認命令。(可以被覆蓋) | ENTRYPOINT | 設置容器創(chuàng)建時的主要命令。(不可被覆蓋) | EXPOSE | 聲明容器運行時監(jiān)聽的特定網絡端口。 | ENV | 在容器內部設置環(huán)境變量。 | ADD | 將文件、目錄或遠程URL復制到鏡像中。 | COPY | 將文件或目錄復制到鏡像中。 | VOLUME | 為容器創(chuàng)建掛載點或聲明卷。 | WORKDIR | 設置后續(xù)指令的工作目錄。 | USER | 指定后續(xù)指令的用戶上下文。 | ARG | 定義在構建過程中傳遞給構建器的變量,可使用 'docker build' 命令設置。 | ONBUILD | 當該鏡像被用作另一個構建過程的基礎時,添加觸發(fā)器。 | STOPSIGNAL | 設置發(fā)送給容器以退出的系統(tǒng)調用信號。 | HEALTHCHECK | 定義周期性檢查容器健康狀態(tài)的命令。 | SHELL | 覆蓋Docker中默認的shell,用于RUN、CMD和ENTRYPOINT指令。 |
docker tag <鏡像id> 用戶名稱/鏡像源名:新標簽
# 鏡像添加新標簽案例: docker tag 21e3943d27ac test/nginx:dev Docker Hub是全球最大的容器鏡像庫,有超過100,000個容器鏡像。您可以在Docker Hub上找到各種類型的鏡像,包括官方鏡像、第三方鏡像和企業(yè)鏡像。此外,您還可以使用Docker Hub來管理和共享您的鏡像。# 登錄遠程倉庫命令 docker login [OPTIONS] [SERVER] # [OPTIONS]說明: # -u:登陸的用戶名 # -p:登陸的密碼 # [SERVER]為倉庫服務器地址,不指定默認為官方倉庫Docker Hub
# 推送本地倉庫鏡像到連接的遠程倉庫 docker push 本地鏡像名
# 退出遠程倉庫命令 docker logout
# 1、拉取最新版的Nginx鏡像 docker pull nginx:latest # 2、查看nginx是否拉取成功 docker images # 3、運行nginx容器 docker run --name nginx-test -p 8080:80 -d nginx # 參數(shù)說明 # --name nginx-test:容器名稱。 # -p 8080:80:端口進行映射,將本地8080端口映射到容器內部的80端口。 # -d nginx:設置容器在在后臺一直運行
# 1、拉取最新版的Mysql鏡像 docker pull mysql:latest # 2、查看mysql是否拉取成功 docker images # 3、運行mysql容器 docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql # 參數(shù)說明 # --name nginx-test:容器名稱 # -p 3306:3306:映射容器服務的3306端口到宿主機的3306端口,外部主機可以直接通過宿主機ip:3306 訪問到MySQL的服務 # MYSQL_ROOT_PASSWORD=123456:設置MySQL服務root用戶的密碼
# 1、拉取最新版的Tomcat鏡像 docker pull tomcat # 2、查看tomcat是否拉取成功 docker images|grep tomcat # 3、運行tomcat容器 docker run -d -p 8080:8080 --name tomcat tomcat:latest # 參數(shù)說明 # -p:設置端口映射,宿主機端口:容器端口 # -P(大寫):隨機分配端口 # -i:前臺交互式啟動,通常與-t配合使用 # -t:啟動容器內的偽終端,通常與-i配合使用 # -d:后臺守護式啟動 # –name:為容器命名
(docker還有許多深層的知識需要學習,這篇文章只介紹了簡單的應用!)
|