docker學習與使用(概念、鏡像、容器、數據卷、dockerfile等)

文章目錄

  • 前言
  • 引入
  • docker 簡介
  • docker的應用場景
  • docker的虛擬化技術VS虛擬機
  • docker的優點
  • docker架構
    • Docker倉庫
    • Docker鏡像
      • linux操作系統的大致組成部分
    • Docker容器
  • docker安裝與啟動
    • 校驗版本
    • 移除舊的版本
    • 安裝依賴工具
    • 設置軟件源
    • 安裝docker
    • 驗證
  • 配置鏡像加速器
  • docker服務相關命令
  • docker鏡像相關命令
  • docker容器相關命令
  • 數據卷
    • 數據卷配置
    • 數據卷容器
  • docker應用部署
    • mysql部署
    • tomcat
  • 制作鏡像
    • dockerfile 制作鏡像
      • dockerfile 常用命令
      • 通過dockerfile制作鏡像
  • docker compose
    • 安裝
    • 示例
  • docker 私有倉庫(未完成)
  • docker swarm集群搭建(未完成)
  • 參考目錄


前言

閱讀本文前請注意最后編輯時間,文章內容可能與目前最新的技術發展情況相去甚遠。歡迎各位評論與私信,指出錯誤或是進行交流等。


引入

問題1:
某IT部門要上線一個項目。常規操作,直接去線上服務器,拷貝一個tomcat,然后改端口號,然后部署應用到webapps文件
夾下,重啟就好。
一個服務器上可能會部署多個應用服務。如果某個應用出現問題,CPU占用達到100%,可能這個服務器上的其他應用也會出現問題。
對于一個大型應用拆分為幾十個微服務,分別交由不同的團隊開發,不同團隊之間水平參差不齊。如果還采用這種部署方式,
你的應用可能會因為另一個團隊的應用發生意外。因部署在了同一臺服務器上,導致全部出現問題。

問題2:
開發和線上代碼(同一套代碼)問題。開發階段部署一套軟件環境,測試人員在開發中測試沒有問題,運維進行部署。但是正
式部署到服務器時,發生了問題(啟動參數、環境問題、漏配了參數)等意外。

問題3:
隨著微服務技術的興起,一個大的應用需要拆分成多個微服務。多個微服務的生成,就會面臨龐大系統的部署效率,開發協同
效率問題。然后通過服務的拆分,數據的讀寫分離、分庫分表等方式重新架構,而且這種方式如果要做的徹底,需要花費大量人力
物力。可能需要部署很多個服務器。

問題4:
持續的軟件版本發布/測試項目。到線上環境的集成

以上問題可以由docker解決。

docker 簡介

Docker 是一個開源的應用容器引擎,可以讓開發者打包應用及其依賴到一個輕量級、可移植的容器中。
容器是一種標準化的軟件單元,可以在任何支持 Docker 的環境中快速部署和運行。容器性能開銷極低。
容器是完全使用沙箱機制,相互隔離。

docker的應用場景

  • 應用的自動化打包和發布。
  • 自動化測試和持續集成、發布。
  • 微服務架構:每個微服務獨立打包成容器,靈活擴展

docker的虛擬化技術VS虛擬機

在這里插入圖片描述

名詞解釋:
infrastructure(基礎服務)硬件
Host OS 主機操作系統
VM 虛擬機
Hypervisor 虛擬層程序

1.實現原理技術不同
虛擬機是用來進行硬件資源劃分的完美解決方案,利用的是硬件虛擬化技術,如VT-x、AMD-V會通
過一個hypervisor層來實現對資源的徹底隔離。
而容器則是操作系統級別的虛擬化,利用的是內核的Cgroup和Namespace特性,此功能通過軟件
來實現,僅僅是進程本身就可以實現互相隔離,不需要任何輔助。

2.使用資源方面不同
Docker容器與主機共享操作系統內核,不同的容器之間可以共享部分系統資源,因此更加輕量級,
消耗的資源更少。
虛擬機會獨占分配給自己的資源,不存在資源共享,各個虛擬機之間近乎完全隔離,會消耗更多的資源。

3.應用場景不同
若需要資源的完全隔離并且不考慮資源的消耗,可以使用虛擬機。
若是想隔離進程并且需要運行大量進程實例,應該選擇Docker容器。

特性容器虛擬機
啟動速度秒級分鐘級
硬盤使用一般為MB一般為GB
性能接近原生弱于原生
系統支持量單機一般支持上千個容器單機一般支持幾十個虛擬機

docker的優點

  • Docker能夠自動執行重復性任務,例如搭建和配置開發環境,從而解放了開發人員以便他們專注在真正重要的
    事情上:構建杰出的軟件。
  • 用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、復制、分享、修改,就
    像管理普通的代碼一樣。
  • Docker的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現“這段代碼在
    我機器上沒問題啊”這類問題;
  • 可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。–更快速的啟動時間
  • 避免公用的服務器,資源會容易受到其他用戶的影響。–隔離性
  • 善于處理集中爆發的服務器使用壓力;–彈性伸縮,快速擴展
  • 可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環境的變化導致應用無法正
    常運行的情況。–遷移方便
  • 用Docker可以通過定制應用鏡像來實現持續集成、持續交付、部署。-持續交付和部署

