初識 docker [下] 項目部署

  • 項目部署
    • Dockerfile
      • 構建鏡像
    • DockerCompose
      • 基本語法
      • 基礎命令

項目部署

前面我們一直在使用別人準備好的鏡像,那如果我要部署一個Java項目,把它打包為一個鏡像該怎么做呢?

…省略一萬字
站在巨人的肩膀上更適合我們普通人,所以直接介紹兩種簡單方法來構建項目部署


Dockerfile

制作鏡像的過程中,需要逐層處理和打包,比較復雜,所以Docker就提供了自動打包鏡像的功能。我們只需要將打包的過程,每一層要做的事情用固定的語法寫下來,交給Docker去執行即可。
而這種記錄鏡像結構的文件就稱為Dockerfile,其對應的語法可以參考官方文檔:
https://docs.docker.com/engine/reference/builder/

指令說明示例
FROM指定基礎鏡像FROM centos:6
ENV設置環境變量,可在后面指令使用ENV key value
COPY拷貝本地文件到鏡像的指定目錄COPY ./xx.jar /tmp/app.jar
RUN執行Linux的shell命令,一般是安裝過程的命令RUN yum install gcc
EXPOSE指定容器運行時監聽的端口,是給鏡像使用者看的EXPOSE 8080
ENTRYPOINT鏡像中應用的啟動命令,容器運行時調用ENTRYPOINT java -jar xx.jar

例如,要基于Ubuntu鏡像來構建一個Java應用,其Dockerfile內容如下:

# 指定基礎鏡像
FROM ubuntu:16.04
# 配置環境變量,JDK的安裝目錄、容器內時區
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷貝jdk和java項目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 設定時區
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安裝JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8
# 配置環境變量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定項目監聽的端口
EXPOSE 8080
# 入口,java項目的啟動命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

思考一下:以后我們會有很多很多java項目需要打包為鏡像,他們都需要Linux系統環境、JDK環境這兩層,只有上面的3層不同(因為jar包不同)。如果每次制作java鏡像都重復制作前兩層鏡像,是不是很麻煩。

于是又有前人給我整理好了通用的基礎模板供我們使用, 以此省去JDK的配置

# 基礎鏡像
FROM openjdk:11.0-jre-buster
# 設定時區
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷貝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

構建鏡像

當Dockerfile文件寫好以后,就可以利用命令來構建鏡像了。

在這里插入圖片描述
首先,我們將自己的docker-demo.jar包以及Dockerfile拷貝到虛擬機的/root/demo目錄,然后,執行命令,構建鏡像:

# 進入鏡像目錄
cd /root/demo
# 開始構建
docker build -t docker-demo:1.0 .

命令說明:

  • docker build : 就是構建一個docker鏡像
  • -t docker-demo:1.0 :-t參數是指定鏡像的名稱(repository和tag)
  • . : 最后的點是指構建時Dockerfile所在路徑,由于我們進入了demo目錄,所以指定的是.代表當前目錄,也可以直接指定Dockerfile目錄:
    或者
# 直接指定Dockerfile目錄
docker build -t docker-demo:1.0 /root/demo

這樣就打包好了我們自己的鏡像
然后配合別的鏡像進行部署,但是這樣的部署放松太過復亂容易出錯,有沒有可以一套配置同時部署多個容器切容器緊密相連的呢–DockerCompose(章魚哥應運而生)

DockerCompose

Docker Compose 是 Docker 官方提供的一個工具,用于定義和管理多個容器應用。它通過一個 YAML 配置文件(通常叫作 docker-compose.yml)來描述應用中所有容器的服務、網絡、數據卷等。其中他還可以根據dockerfile構建鏡像
在這里插入圖片描述
Docker Compose就可以幫助我們實現多個相互關聯的Docker容器的快速部署。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器。

基本語法

docker-compose.yml文件的基本語法可以參考菜鳥教程

docker-compose文件中可以定義多個相互關聯的應用容器,每一個應用容器被稱為一個服務(service)。由于service就是在定義某個應用的運行時參數,因此與docker run參數非常相似。
在這里插入圖片描述
非常相似

docker run 參數docker compose 指令說明
–namecontainer_name容器名稱
-pports端口映射
-eenvironment環境變量
-vvolumes數據卷配置
–networknetworks網絡

明白了其中的對應關系,相信編寫docker-compose文件應該難不倒大家。

eg 黑馬商城部署文件:

version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: hmall

基礎命令

使用上面方法構建的項目需要使用下面的命令來操作

基本語法如下:
docker compose [OPTIONS] [COMMAND]
用[] 框住表示 OPTIONS和COMMAND都是可選參數,比較常見的有:

