Docker(02) Docker-Compose、Dockerfile鏡像構建、Portainer

?Docker-Compose

1、Docker Desktop

在Windows上安裝Docker服務,可以使用Docker Desktop這個應用程序。

下載并安裝這樣的一個安裝包

安裝好后:執行命令?

docker --version

從Docker Hub提取hello-world映像并運行一個容器:

docker run hello-world

這行命令會讓docker從官方倉庫中拉去hello-world的鏡像到本地,并且自動將其實例化成容器

標簽含義
REPOSITORY鏡像所在的倉庫名稱
TAG鏡像標簽
IMAGEID鏡像ID
CREATED鏡像的創建日期(不是獲取該鏡像的日期)
SIZE鏡像大小

Docker?Desktop?dashboard是docker的UI工具


2、鏡像源修改設置

  "registry-mirrors": ["https://8y2y8njn.mirror.aliyuncs.com"]

docker 的鏡像源持續更新地址 :

國內能用的Docker鏡像源【2025最新持續更新】_docker 鏡像-CSDN博客


3、Docker-Compose

Docker-Compose是Docker公司推出的一個工具軟件,負責實現對Docker容器集群的快速編排。

Docker Compose和Docker版本對應關系:Compose file version 3 reference | Docker Docs

Docker Compose下載,下載這樣的一個文件

docker-compose --version


4、docker-compose.yml

docker-compose.yml

Docker-Compose的工程配置文件默認為docker-compose.yml,可通過環境變量COMPOSE_FILE或-f參數自定義配置文件,其定義了多個有依賴關系的服務及每個服務運行的容器。?

Compose允許用戶通過一個單獨的docker-compose.yml模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)

使用docker-compose前提情況,需要創建一個文件名為docker-compose.yml的文件。

version: '3'services:tomcat:restart: alwaysimage: tomcatcontainer_name: tomcatports:- 8080:8080volumes:- d://docker/tomcat/webapps:/usr/local/tomcat/webapps- d://docker/tomcat/logs:/usr/local/tomcat/logsenvironment:TZ: Asia/Shanghai

version:’3’ :表示compose對docker版本的支持,這里是compose版本,并非是docker版本。

services: 表示一個該配置文件的所有容器實例,支持配置多個容器實例。

tomcat:表示是一個多個容器中的其中一個

restart: always:表示該容器實例是隨著機器啟動而啟動。

image: tomcat:表示本容器使用的鏡像是tomcat,如需要指定版本號則 image: tomcat:8.0。

container_name: tomcat:表示容器的一個別名。

ports:表示容器端口映射到宿主機端口。

volumes:表示dockers容器的數據卷,將容器實例的目錄映射到宿主機上盤符目錄。

environment:表示容器環境的設置,我這里配置的是tomcat容器的時區時間為亞洲/上海。

后臺啟動配置中創建的容器:docker-compose up -d

停止配置中創建的容器:docker-compose stop
刪除配置中創建的容器:docker-compose down

docker-compose config -q #檢查配置,有問題才有輸出

docker-compose logs yml里面的服務id? #查看容器輸出日志


Dockerfile構建鏡像

1、Dockerfile

之前我們獲得鏡像,都是從Docker倉庫中進行下載,接下來我們自己使用Dockerfile開發一個鏡像

Dockerfile其實就是一個文本文件,由一系列命令和參數構成,Docker可以讀取Dockerfile文件并根據Dockerfile文件的描述來構建鏡像。

1、每個保留關鍵字(指令)都是必須是大寫字母
2、執行從上到下順序執行
3、#表示注釋
4、每一個指令都會創建提交一個新的鏡像層,并提交!

舉例如下:

#依賴的基礎鏡像名稱和ID
FROM centos:7
#指定鏡像創建者信息
MAINTAINER atguigu
#切換工作目錄
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相對路徑jar,把java添加到容器中
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/
#配置java環境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

鏡像分層:好處是可以共享一些基礎的層(基礎鏡像BaseImage)

添加安裝包、依賴、配置等,每次操作都形成新的一層


2、Dockerfile構建指令

命令

作用

FROM image_name:tag

定義了使用哪個基礎鏡像啟動構建流程

MAINTAINER user_name

聲明鏡像的創建者

ENV key value

在容器內部設置環境變量 (可以寫多條)

RUN command

執行shell命令、一般是安裝過程的命令

ADD source_dir/file dest_dir/file

將宿主機的文件復制到容器內,如果是一個壓縮文件,將會在復制后自動解壓

COPY source_dir/file dest_dir/file

和ADD相似,但是如果有壓縮文件并不能解壓