docker架構

Docker使用客戶端-服務器(C/S)架構模式,使用遠程API來管理和創建Docker容器。

在這里插入圖片描述

組件說明
Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker
Docker客戶端(Client)Docker客戶端通過命令行或者其他工具使用DockerAPI與Docker的守護進程(daemon)通信。
Docker主機(Host)一個物理或者虛擬的機器用于執行Docker守護進程和容器。
Docker鏡像(Images)Docker鏡像是用于創建Docker容器的模板。
Docker容器(Container)容器是獨立運行的一個或一組應用。
Docker倉庫(Registry)Docker倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。DockerHub提供了龐大的鏡像集合供用戶使用。

Docker倉庫

是一個存儲鏡像的倉庫。通常被部署在互聯網服務器或者云端。
Docker Hub(https://hub.docker.com)提供了龐大的鏡像集合供使用。

Docker鏡像

Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些
為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也
不會被改變。

經觀察發現,
問題1:Docker中一個centos鏡像為什么只有200MB,而一個centos操作系統的iso文件要幾個G?
問題2:Docker中一個tomcat鏡像為什么有500MB,而一個tomcat安裝包只有70多MB?

在說明上述兩個問題之前,先了解一下linux操作系統的大致組成部分

linux操作系統的大致組成部分

操作系統組成部分:

  • 進程調度子系統
  • 進程通信子系統
  • 內存管理子系統
  • 設備管理子系統
  • 文件管理子系統
  • 網絡通信子系統
  • 作業控制子系統

其中Linux文件系統由bootfs和rootfs兩部分組成

  • bootfs:包含bootloader(引導加載程序)和kernel(內核)
  • rootfs:root文件系統,包含的就是典型Linux系統中的/dev,/proc,/bin,/etc等標準目錄和文件
  • 不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu、centos等

在這里插入圖片描述

Docker鏡像是由特殊的文件系統疊加而成

  • 最底端是bootfs,并使用宿主機的bootfs
  • 第二層是root文件系統rootfs,稱為base image
  • 然后再往上可以疊加其他的鏡像文件
  • 統一文件系統(UnionFileSystem)技術能夠將不同的層整合成一個文件系統,為這些層提供了一個統一的視角
    這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。
  • 一個鏡像可以放在另一個鏡像的上面。位于下面的鏡像稱為父鏡像,最底部的鏡像成為基礎鏡像。

在這里插入圖片描述
答問題1:Docker使用了宿主機中的bootfs,所以docker中的centos鏡像只需要下載對應的rootfs文件系統即可。而一個centos操作系統的iso文件是包含了bootfs和rootfs兩部分。

答問題2:Docker中一個tomcat鏡像將jdk和tomcat整合成一個文件,隱藏了多層的存在,在用戶的角度看來,只存在一個tomcat。tomcat安裝包僅有tomcat部分的文件。

iso鏡像包含操作系統完整的root文件系統,其體積往往是龐大的。因此在Docker設計時,就充分利用統一文件系統(UnionFileSystem)的技術,將其設計為分層存儲的架構。所以嚴格來說,鏡像并非是像一個ISO那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現并非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。

分層存儲的特征還使得鏡像的復用、定制變的更為容易。當從一個鏡像啟動容器時,docker會加載一個可讀寫文件系統作為容器。可以用之前構建好的鏡像作為基礎層,然后在此基礎上修改或進一步添加新的層,以定制自己所需的內容,構建新的鏡像。
在這里插入圖片描述

Docker容器

Docker容器通過Docker鏡像來創建。容器與鏡像的關系類似于面向對象編程中的對象與類。鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。

容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的命名空間。因此容器可以擁有自己的root文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶ID空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立于宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因為這種隔離的特性,很多人初學Docker時常常會混淆容器和虛擬機。

前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而準備的存儲層為容器存儲層(也就是上文提到的可讀寫容器)。

容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。

按照Docker最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用數據卷(Volume)、或者綁定宿主目錄。這樣讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存周期獨立于容器,容器消亡,數據卷不會消亡。因此,使用數據卷后,容器刪除或者重新運行之后,數據不會丟失。

docker安裝與啟動

docker命令參考大全:https://www.runoob.com/docker/docker-tutorial.html
docker官方文檔:https://docs.docker.com/

本文基于安裝了centos7的虛擬機進行介紹。
因此,安裝docker容器需要先配置好一臺centos虛擬機,并配置好網絡連接,以及掛載完iso鏡像文件。確保yum可以正常使用

目前,CentOS發行版本中的內核支持Docker。Docker運行在CentOS7上,要求系統為64位、系統內核版本為3.10以上。

校驗版本

命令: uname -r 校驗Linux內核版本(3.10以上版本)

從2017年3月開始docker在原來的基礎上分為兩個分支版本:Docker CE和Docker EE。
Docker CE 即社區免費版, Docker EE 即企業版,強調安全,但需付費使用。

移除舊的版本

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common\
docker-latest \
docker-latest-logrotate\
docker-logrotate\
docker-selinux \
docker-engine-selinux \
docker-engine

如果yum報告未安裝這些軟件包,則可以。

安裝依賴工具

yum install -y yum-utils device-mapper-persistent-data lvm2

設置軟件源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 也可以使用阿里云的源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安裝docker

yum install -y docker-ce docker-ce-cli containerd.io
# 或者使用以下命令
sudo yum -y install docker-ce

驗證

docker --version

配置鏡像加速器

使用Docker的時候,默認從官方獲取鏡像。鑒于國內網絡問題,從倉庫拉取Docker鏡像十分緩慢,我們可以配置鏡像加速器來解決。

Docker官方和國內很多云服務商都提供了國內加速器服務,例如:阿里云鏡像加速器

  1. 注冊阿里云賬號(已有賬號可跳過)

  2. 獲取專屬加速器地址

    • 登錄阿里云控制臺
    • 搜索進入 容器鏡像服務 → 鏡像工具 → 鏡像加速器
      在這里插入圖片描述
      根據官網提示的命令進行操作
sudo mkdir -p /etc/docker
# 寫入阿里云加速器配置(替換成你的實際地址)
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
# 重啟 Docker 生效
sudo systemctl daemon-reload
sudo systemctl restart docker

docker服務相關命令

# 啟動docker
systemctl start docker# 停止docker
systemctl stop docker# 重啟docker
systemctl restart docker# 查看docker狀態:
systemctl status docker# 設置docker開機啟動:
systemctl enable docker# 查看docker概要信息:
docker info# 查看docker總體幫助文檔:
docker --help# 查看docker命令幫助文檔:
docker 具體命令 --help

docker鏡像相關命令

#列出當前環境中已下載的鏡像
docker images docker search 某個xxx鏡像名字
# 去公共倉庫中查找某個鏡像 例如:docker search redis
加上 --limit : 只列出N個鏡像  例如:docker search --limit 5 redis docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]
# Docker 鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號]。默認地址是 Docker Hub。
# 倉庫名:如之前所說,這里的倉庫名是兩段式名稱,即 <用戶名>/<軟件名>。對于 Docker Hub,如果不給出用戶名,則默認為 library,也就是官方鏡像。
#簡略版
docker pull 某個xxx鏡像名字[:TAG]
# 沒有TAG就是拉取最新版 
例如 docker pull mysqldocker pull redis:6.0.8docker rmi -f 某個xxx鏡像名字ID  
刪除單個 docker rmi -f 鏡像ID
刪除多個 docker rmi -f 鏡像名1:TAG鏡像2
刪除全部 docker rmi -f $(docker images -qa)