在這里插入圖片描述
教學演示:

# 1.進入root目錄
cd /root# 2.刪除舊容器
docker rm -f $(docker ps -qa)# 3.刪除hmall鏡像
docker rmi hmall# 4.清空MySQL數據
rm -rf mysql/data# 5.啟動所有, -d 參數是后臺啟動
docker compose up -d
# 結果:
[+] Building 15.5s (8/8) FINISHED=> [internal] load build definition from Dockerfile                                    0.0s=> => transferring dockerfile: 358B                                                    0.0s=> [internal] load .dockerignore                                                       0.0s=> => transferring context: 2B                                                         0.0s=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster             15.4s=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3  0.0s=> [internal] load build context                                                       0.0s=> => transferring context: 98B                                                        0.0s=> CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo   0.0s=> CACHED [3/3] COPY hm-service.jar /app.jar                                           0.0s=> exporting to image                                                                  0.0s=> => exporting layers                                                                 0.0s=> => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71  0.0s=> => naming to docker.io/library/root-hmall                                           0.0s
[+] Running 4/4? Network hmall    Created                                                             0.2s? Container mysql  Started                                                             0.5s? Container hmall  Started                                                             0.9s? Container nginx  Started                                                             1.5s# 6.查看鏡像
docker compose images
# 結果
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
hmall               root-hmall          latest              32eebee16acd        362MB
mysql               mysql               latest              3218b38490ce        516MB
nginx               nginx               latest              605c77e624dd        141MB# 7.查看容器
docker compose ps
# 結果
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s…"   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint.…"   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp

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

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

相關文章

Android15廣播ANR的源碼流程分析

Android15的廣播ANR源碼流程跟了下實際代碼的流程,大概如下哈:App.sendBroadcast() // 應用發起廣播→ AMS.broadcastIntentWithFeature() // 通過Binder IPC進入system_server進程→ AMS.broadcastIntentLocked() // 權限校驗廣播分類(前…

密碼學中的概率論與統計學:從頻率分析到現代密碼攻擊

在密碼學的攻防博弈中,概率論與統計學始終是破解密碼的“利器”。從古典密碼時期通過字母頻率推測凱撒密碼的密鑰,到現代利用線性偏差破解DES的線性密碼分析,再到側信道攻擊中通過功耗數據的統計特性還原密鑰,統計思維貫穿了密碼分…

力扣刷題977——有序數組的平方

977. 有序數組的平方 題目: 給你一個按 非遞減順序 排序的整數數組 nums,返回 每個數字的平方 組成的新數組,要求也按 非遞減順序 排序。示例 1: 輸入:nums [-4,-1,0,3,10] 輸出:[0,1,9,16,100] 解釋&…

應用加速游戲盾的安全作用

在數字娛樂產業蓬勃發展的今天,游戲已從單純的娛樂工具演變為連接全球數十億用戶的社交平臺與文化載體。然而,伴隨游戲市場的指數級增長,網絡攻擊的頻率與復雜性也呈爆發式上升。從DDoS攻擊導致服務器癱瘓,到外掛程序破壞公平競技…

linux安裝zsh,oh-my-zsh,配置zsh主題及插件的方法

這是一份非常詳細的指南,帶你一步步在 Linux 系統中安裝 Zsh、配置主題和安裝插件。 Zsh(Z Shell)是一個功能強大的 Shell,相比于大多數 Linux 發行版默認的 Bash,它提供了更強的自定義能力、更智能的自動補全、更漂亮…

【設計模式系列】策略模式vs模板模式

策略模式是什么?如何定義并封裝一系列算法策略模式 (Strategy Pattern)模板模式 (Template Pattern)模板模式與策略模式的深度對比與區分混合使用兩種模式的場景策略模式 (Strategy Pattern) 應用場景:當需要根據不同條件選擇不同算法或行為時&#xff…

aigc(1.1) opensora-2.0

open sora-2.0相關鏈接: arxiv鏈接 huggingface頁面 HunyuanVideo VAE open sora2.0的VAE模型復用了HunyuanVideo的3D VAE,HunyuanVideo的arxiv鏈接。下圖來自論文,可見VAE是一個因果注意力的3D結構。在配圖左側,視頻會被編碼為video token序列,而在配圖右側,去噪的vide…

Linux驅動21 --- FFMPEG 音頻 API