WORKDIR path_dir

設置工作目錄

EXPOSE:容器運行時監聽的特定網絡端口。

VOLUME:為容器創建掛載點或聲明卷

ADD:將文件、目錄或遠程URL復制到鏡像中。

ENTRYPOINT:鏡像中應用的啟動命令,容器運行時調用

Run指令

注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。例如:

FROM centos
RUN?yum?-y?install?wget
RUN?wget?-O?redis.tar.gz?"http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN?tar?-xvf?redis.tar.gz

以上執行會創建 3 層鏡像。可簡化為以下格式:

FROM centos
RUN?yum?-y?install?wget?\&&?wget?-O?redis.tar.gz?"http://download.redis.io/releases/redis-5.0.3.tar.gz"?\&&?tar?-xvf?redis.tar.gz

如上,以?&&?符號連接命令,這樣執行后,只會創建 1 層鏡像。


上傳jar包構建鏡像

1、構建思路

半自動化思路:springboot還是打包成普通的jar,然后把這個jar上傳到服務器,同時在服務器創建一個Dockerfile文件,執行docker build命令,把這個jar構建成一個docker鏡像,然后通過鏡像執行。


2、上傳jar包和Dockerfile

上傳jar包和Dockerfile文件到ubuntu服務器上,我是上傳到了myapp/hello-word這個目錄

Dockerfile文件內容如下:

# java8環境鏡像
FROM java:8
# 將宿主機的文件復制到容器內,可以重命名
ADD helloworld-0.0.1-SNAPSHOT.jar helloworld.jar
# 聲明啟動端口號
EXPOSE 8089
# 配置容器啟動后執行的命令
ENTRYPOINT ["java","-jar","helloworld.jar"]


3、docker build 鏡像構建

在Dockerfile所在目錄執行命令構建鏡像

注意后邊的空格和點,不要省略

docker build -t myhelloworld .

-t ?是給鏡像起名,格式依然是repository:tag的格式,不指定tag時,默認為latest
. ? 是指定Dockerfile所在目錄,如果就在當前目錄則指定為"."

查看鏡像是否創建完成

docker?images


maven插件構建鏡像

1、構建思路

半自動化思路:springboot pom.xml中配置maven插件支持,打包時會使用項目里面的dockerfile,如果沒配置插件支持會報錯找不到dockerfile文件


2、dockerfile-maven-plugin

dockerfile-maven-plugin是一個maven的插件,主要作用是在項目構建的時候生成基于項目的docker鏡像文件。

dockerfile-maven-plugin的目標就是將maven的打包過程和docker的build過程結合在一起,當成功打包,既生成了對應的jar,也已生成了對應的docker鏡像。


3、第一 步: pom文件引入