在這里插入圖片描述

docker容器相關命令

1.新建和啟動容器實例

docker run [options] image [command]

options說明(常用):

–name= “容器新名字” 為容器指定一個名稱
-d 后臺運行容器并返回容器ID,也即啟動守護式容器(后臺運行)
-i 以交互模式運行容器,通常與-t 同時使用
-t 為容器重新分配一個偽輸入終端,通常與-i 同時使用
-P 隨機端口映射,大寫P
-p 指定端口映射,小寫p

docker run -it --name=c1 centos:7 /bin/bash啟動一個有交互命令的centos7系統 
參數說明:
i:交互式操作。
t:終端。
centos:7:centos:7鏡像。
bin/bash:放在鏡像名后的是命令,這里我們希望有個交互式Shell,因此用的是bin/bash。一經創建就會進入容器
要退出容器,直接輸入exit

2.查看容器狀態

docker ps
-a 列出當前所有正在運行的容器+歷史上運行過的
-l 顯示最近創建的容器
-n 顯示最近n個創建的容器
-q 靜默模式,只顯示容器編號

在這里插入圖片描述
如果使用docker ps則看不到這一條記錄。因為我們使用docker run -it創建的容器在輸入exit命令退出后,該容器就不再運行了。因為該容器沒有使用 -d參數設置為后臺運行。

# 創建守護式容器(后臺運行)
docker run -id redis:6.0.8 /bin/bash

3.退出容器

進入容器,exit退出,容器停止(守護式容器不會停止)
exit進入容器,ctrl+p+q 退出,容器不停止
ctrl+p+q

4.進入容器、查看容器信息

進入容器
docker exec -it 容器id/容器名稱 bashShell
例 docker exec -it c1 bin/bash查看容器運行日志
docker logs 容器id查看容器運行的進程
docker top 容器id 查看內部細節
docker inspect 容器id

5.重啟、停止、強制停止容器,啟動、刪除已停止的容器