目錄 一、FFMPEG 音頻 API 1.1 解碼步驟 創建核心上下文指針 打開輸入流 獲取輸入流 獲取解碼器 初始化解碼器 創建輸入流指針 創建輸出流指針 初始化 SDL 配置音頻參數 打開音頻設備 獲取一幀數據 發送給解碼器 從解碼器獲取數據 開辟數據空間 初始化內存 音頻重采樣…

《計算機“十萬個為什么”》之 [特殊字符] 序列化與反序列化:數據打包的奇妙之旅 ??

《計算機“十萬個為什么”》之 📦 序列化與反序列化:數據打包的奇妙之旅 ??歡迎來到計算機“十萬個為什么”系列! 本文將以「序列化與反序列化」為主題,深入探討計算機世界中數據的打包與解包過程。 讓我們一起解開數據的神秘面…

機器學習與深度學習評價指標

機器學習與深度學習評價指標完全指南 ?? 為什么需要評價指標? 想象你是一位醫生,需要判斷一個診斷模型的好壞。如果模型說"這個病人有癌癥",你需要知道: 這個判斷有多準確? 會不會漏掉真正的癌癥患者? 會不會誤診健康的人? 評價指標就像是給AI模型打分的&…

Hugging Face-環境配置

打開anaconda promptconda activate pytorchpip install -i https://pypi.tuna.tsinghua.edu.cn/simple transformers datasets tokenizerspycharm找到pytorch下的python.exe#將模型下載到本地調用 from transformers import AutoModelForCausalLM,AutoTokenizer#將模型和分詞工…

cnn中池化層作用

一、池化層概述 在卷積神經網絡中,池化層是核心組件之一,主要作用是逐步降低特征圖的空間尺寸即寬和高,從而減少計算量、控制過擬合并增強模型的魯棒性。 核心作用 降維與減少計算量 壓縮特征圖的尺寸,顯著減少后續層的參數數量和…

寫一個音樂爬蟲

今天我們寫一個網易云音樂的爬蟲,爬取網易云音樂熱歌榜音樂鏈接并下載,這里用到了之前引用的BeautifulSoup和requests。 BeautifulSoup是一個Python庫,用于從HTML和XML文件中提取數據。它提供了一種簡單的方式來遍歷文檔樹和搜索文檔樹中的元…

戰斗公式和傷害走配置文件

故事背景,上次屬性計算用的配置,這次傷害計算也走配置,下面是測試代碼和測試數據local formulas {[100001]{id 100001,name "基礎傷害",formula "function (self,tag,ishit,iscritial,counterratio)\n if ishit1 then\n …

線性代數 上

文章目錄線性代數知識整理一、求行列式1、 套公式2、利用性質,化為可套公式3、抽象行列式4、抽象向量二、代數余子式的線性組合三、求AnA^nAn四、證明A可逆五、求A的逆1、定義法2、初等變換3、公式六、求秩七、線性表示的判定八、線性無關九、求極大線性無關組十、等…

紅帽AI推理服務器三大特點

生成式人工智能(Gen AI)的迅猛發展,對大型語言模型(LLM)的部署提出了更高的性能、靈活性和效率要求。無論部署在何種環境中,紅帽AI推理服務器都為用戶提供經過強化并獲得官方支持的vLLM發行版,配…

開始記錄一步步學習pcl

安裝參考,大神寫的非常詳細,一步到位 https://blog.csdn.net/qq_36812406/article/details/144307648?ops_request_misc%257B%2522request%255Fid%2522%253A%25220e215e6ac266b90ded12ed6b2eab1257%2522%252C%2522scm%2522%253A%252220140713.13010233…

Linux系統Centos7 安裝mysql5.7教程 和mysql的簡單指令

目錄 一. 安裝 MySQL 官方 Yum 倉庫 二. 安裝 MySQL 5.7 1.查看可用的mysql版本倉庫 2.啟用MySql5.7倉庫 3.禁用更高版本的倉庫(可選) 4.導入 MySQL GPG 公鑰 5.安裝MySql5.7 三. 啟動 MySQL 服務 1.啟動 MySQL 服務 2. 設置開機自啟 3.查看服…

嵌入式——C語言:指針③

一、函數指針和指針函數(一)指針函數:是函數,函數的返回值是指針1.不能返回局部變量的值2.指針函數返回的地址可以作為下一個函數調用的參數(二)函數指針:是指針,指針指向一個函數in…

OpenCV(05)直方圖均衡化,模板匹配,霍夫變換,圖像亮度變換,形態學變換

【OpenCV(01)】基本圖像操作、繪制,讀取視頻 【OpenCV(02)】圖像顏色處理,灰度化,二值化,仿射變換 【OpenCV(03)】插值方法,邊緣填充&#xff0…