第一步:在pom中增加對dockerfile-maven-plugin插件的引用,核心代碼如下:

    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><configuration><dockerfile>Dockerfile</dockerfile><repository>${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><jarFile>${project.build.finalName}.jar</jarFile></buildArgs></configuration></plugin></plugins></build>

4、第二步:Dockerfile文件

在項目根目錄(和pom文件在同一級)新建一個Dokerfile文件,文件內容如下:

# java8環境鏡像
FROM java:8
# 將宿主機的文件復制到容器內,可以重命名
ADD target/${JAR_FILE} helloworld.jar
# 聲明啟動端口號
EXPOSE 8089
# 配置容器啟動后執行的命令
ENTRYPOINT ["java","-jar","helloworld.jar"]

說明: Maven 生成的 JAR 文件在 target/ 目錄中


5、第三步:DockerDesktop

在使用dockerfile-maven-plugin打包docker鏡像的時候,必須啟動DockerDesktop。

dockerfile-maven-plugin 本質上是調用本機的 Docker CLI 命令(如 docker build)來構建鏡像,而 Docker CLI 需要與 Docker 守護進程(dockerd)通信才能完成鏡像構建任務。
Docker Desktop 在 Windows/macOS 上提供了 Docker 守護進程(dockerd)和必要的運行時環境。


6、第四步:dockerfile:build

打開 IDEA 右側的 Maven 面板。
展開當前項目 → Plugins → dockerfile。
雙擊 dockerfile:build 目標,等待構建完成。

構建完成后,有2處變化,

第一是在docker desktop中多了鏡像

第二是在target目錄下多了一個


Docker應用部署舉例

1、Portainer

在云服務器上部署 Docker,并安裝 Portainer 運維面板以及漢化。

Portainer是一個可視化的Docker操作界面,提供狀態顯示面板、應用模板快速部署、容器鏡像網絡數據卷的基本操作(包括上傳下載鏡像,創建容器等操作)、事件日志顯示、容器控制臺操作、Swarm集群和服務等集中管理和操作、登錄用戶管理和控制等功能。功能十分全面,基本能滿足中小型單位對容器管理的全部需求。

1、查詢鏡像

docker search portainer

2、拉取鏡像

docker pull portainer/portainer

3、創建卷

docker volume create portainer_data

4、創建容器

創建之前我們可以先創建個文件夾存放容器的相關數據(做本地映射)

mkdir -p ?/home/docker/volume/data/

然后執行容器創建的命令:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

訪問Portainer系統

瀏覽器打開:http://portainer_IP:9000

ps:建議使用谷歌、火狐等瀏覽器打開。
3. 設置管理員


2、部署mysql

企業穩定版,5.5---5.7---8.0。本次?5.7?為準

select version();

1.查看mysql鏡像

docker search mysql

2.拉取mysql鏡像

docker pull mysql:5.7

3.創建mysql容器

docker run -d -p 3306:3306 --privileged=true -v /zzyyuse/mysql/log:/var/log/mysql -v /zzyyuse/mysql/data:/var/lib/mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  --name mysql mysql:5.7

大體分為3部分

?-p 代表端口映射,格式為 宿主機映射端口:容器運行端口

--privileged=true 放開權限

-v 掛載容器數據卷
? ? 容器卷:防止docker容器壞了,未雨綢繆
? ? 掛載在linux主機:docker容器之間,進行有效的數據維護和安全保障

-e 代表添加環境變量

MYSQL_ROOT_PASSWORD 是root用戶遠程登陸密碼創建守護式容器?

4.啟動mysql容器,在windows上遠程登錄mysql

登錄進去的界面

5.進入mysql容器查看字符編碼,密碼是設置的123456

docker exec -it 235fc9cb98de bash

show variables like 'character%';? ? ??查看字符編碼

6.解決一個docker容器mysql實例的中文亂碼問題

通過修改linux,可以同步給docker(因為用V設置了目錄掛載)

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

------------------------------------

重新啟動mysql容器,進入容器,查看編碼

docker restart mysql


3、部署tomcat

1.拉取鏡像

docker pull tomcat:7-jre7

2.創建容器

# 創建tomcat容器;并掛載了webapps目錄
docker run -di --name=mytomcat -p 9000:8080?-v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7

3.測試

在映射的宿主機目錄/usr/local/webapps下創建如下:

  • mkdir docker
  • touch /docker/index.html

瀏覽器訪問測試


4、部署nginx

1.拉取鏡像

docker?pull nginx

2. 創建容器????????

docker run -di --name=mynginx -p 80:80 nginx

3.測試

在瀏覽器


5、部署redis

1.拉取鏡像

docker?pull redis

2.創建容器

docker run -di --name=myredis -p 6379:6379 redis

3.測試

使用redis客戶端,連接redis,經測試成功連接上


Docker遷移與備份

這里又有很多命令復制過去不對,但是用手打一遍就好使了,我懷疑是中文空格的原因吧

1、docker commit 將容器保存為鏡像

docker commit 容器名稱 ?鏡像名稱

例如:docker commit mynginx mynginx_i

2、docker save 將鏡像備份為tar文件(就可以移動到別的服務器)

# 命令形式:docker save –o tar文件名 鏡像名
# 保存鏡像為文件 -o:表示output 輸出的意思
docker save -o mynginx.tar mynginx_i

3、docker load 根據tar文件恢復為鏡像

# 命令形式:docker load?-i tar文件名
docker load?-i mynginx.tar

注意:直接刪除?mynginx_i?鏡像 ,發現會報錯,因為當前鏡像的容器正在運行,需要先停止容器,刪除容器 , 在刪除鏡像。


Docker私有倉庫

私有倉庫搭建與配置

  • 1.1?拉取私有倉庫鏡像
docker pull registry
  • 1.2?啟動私有倉庫容器
docker run -di --name=registry -p 5000:5000 registry
  • 1.3?打開瀏覽器 輸入地址?http://192.168.2.108:5000/v2/_catalog?看到{"repositories":[]}?表示私有倉庫搭建成功并且內容為空

  • 1.4?修改daemon.json

vim?/etc/docker/daemon.json"insecure-registries":["192.168.2.108:5000"] #改行目的是讓容器信任該地址
systemctl?restart docker #重啟docker服務【這里還必須要重啟,光??systemctl daemon-? ? ? reload 不行】

鏡像上傳至私有倉庫

2.1標記此鏡像為私有倉庫的鏡像

# 標記鏡像為私有倉庫的鏡像 ?
# docker tag jdk1.8 宿主機IP:5000/jdk1.8
docker tag jdk1.8 192.168.2.108:5000/jdk1.8

2.2啟動私服容器

# 再次啟動私有倉庫容器 ?
docker start registry

2.3上傳標記的鏡像

# 上傳標記的鏡像 ?
# docker push 宿主機IP:5000/jdk1.8
docker push 192.168.2.108:5000/jdk1.8

2.4測試

重新刷新,發現jdk 1.8 已經上傳到私服


從私有倉庫拉取鏡像

# 執行拉取鏡像命令并查看
docker pull 192.168.2.108:5000/jdk1.8
docker images

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

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

相關文章

大數據時代UI前端的用戶體驗設計新思維:以數據為驅動的情感化設計

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;從 “經驗設計” 到 “數據共情” 的體驗革命傳統 UI 設計常陷入 “設計師主觀經…

TypeScript 學習手冊

1.TypeScript 概念 TypeScript&#xff08;簡稱 TS&#xff0c;靜態類型&#xff09;是微軟公司開發的一種基于 JavaScript &#xff08;簡稱 JS&#xff0c;動態類型&#xff09;語言的編程語言。TypeScript 可以看成是 JavaScript 的超集&#xff08;superset&#xff09;&a…

掌握現代CSS:變量、變形函數與動態計算

CSS近年來發展迅速&#xff0c;引入了許多強大的功能&#xff0c;如變量、高級變形函數和動態計算能力。本文將深入探討如何在CSS中設置并使用變量&#xff0c;以及如何有效利用translate3d、translateY和translateX等變形方法。我們還將解析var()和calc()函數的關鍵作用。一、…

貝爾量子實驗設想漏洞

1 0 1 0 1 1 0 1 0 1 1 1 0 0 1 0 帶墨鏡如果先上下交換再左右交換&#xff0c;很可能不一樣的概率是2%&#xff0c;但是因為交換誕生了一個與之前序列相同的所以不一樣概率變成1%&#xff0c;我們在測的時候不能這么測啊&#xff0c;你得看序列完…

在 Android 庫模塊(AAR)中,BuildConfig 默認不會自動生成 VERSION_CODE 和 VERSION_NAME 字段

為什么AAR庫模塊的 BuildConfig 沒有 versionCode 和 versionName&#xff1f; aar庫模塊的 BuildConfig 默認不包含版本信息 應用模塊&#xff08;com.android.application&#xff09;會自動生成 versionCode 和 versionName 到 BuildConfig。但庫模塊&#xff08;com.androi…

強化學習 (11)隨機近似

計算均值的新方法有兩種方法。第一種方法很直接&#xff0c;即收集所有樣本后計算平均值&#xff1b;但這種方法的缺點是&#xff0c;若樣本是在一段時間內逐個收集的&#xff0c;我們必須等到所有樣本都收集完畢。第二種方法可避免此缺點&#xff0c;因為它以增量迭代的方式計…

PHP `implode` 深度解析:從基礎到高階實戰指南

文章目錄一、基礎語法與底層原理執行過程解析&#xff1a;二、性能關鍵&#xff1a;避免隱含陷阱1. 類型轉換黑盒2. 大數組內存優化3. 關聯數組處理三、高階應用場景1. SQL語句安全構建2. CSV文件生成3. 模板引擎實現四、多維數組處理方案1. 遞歸降維2. JSON轉換橋接五、性能對…

開發語言中關于面向對象和面向過程的筆記

開發語言中關于面向對象和面向過程的筆記市面主流語言分類面向過程面向對象市面主流語言分類 面向過程編程&#xff08;Procedural Programming&#xff09;&#xff1a;C語言&#xff1b;面向對象編程語言&#xff08;Object-Oriented Programming, OOP&#xff09; &#xf…

AI產品經理面試寶典第3天:技術分層、邊界與市場全景系列面試題

面試指導 面試官:請從技術實現效果的角度,解釋AI技術分層。 你的回答: AI技術分為三層。 第一層是認知層:通過圖像處理、語音識別、自然語言理解等技術,讓機器感知環境。比如攝像頭識別行人動作,麥克風捕捉用戶指令。 第二層是預測層:基于行為數據預判下一步需求。例如…

Intel英特爾ICH7R/ICH8R/ICH9R/ICH10R系列下載地址--intel_msm_8961002 下載 Version 8.9.6.1002

Intel英特爾ICH7R/ICH8R/ICH9R/ICH10R系列下載地址intel_msm_8961002 下載 Version 8.9.6.1002https://xiazai.zol.com.cn/detail/66/653449.shtml通過網盤分享的文件&#xff1a;intel_msm_8961002.zip 鏈接: https://pan.baidu.com/s/13N9ZLXWkaWaEHQ5P90Jt0g?pwd3790 提取碼…

AI(學習筆記第五課) 使用langchain進行AI開發 load documents(web)

文章目錄AI(學習筆記第五課) 使用langchain進行AI開發 load documents(web)學習內容&#xff1a;1.load documents&#xff08;web&#xff09;1.1 學習url1.2 提前安裝python的package1.2 使用WebBaseLoader進行webpage的load1.3 使用BeautifulSoup4進行webpage的部分截取1.4 …

使用macvlan實現容器的跨主機通信

使用環境&#xff1a; 兩臺運行docker的服務器 A機器網段&#xff1a;192.168.86.61 B機器網段&#xff1a;192.168.86.62 運行的容器需裝有ping指令&#xff0c; 實驗參數解釋&#xff1a; -d macvlan 指定創建網絡驅動類型 --subnet 指定子網范圍 -gateway 指定網關地址 -o p…

深度學習_全連接神經網絡

1.什么是神經網絡神經網絡中信息只向一個方向移動&#xff0c;即從輸入節點向前移動&#xff0c;通過隱藏節點&#xff0c;再向輸出節點移 動&#xff0c;網絡中沒有循環或者環。其中的基本構件是&#xff1a; 輸入層&#xff1a;即輸入x的那一層 輸出層&#xff1a;即輸出y的那…

OpenLayers使用

初學ol&#xff0c;實現了高德地圖不同圖層的切換、交互性地圖飛行以及加載本地JSON數據。說一下不同圖層切換的想法&#xff1a;1.對于標準地圖和衛星地圖&#xff1a;二者最初便掛載到map上&#xff0c;兩個圖層是疊加顯示的&#xff1b;當點擊按鈕時&#xff0c;其實是使用 …

day4--上傳圖片、視頻

1. 分布式文件系統 1.1 什么是分布式文件系統 文件系統是負責管理和存儲文件的系統軟件&#xff0c;操作系統通過文件系統提供的接口去存取文件&#xff0c;用戶通過操作系統訪問磁盤上的文件。 下圖指示了文件系統所處的位置&#xff1a; 常見的文件系統&#xff1a;FAT16/FA…

極矢量與軸矢量

物理量分為標量和矢量&#xff0c;矢量又分為極矢量和軸矢量。 矢量是既有大小又有方向并按平行四邊形法則相加的量。矢量有極矢量和軸矢量兩種&#xff0c;其間的區別是在鏡像反射變換下遵循不同的變換規律,許多物理量都是矢量,同樣,其中也有極矢量和軸矢量的區分,在力學中,例…

文章發布易優CMS(Eyoucms)網站技巧

為了更快的上手數據采集及發布到易優CMS(eyoucms)網站&#xff0c;特地總結了些新手常常會遇到的操作問題與技巧&#xff0c;如下&#xff1a; 免費易優CMS采集發布插件下載&#xff0c;兼容火車頭、八爪魚、簡數采集等 目錄 1. 發布到易優CMS指定欄目 2. 發布文章到易優CM…

INA226 數據手冊解讀

INA226是一款數字電流檢測放大器&#xff0c;配備I2C和SMBus兼容接口。該器件可提供數字電流、電壓以及功率讀數&#xff0c;可靈活配置測量分辨率&#xff0c;并具備連續運行與觸發操作模式。該芯片通常由一個單獨的電源供電&#xff0c;電壓范圍為 2.7V 至 5.5V引腳說明??引…

Linux 中替換sed

以下是關于 sed&#xff08;Stream Editor&#xff09;的深度詳解和日常高頻使用場景&#xff0c;結合實用示例說明&#xff1a;一、sed 核心概念 流式編輯器&#xff1a;逐行處理文本&#xff0c;不直接修改源文件&#xff08;除非使用 -i 選項&#xff09;正則支持&#xff1…

ADB 調試日志全攻略:如何開啟與關閉 `ADB_TRACE` 日志

ADB 調試日志全攻略&#xff1a;如何開啟與關閉 ADB_TRACE 日志 ADB&#xff08;Android Debug Bridge&#xff09;是 Android 開發的核心工具&#xff0c;但在排查問題時&#xff0c;默認日志可能不夠詳細。通過設置環境變量 ADB_TRACE&#xff0c;可以開啟 全量調試日志&…