重啟容器
docker restart 容器ID或者容器名停止容器
docker stop 容器ID或者容器名強制停止容器
docker kill 容器ID或容器名啟動已經停止運行的容器
docker start 容器ID或者容器名刪除已經停止的容器
docker rm 容器ID或容器名一次刪除多個容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

6.在宿主機和容器之間交換文件

在宿主機和容器之間相互COPY文件cp的用法如下docker cp [OPTIONS] LOCALPATHI CONTAINER:PATH #宿主機復制到容器中
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH #容器中復制到宿主機宿主機復制一個圖片到容器中:將png圖片復制到了容器指定目錄下
docker cp guoweixin.png tomcat2:/usr/local/tomcat/webapps/ROOT將容器內的index.jsp復制到root下
docker cp tomcat2:/usr/local/tomcat/webapps/ROOT/index.jsp /root

數據卷

問題一:通過鏡像創建一個容器。Docker容器刪除后,在容器中產生的數據也會隨之銷毀。容器中的數據不是持久化狀態的。
問題二:Docker容器和外部機器如何交換文件
問題三:容器與容器之間如何進行數據交互

那有沒有一種獨立于容器、提供持久化并能服務于多個容器的東西呢?

數據卷:是宿主機中的一個目錄或文件(可供一個或多個容器使用的特殊目錄),當容器目錄和數據卷目錄綁定后,對方的修改會立即同步。一個數據卷可以被多個容器同時掛載,一個容器也可以被掛載多個數據卷

特性:

  • 數據卷可以在容器之間共享和重用
  • 對數據卷的修改會立馬生效
  • 對數據卷的更新,不會影響鏡像
  • 數據卷默認會一直存在,即使容器被刪除

在這里插入圖片描述

數據卷配置

創建啟動容器時,使用-V參數設置數據卷

# 方式一
docker run...-v 宿主機目錄(文件):容器內目錄(文件)...

注意事項:
1.目錄必須是絕對路徑
2.如果目錄不存在,會自動創建
3.一個容器可以掛載多個數據卷

將兩個容器掛載同一數據卷,則可實現容器之間的數據交換。
在這里插入圖片描述

# 方式二
#1 創建數據卷
docker volume create 數據卷名稱
#創建數據卷之后,默認會存放到目錄:/var/lib/docker/volume/數據卷名稱/_data目錄下
#2 查看數據卷
docker volume inspect 數據卷名稱
#3 查看全部數據卷信息
docker volume 1s
#4 刪除數據卷
docker volume rm 數據卷名稱
#5 應用數據卷
#5.1 當你映射數據卷時,如果數據卷不存在,Docker會幫你自動創建
docker run -v...數據卷名稱:容器內路徑...

數據卷容器

當多個容器掛在同一個數據卷,我們可以將一個容器掛載到數據卷上(作為數據卷容器)。其余容器掛載在 這個 數據卷容器上,這樣就相當于所有容器都掛載在這一數據卷上。(即使c3容器出問題了, c1和c2仍然可以和數據卷進行數據交換)

在這里插入圖片描述

#1 創建數據卷
docker volume create 數據卷名稱
#創建數據卷之后,默認會存放到目錄:/var/lib/docker/volume/數據卷名稱/_data目錄下
#2 創建數據卷容器(name=c3 僅作演示)
docker run -it --name=c3 -v /var/lib/docker/volume/數據卷名稱/_data目錄下:/volume centos:7 bin/bash
#3 將其他容器掛載到該數據據容器上
docker run -it --name=c1 --volumes-from c3 centos:7

docker應用部署

總體步驟:
搜索鏡像 (docker search xx) 或者在 dockerhub上查看鏡像
拉取鏡像 (docker pull xx)
查看鏡像 (docker images xx)
啟動鏡像 (docker run -it -p 8080:8080 tomcat)
停止容器 (docker stop xx)
移除容器 (docker rmi -f xx)

mysql部署

在這里插入圖片描述

  • 容器內的網絡服務和外部機器不能直接通信
  • 外部機器和宿主機可以直接通信
  • 宿主機和容器可以直接通信
  • 當容器中的網絡服務需要被外部機器訪問時,可以將容器中提供服務的端口映射到宿主機的端口上。外部機器訪問宿主機的該端口,從而間接訪問容器的服務。
  • 這種操作稱為:端口映射
# 搜索mysql 鏡像
docker search mysql
# 拉取mysql 鏡像
docker pull mysql:5.6
# 在/root目錄下創建mysql目錄用于存儲數據
mkdir /root/mysql
cd /root/mysql
# 使用mysql鏡像創建容器c_mysql 以3307端口打開 并設置數據卷 并配置mysql的root密碼為123456
docker run -id \
-p 3307:3306 \
--name=c_mysql\
-v/root/mysql/conf:/etc/mysql/conf.d\
-v $PWD/logs:/logs\
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456
mysql:5.6參數說明:
-p 3307:3306:將容器的3306端口映射到宿主機的3307端口。也可以都為3306
$PWD 是當前目錄 /root/mysql
-v $PWD/conf:/etc/mysql/conf.d:將主機當前目錄下的conf/my.cnf 與容器的/etc/mysql/my.cnf 掛載# 進入該容器
docker exec -it c_mysql /bin/bash# 運行mysql 輸入密碼后進入mysql操作端
mysql -u -root -p123456

就和正常Linux系統下操作mysql一樣了。
在這里插入圖片描述
通過SQLyog訪問宿主機IP和映射的端口,可以訪問到容器中的Mysql服務。
在這里插入圖片描述

tomcat

拉取tomcat 鏡像
docker pull tomact運行該容器至8080端口
docker run -d -p 8080:8080 --name t1 tomcat

訪問首頁 看看有沒有成功 發現出現404頁面
在這里插入圖片描述

  • 可能沒有映射端口或者沒有關閉防火墻 (很小可能)
  • 把webapps.dist 目錄換成webapps (因為新版的tomcat換掉了訪問的目錄)
# 重新進入tomcat終端 以此來排查問題
docker exec -it t1 /bin/bash進入目錄 
cd webapps查看當前目錄下文件 發現沒有任何文件
ls -l切換到上層目錄
cd ../刪除目錄 因為這個目錄沒有想要的文件
rm -r webapps將有內容的文件改名為 webapps 讓tomcat找到對應的文件
mv webapps.dist webapps

再次訪問 發現可以正常訪問
在這里插入圖片描述

制作鏡像

當我們從docker鏡像倉庫中下載的鏡像不能滿足我們的需求時,我們可以通過以下兩種方式對鏡像進行更改。

  1. 將已經創建的容器中制作成鏡像,并且提交這個鏡像
  2. 使用 Dockerfile 指令來創建一個新的鏡像
  • 對于開發人員,可以為開發團隊提供一個完全一致的開發環境
  • 對于測試人員,可以直接拿開發時所構建的鏡像測試。
  • 對于運維人員,在部署時,可以實現快速部署、移值。

命令

# 將已經創建的容器轉換成鏡像
docker commit 容器id 鏡像名稱:版本號# 將鏡像文件壓縮 (用于傳輸給他人)
docker save -o 壓縮文件名稱 鏡像名稱:版本號# 將鏡像壓縮文件解壓
docker load -i 壓縮文件名稱

dockerfile 制作鏡像

dockerfile制作鏡像實際上就是確定鏡像每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、制作鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。

Dockerfile是一個文本文件,其內包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

dockerfile 常用命令

FROM :指定基礎鏡像

基礎鏡像不存在會在Docker Hub上拉去(一般會是文件的第一個指令)
使用格式:
FROM<鏡像>:[tag]
FROM <鏡像>@digest[校驗碼]
當前主機沒有此鏡像時,會自動去官網HUB下載
如果不以任何鏡像為基礎,那么寫法為:FROM scratch。

MAINTAINER:提供Dockerfile制作者提供本人信息 [逐漸廢棄]

LABLE-替代MAINTANIER
使用格式:
MAINTANIER “作者信息”
MAINTANIER “guoweixin guoweixin@aliyun.com”
LABLE maintainer=“作者信息”
LABEL maintainer=“guoweixin@aliyun.com”

ENV:用于為docker容器設置環境變量,ENV設置的環境變量,可以使用 docker inspect命令來查看。
同時還可以使用docker run -env =來修改環境變量。
具體用法:

ENV JAVA_HOME /usr/local/jdk
ENV JRE HOME SJAVA HOME/jre
ENV CLASSPATH SJAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH SPATH:SJAVA_HOME/bin/

USER:用來切換運行屬主身份的。Docker默認是使用root,但若不需要,建議切換使用者身份,畢竟root權限太大
了,使用上有安全的風險。

WORKDIR:WORKDIR用來切換工作目錄的。

Docker默認的工作目錄是/,只有RUN能執行cd命令切換目錄,而且還只作用在當下的RUN,也就是說每一個RUN都是獨立進行的。
如果想讓其他指令在指定的目錄下執行,就得靠WORKDIR。WORKDIR動作的目錄改變是持久的,不用每個指令前都使用一次WORKDIR。

WORKDIR /usr/local/tomcat/

EXPOSE:暴露容器運行時的監聽端口給外部,以實現與外部通信。想使得容器與主機的端口有映射關系,必須在容器啟動的時候加上 -P參數。如果不設定,會隨機映射端口。

具體寫法:
EXPOSE 端口號
EXPOSE 端口號/協議
不加協議默認為tcp
例如
EXPOSE 80/tcp
EXPOSE 80/udp

RUN:RUN指令是用來執行命令行命令的。其格式有兩種:
shell格式:RUN<命令>,就像直接在命令行中輸入的命令一樣。
exec格式:RUN[”可執行文件",“參數1”,“參數2”】,這更像是函數調用中的格式。
使用格式:
RUN
RUN [‘’‘’‘’‘’‘’]
注意:多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層,多少個RUN就構建了多少層鏡像,會造成鏡像的臃腫、多層,不僅僅增加了構件部署的時間,還容易出錯。
RUN書寫時的換行符是\

CMD:功能為容器啟動時要運行的命令
語法有三種寫法:

  1. CMD [“executable”,“param1”,“param2”]
  2. CMD [“param1”,“param2”]
  3. CMD command param1 param2
    第三種比較好理解了,就是shell執行方式和寫法
    第一種和第二種其實都是可執行文件加上參數的形式

注意:RUN是構件容器時就運行的命令以及提交運行結果
CMD是容器啟動時執行的命令,在構建時并不運行。

ADD: 一個復制命令,把文件復制到鏡像中。

語法如下:

  1. ADD …
  2. ADD [“”,… “”]

路徑的填寫可以是容器內的絕對路徑,也可以是相對于工作目錄的相對路徑
可以是一個本地文件或者是一個本地壓縮文件,還可以是一個url
如果把寫成一個url,那么ADD就類似于wget命令
盡量不要把寫成一個文件夾,如果是一個文件夾了,會復制整個目錄的內容,包括文件系統元數據

COPY:看這個名字就知道,又是一個復制命令。將宿主機的文件拷貝到容器中
語法如下:

  1. COPY …
  2. COPY [“”,… “”]
    與ADD的區別
    COPY的只能是本地文件,其他用法一致

ENTRYPOINT:功能是啟動時的默認命令
語法如下:

  1. ENTRYPOINT [“executable”, “param1”, “param2”]
  2. ENTRYPOINT command param1 param2
    第二種就是shell寫法
    第一種就是可執行文件加參數

與CMD比較說明:

  1. 相同點:
  • 只能寫一條,如果寫了多條,那么只有最后一條生效
  • 容器啟動時才運行,運行時機相同
  1. 不同點:
  • ENTRYPOINT不會被運行的command覆蓋,而CMD則會被覆蓋
  • 如果我們在Dockerfile種同時寫了ENTRYPOINT和CMD,并且CMD指令不是一個完整的可執行命令,那么CMD指定的內容將會作為ENTRYPOINT的參數

通過dockerfile制作鏡像

docker build -f dockerfile文件路徑 -t 鏡像名稱:版本號

docker compose

前面我們使用 Docker的時候,定義 Dockerfile文件,然后使用 docker build、docker run-d–name-p等命令操作容器。然而微服務架構的應用系統一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟停,那么效率之低,維護量之大可想而知

使用 Docker Compose可以輕松、高效的管理容器,它是一個用于定義和運行多容器 Docker的應用程序工具

Docker Compose 是Docker官方編排(Orchestration)項目之一,負責快速的部署分布式應用。
其代碼目前在https://github.com/docker/compose上開源

Compose 定位是「定義和運行多個Docker容器的應用(Defining and running multi-container Dockerapplications)。

我們知道使用一個 Dockerfile模板文件,可以讓用戶很方便的定義一個單獨的應用容器。然而,在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個Web項目,除了Web服務容器本身,往往還需要再加上后端的數據庫服務容器,甚至還包括負載均衡容器等。Compose恰好滿足了這樣的需求。它允許用戶通過一個單獨的docker-compose.yml模板文件(YAML格式)來定義一組相關聯的應用容器為一個項目(project)。

Compose中有兩個重要的概念:

  • 服務(service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
  • 項目(project):由一組關聯的應用容器組成的一個完整業務單元,在docker-compose.yml文件中定義。

Compose的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理。
Compose項目由Python編寫,實現上調用了Docker服務提供的API來對容器進行管理。因此,只要所操作的平臺支持 Docker API,就可以在其上利用 Compose來進行編排管理。

安裝

# 官方安裝
#1 github官方網站 搜索Docker compose
https://github.com/docker/compose/releases/download/1.25.5/docker-compose-Linux-x86_64
#2將下載好的文件拖入Linux并剪切到/usr/local目錄下
mv docker-compose-Linux-x86_64/usr/local
#3 修改名稱(為后面方便調用)并修改其為可執行文件
mv docker-compose-Linux-x8664 docker-compose
chmod 777 docker-compose
mv docker-compose /usr/local/bin/

示例

用compose的方式管理一個Tomcat容器和MySQL

  1. 管理文件夾,創建相應的目錄
    mkdir -p /opt/docker_mysql_tomcat/
  2. 在如上目錄中編寫創建docker-compose.yml配置文件
    編寫 docker-compose.yml文件,這個是Compose使用的模板文件。
vergion:'3.1'
services:mysql:	#服務的名稱restart: always	# 只要docker啟動,容器會隨著啟動image: daocloud.io/library/mysq1:5.7.6 #指定鏡像路徑信息(默認官方鏡像地址)container_name:mysq1-3306	#指定容器名稱--nameports:- 3306:3306	#指定端口號映射environment:MYSQL_ROOT_PASSWORD:root	#指定MYSQL ROOT用戶的密碼TZ: Asiz/Shanghai	#指定時區volumes:- /opt/docker_mysql_tomcat/mysql/data:/var/lib/mysql	#映射mysq1的數據目錄到宿主機,保存數據- /opt/docker_mysql_tomcat/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf#把mysq1的配置文件映射到容器的相應目錄tomcat:restart: alwaysimage: daocloud.io/library/tomcat:8.5.15-jre8container_name:tomcat-8080ports:- 8080:8080environment:TZ: Asiz/Shanghaivolumes:- /opt/docker_mysql_tomcat/tomcat/webapps:/usr/local/tomcat/webapps- /opt/docker_mysql_tomcat/tomcat/logs:/usr/local/tomcat/logs
  1. 啟動
# 執行該docker-compose.yml文件
# 只有當該文件的名稱是docker-compose.yml的時候 且在當前文件路徑下能運行
docker-compose up -d# 如果文件名是其他的 需要指定該yml文件的名稱 且在當前文件路徑下
docker-compose -f 文件名.后綴 up -d

docker 私有倉庫(未完成)

docker swarm集群搭建(未完成)


參考目錄

https://www.bilibili.com/video/BV1CJ411T7BK
https://www.bilibili.com/video/BV1ug411j71W
https://www.bilibili.com/video/BV1CJ411T7BK
https://www.bilibili.com/video/BV1CJ411T7BK
https://www.bilibili.com/video/BV1gr4y1U7CY
https://www.bilibili.com/video/BV1Zn4y1X7AZ
https://blog.csdn.net/weixin_67102357/article/details/129399578
https://blog.csdn.net/weixin_67102357/article/details/129399578
https://blog.csdn.net/qq_45297578/article/details/117926769
https://blog.csdn.net/qq_37132495/article/details/118739692

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81818.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81818.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81818.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記錄一次服務器卡頓

一、服務器卡頓現象 服務用了一段時間后&#xff0c;突然很卡&#xff0c;發現在服務器上新建excel也很卡&#xff0c;發現服務器中病毒了&#xff0c;然后重新安裝了操作系統。重新安裝服務環境時&#xff0c;發現同時安裝pdf、tomcat時都很慢&#xff0c;只能一個安裝好了&am…

基于 Reactor 的 Java 高性能異步編程:響應式流與背壓詳解

本文將圍繞 Reactor 框架&#xff0c;深入剖析響應式流的核心機制&#xff0c;重點講解背壓&#xff08;Backpressure&#xff09;的實現原理與實際應用。通過理論結合實踐&#xff0c;希望幫助你真正掌握 Java 世界的響應式異步編程。 一、響應式編程與 Reactor 簡介 1.1 什么…

知識蒸餾實戰:用PyTorch和預訓練模型提升小模型性能

在深度學習的浪潮中&#xff0c;我們常常追求更大、更深、更復雜的模型以達到最先進的性能。然而&#xff0c;這些“龐然大物”般的模型往往伴隨著高昂的計算成本和緩慢的推理速度&#xff0c;使得它們難以部署在資源受限的環境中&#xff0c;如移動設備或邊緣計算平臺。知識蒸…

python:mysql全局大覽(保姆級教程)

本文目錄&#xff1a; 一、關于數據庫**二、sql語言分類**三、數據庫增刪改查操作**四、庫中表增刪改查操作**五、表中記錄插入**六、表約束**七、單表查詢**八、多表查詢**&#xff08;一&#xff09;外鍵約束**&#xff08;二&#xff09;連結查詢**1.交叉連接&#xff08;笛…

Android framework 問題記錄

一、休眠喚醒&#xff0c;很快熄屏 1.1 問題描述 機器休眠喚醒后&#xff0c;沒有按照約定的熄屏timeout 進行熄屏&#xff0c;很快就熄屏&#xff08;約2s~3s左右&#xff09; 1.2 原因分析&#xff1a; 抓取相關log&#xff0c;打印休眠背光 相關調用棧 //具體打印調用棧…

怎么利用JS根據坐標判斷構成單個多邊形是否合法

怎么利用JS根據坐標判斷構成單個多邊形是否合法 引言 在GIS(地理信息系統)、游戲開發、計算機圖形學等領域,判斷一組坐標點能否構成合法的簡單多邊形(Simple Polygon)是一個常見需求。合法多邊形需要滿足幾何學上的基本規則,本文將詳細介紹如何使用JavaScript實現這一判…

sqlite的拼接字段的方法(sqlite沒有convert函數)

我在sqlserver 操作方式&#xff1a; /// <summary>///獲取當前門店工資列表/// </summary>/// <param name"wheres">其他條件</param>/// <param name"ThisMendian">當前門店</param>/// <param name"IsNotU…

構建高效移動端網頁調試流程:以 WebDebugX 為核心的工具、技巧與實戰經驗

現代前端開發早已不僅僅局限于桌面瀏覽器。隨著 Hybrid 應用、小程序、移動 Web 的廣泛應用&#xff0c;開發者日常面臨的一個關鍵挑戰是&#xff1a;如何在移動設備上快速定位并解決問題&#xff1f; 這不再是“打開 DevTools 查查 Console”的問題&#xff0c;而是一個關于設…

新興技術與安全挑戰

7.1 云原生安全(K8s安全、Serverless防護) 核心風險與攻擊面 Kubernetes配置錯誤: 風險:默認開放Dashboard未授權訪問(如kubectl proxy未鑒權)。防御:啟用RBAC,限制ServiceAccount權限。Serverless函數注入: 漏洞代碼(AWS Lambda):def lambda_handler(event, cont…

《算法筆記》11.7小節——動態規劃專題->背包問題 問題 C: 貨幣系統

題目描述 母牛們不但創建了他們自己的政府而且選擇了建立了自己的貨幣系統。 [In their own rebellious way],&#xff0c;他們對貨幣的數值感到好奇。 傳統地&#xff0c;一個貨幣系統是由1,5,10,20 或 25,50, 和 100的單位面值組成的。 母牛想知道有多少種不同的方法來用貨幣…

SN生成流水號并且打亂

目前公司的產品會通過sn綁定賬號&#xff0c;但是會出現一個問題&#xff0c;流水號會容易被人猜出來導致被他人在未授權的情況下使用&#xff0c;所以開發了一個生成流水號后打亂的python程序&#xff0c;比如輸入sn的前11位后&#xff0c;后面的字符所有的排列組合有26^4方種…

msq基礎

一、檢索數據 SELECT語句 1.檢索單個列 SELECT prod_name FROM products 上述語句用SELECT語句從products表中檢索一個名prod_name的列&#xff0c;所需列名在SELECT關鍵字之后給出&#xff0c;FROM關鍵字指出從其中檢索數據的表名 &#xff08;返回數據的順序可能是數據…

【回溯 剪支 狀態壓縮】# P10419 [藍橋杯 2023 國 A] 01 游戲|普及+

本文涉及知識點 C回溯 位運算、狀態壓縮、枚舉子集匯總 P10419 [藍橋杯 2023 國 A] 01 游戲 題目描述 小藍最近玩上了 01 01 01 游戲&#xff0c;這是一款帶有二進制思想的棋子游戲&#xff0c;具體來說游戲在一個大小為 N N N\times N NN 的棋盤上進行&#xff0c;棋盤…

2025華為OD機試真題+全流程解析+備考攻略+經驗分享+Java/python/JavaScript/C++/C/GO六種語言最佳實現

華為OD全流程解析&#xff0c;備考攻略 快捷目錄 華為OD全流程解析&#xff0c;備考攻略一、什么是華為OD&#xff1f;二、什么是華為OD機試&#xff1f;三、華為OD面試流程四、華為OD薪資待遇及職級體系五、ABCDE卷類型及特點六、題型與考點七、機試備考策略八、薪資與轉正九、…

深入解析DICOM標準:文件結構、元數據、影像數據與應用

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

Visual Studio 2022 插件推薦

Visual Studio 2022 插件推薦 Visual Studio 2022 (簡稱 VS2022) 是一款強大的 IDE&#xff0c;適合各類系統組件、框架和應用的開發。插件是接入 VS2022 最重要的擴展方式之一&#xff0c;它們可以大幅提升開發效率、優化代碼質量&#xff0c;并提供強大的調試和分析功能。 …

OBS Studio:windows免費開源的直播與錄屏軟件

OBS Studio是一款免費、開源且跨平臺的直播與錄屏軟件。其支持 Windows、macOS 和 Linux。OBS適用于&#xff0c;有直播需求的人群或錄屏需求的人群。 Stars 數64,323Forks 數8413 主要特點 推流&#xff1a;OBS Studio 支持將視頻實時推流至多個平臺&#xff0c;如 YouTube、…

SCAU--平衡樹

3 平衡樹 Time Limit:1000MS Memory Limit:65535K 題型: 編程題 語言: G;GCC;VC;JAVA;PYTHON 描述 平衡樹并不是平衡二叉排序樹。 這里的平衡指的是左右子樹的權值和差距盡可能的小。 給出n個結點二叉樹的中序序列w[1],w[2],…,w[n]&#xff0c;請構造平衡樹&#xff0c…

Docker容器鏡像與容器常用操作指南

一、鏡像基礎操作 搜索鏡像 docker search <鏡像名>在Docker Hub中查找公開鏡像&#xff0c;例如&#xff1a; docker search nginx拉取鏡像 docker pull <鏡像名>:<標簽>從倉庫拉取鏡像到本地&#xff0c;標簽默認為latest&#xff1a; docker pull nginx:a…

TDengine 更多安全策略

簡介 上一節我們介紹了 TDengine 安全部署配置建議&#xff0c;除了傳統的這些配置外&#xff0c;TDengine 還有其他的安全策略&#xff0c;例如 IP 白名單、審計日志、數據加密等&#xff0c;這些都是 TDengine Enterprise 特有功能&#xff0c;其中白名單功能在 3.2.0.0 版本…