Docker跨平臺(tái)和環(huán)境部署的過(guò)程詳解
Docker 是一個(gè)開源的容器化平臺(tái),通過(guò)將應(yīng)用程序和其依賴打包在一個(gè)輕量級(jí)、獨(dú)立的容器中,能夠跨平臺(tái)和環(huán)境部署。
1. Docker 基本概念
- 鏡像 (Image):Docker 鏡像是一個(gè)只讀模板,包含運(yùn)行應(yīng)用程序所需的代碼、庫(kù)、依賴和環(huán)境配置。鏡像類似于一個(gè)模板,可以用來(lái)創(chuàng)建容器。
- 容器 (Container):容器是鏡像的一個(gè)運(yùn)行實(shí)例,它可以運(yùn)行一個(gè)或多個(gè)進(jìn)程,且具有隔離性。容器的生命周期短暫,可以隨時(shí)啟動(dòng)、停止或銷毀。
- Dockerfile:Dockerfile 是一組指令文件,用來(lái)定義鏡像的構(gòu)建過(guò)程。開發(fā)者可以通過(guò) Dockerfile 編寫應(yīng)用及其依賴環(huán)境的打包腳本。
倉(cāng)庫(kù) (Repository):Docker 鏡像的存儲(chǔ)位置,類似于代碼的版本控制系統(tǒng)。鏡像可以推送到倉(cāng)庫(kù)中供其他用戶下載使用。Docker Hub 是一個(gè)公共倉(cāng)庫(kù),提供了大量的官方和社區(qū)鏡像。
2. Docker 的優(yōu)勢(shì)
- 輕量級(jí):Docker 使用系統(tǒng)級(jí)別的虛擬化,而非虛擬機(jī),不需要完整的操作系統(tǒng),容器啟動(dòng)速度更快,占用資源更少。
- 環(huán)境一致性:Docker 容器包含應(yīng)用運(yùn)行所需的全部環(huán)境配置,確保在不同環(huán)境中行為一致,減少了環(huán)境配置不一致導(dǎo)致的問(wèn)題。
- 快速部署與擴(kuò)展:Docker 支持快速部署和縮放,可以在幾秒鐘內(nèi)啟動(dòng)多個(gè)實(shí)例,適合大規(guī)模應(yīng)用的部署和擴(kuò)展。
- 便于 CI/CD:Docker 與 DevOps 流程無(wú)縫集成,支持持續(xù)集成、交付和部署。
3. Docker 安裝
安裝參考Docker官方文檔,地址如下:https://docs.docker.com/engine/install/centos/
3.1 卸載舊版
首先如果系統(tǒng)中已經(jīng)存在舊的Docker,則先卸載:
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine \ docker-selinux
3.2 配置Docker的yum庫(kù)
首先要安裝一個(gè)yum工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
安裝成功后,執(zhí)行命令,配置Docker的yum源:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
更新yum,建立緩存
sudo yum makecache fast
3.3 安裝Docker
最后,執(zhí)行命令,安裝Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3.4 啟動(dòng)和校驗(yàn)
# 啟動(dòng)Docker systemctl start docker # 停止Docker systemctl stop docker # 重啟 systemctl restart docker # 設(shè)置開機(jī)自啟 systemctl enable docker # 執(zhí)行docker ps命令,如果不報(bào)錯(cuò),說(shuō)明安裝啟動(dòng)成功 docker ps
4. Docker 基本使用
Docker本身包含一個(gè)后臺(tái)服務(wù),我們可以利用Docker命令告訴Docker服務(wù),幫助我們快速部署指定的應(yīng)用。Docker服務(wù)部署應(yīng)用時(shí),首先要去搜索并下載應(yīng)用對(duì)應(yīng)的鏡像,然后根據(jù)鏡像創(chuàng)建并允許容器,應(yīng)用就部署完成了。
4.1 Docker 命令
默認(rèn)情況下,每次重啟虛擬機(jī)我們都需要手動(dòng)啟動(dòng)Docker和Docker中的容器。通過(guò)命令可以實(shí)現(xiàn)開機(jī)自啟:
# Docker開機(jī)自啟 systemctl enable docker # Docker容器開機(jī)自啟 docker update --restart=always [容器名/容器id]
4.2 Docker部署MySQL服務(wù)示例
docker run -d \ # 以后臺(tái)模式啟動(dòng)容器(detached mode)。 --name mysql \ # 將容器命名為 "mysql",便于管理。 -p 3306:3306 \ # 將主機(jī)的 3306 端口映射到容器的 3306 端口,方便本地主機(jī)訪問(wèn) MySQL 服務(wù)。 -e TZ=Asia/Shanghai \ # 設(shè)置容器的時(shí)區(qū)為上海時(shí)間(Asia/Shanghai),以確保時(shí)間一致。 -e MYSQL_ROOT_PASSWORD=123 \ # 設(shè)置 MySQL root 用戶的密碼為 "123"(實(shí)際環(huán)境中應(yīng)使用復(fù)雜密碼)。 -v ./mysql/data:/var/lib/mysql \ # 掛載本地?cái)?shù)據(jù)目錄到容器的 MySQL 數(shù)據(jù)目錄,以持久化存儲(chǔ)數(shù)據(jù)庫(kù)數(shù)據(jù)。 -v ./mysql/conf:/etc/mysql/conf.d \ # 掛載本地配置目錄到容器的 MySQL 配置目錄,以便加載自定義配置文件。 -v ./mysql/init:/docker-entrypoint-initdb.d \ # 掛載本地初始化腳本目錄到容器,容器啟動(dòng)時(shí)將執(zhí)行目錄中的腳本。 mysql # 使用官方 MySQL 鏡像。
鏡像的名稱不是隨意的,而是要到DockerRegistry中尋找,鏡像運(yùn)行時(shí)的配置也不是隨意的,要參考鏡像的幫助文檔,這些在DockerHub網(wǎng)站或者軟件的官方網(wǎng)站中都能找到。
4.3 Dockerfile制作鏡像
鏡像的來(lái)源有兩種:
(1)直接去DockerRegistry下載
(2)基于官方基礎(chǔ)鏡像自己制作
由于制作鏡像的過(guò)程中,需要逐層處理和打包,比較復(fù)雜,所以Docker就提供了自動(dòng)打包鏡像的功能。我們只需要將打包的過(guò)程,每一層要做的事情用固定的語(yǔ)法寫下來(lái),交給Docker去執(zhí)行即可。
而這種記錄鏡像結(jié)構(gòu)的文件就稱為Dockerfile,其對(duì)應(yīng)的語(yǔ)法可以參考官方文檔:
https://docs.docker.com/engine/reference/builder
例如,要基于Ubuntu鏡像來(lái)構(gòu)建一個(gè)Java應(yīng)用,其Dockerfile內(nèi)容如下:
# 基礎(chǔ)鏡像 FROM openjdk:11.0-jre-buster # 設(shè)定時(shí)區(qū) 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"]
然后,執(zhí)行命令,構(gòu)建鏡像:
# 使用 Docker 從指定目錄中的 Dockerfile 構(gòu)建鏡像 docker build -t docker-demo:1.0 /root/demo # 參數(shù)說(shuō)明: # docker build # Docker 命令,用于從 Dockerfile 構(gòu)建鏡像 # -t docker-demo:1.0 # 使用 -t 參數(shù)為鏡像指定名稱和標(biāo)簽(版本號(hào)) # docker-demo # 鏡像的名稱,用于標(biāo)識(shí)構(gòu)建出的鏡像 # 1.0 # 鏡像的版本號(hào)(tag),用于區(qū)分不同版本,格式為 <鏡像名>:<版本號(hào)> # /root/demo # 指定 Dockerfile 所在的目錄路徑,Docker 將在該目錄中查找名為 Dockerfile 的文件
4.4 網(wǎng)絡(luò)
Java項(xiàng)目往往需要訪問(wèn)其它各種中間件,例如MySQL、Redis等。放在同一個(gè)網(wǎng)絡(luò)中,我們的容器之間能互相訪問(wèn)。
4.5 Docker Compose
Docker Compose 是一個(gè)工具,允許用戶定義并運(yùn)行多個(gè)容器服務(wù)。通過(guò)編寫 docker-compose.yml
文件,用戶可以輕松地配置應(yīng)用的多個(gè)服務(wù)并管理它們。
稍微復(fù)雜的項(xiàng)目,會(huì)有各種各樣的其它中間件,需要部署的東西很多。如果手動(dòng)的逐一部署,就太麻煩了。
而Docker Compose就可以幫助我們實(shí)現(xiàn)多個(gè)相互關(guān)聯(lián)的Docker容器的快速部署。它允許用戶通過(guò)一個(gè)單獨(dú)的 docker-compose.yml 模板文件(YAML 格式)來(lái)定義一組相關(guān)聯(lián)的應(yīng)用容器。
舉例來(lái)說(shuō),用docker run部署MySQL的命令如下:
docker run -d \ # 以后臺(tái)模式啟動(dòng)容器(detached mode)。 --name mysql \ # 將容器命名為 "mysql",便于管理。 -p 3306:3306 \ # 將主機(jī)的 3306 端口映射到容器的 3306 端口,方便本地主機(jī)訪問(wèn) MySQL 服務(wù)。 -e TZ=Asia/Shanghai \ # 設(shè)置容器的時(shí)區(qū)為上海時(shí)間(Asia/Shanghai),以確保時(shí)間一致。 -e MYSQL_ROOT_PASSWORD=123 \ # 設(shè)置 MySQL root 用戶的密碼為 "123"(實(shí)際環(huán)境中應(yīng)使用復(fù)雜密碼)。 -v ./mysql/data:/var/lib/mysql \ # 掛載本地?cái)?shù)據(jù)目錄到容器的 MySQL 數(shù)據(jù)目錄,以持久化存儲(chǔ)數(shù)據(jù)庫(kù)數(shù)據(jù)。 -v ./mysql/conf:/etc/mysql/conf.d \ # 掛載本地配置目錄到容器的 MySQL 配置目錄,以便加載自定義配置文件。 -v ./mysql/init:/docker-entrypoint-initdb.d \ # 掛載本地初始化腳本目錄到容器,容器啟動(dòng)時(shí)將執(zhí)行目錄中的腳本。 mysql # 使用官方 MySQL 鏡像。
如果用docker-compose.yml
文件來(lái)定義,就是這樣:
# Docker Compose 配置文件,版本為 3.8 version: "3.8" # 定義多個(gè)服務(wù) services: # 定義 MySQL 服務(wù) mysql: # 使用官方的 MySQL 鏡像 image: mysql # 指定容器名稱 container_name: mysql # 映射主機(jī)和容器的端口 ports: - "3306:3306" # 將主機(jī)的 3306 端口映射到容器的 3306 端口 # 設(shè)置環(huán)境變量 environment: TZ: Asia/Shanghai # 設(shè)置容器的時(shí)區(qū)為亞洲/上海 MYSQL_ROOT_PASSWORD: 123 # 設(shè)置 MySQL 根用戶的密碼為 123 # 掛載主機(jī)目錄到容器中,用于持久化數(shù)據(jù)和自定義配置 volumes: - "./mysql/conf:/etc/mysql/conf.d" # 掛載本地的配置文件夾到容器的 MySQL 配置目錄 - "./mysql/data:/var/lib/mysql" # 掛載本地的數(shù)據(jù)文件夾到容器的 MySQL 數(shù)據(jù)目錄 # 指定網(wǎng)絡(luò)配置 networks: - new # 將此服務(wù)連接到名為 new 的網(wǎng)絡(luò) # 定義網(wǎng)絡(luò) networks: new: name: cyt # 指定網(wǎng)絡(luò)的名稱為 cyt
編寫好docker-compose.yml文件,就可以部署項(xiàng)目了。常見的命令:
# 啟動(dòng)所有, -d 參數(shù)是后臺(tái)啟動(dòng) docker compose up -d
5. 部署示例
項(xiàng)目說(shuō)明:
- cyt:后端代碼
- cyt-portal:用戶端的前端代碼
- cyt-admin:管理端的前端代碼
5.1 逐個(gè)部署
5.1.1 部署Java項(xiàng)目
注意:host采用了mysql作為地址,剛好是我們的mysql容器名,只要兩者在一個(gè)網(wǎng)絡(luò),就一定能互相訪問(wèn)。
首先將項(xiàng)目打包;
將項(xiàng)目
目錄下的Dockerfile
和/target
目錄下的.jar
一起上傳到虛擬機(jī)的root
目錄。
# 1.首先通過(guò)命令創(chuàng)建一個(gè)網(wǎng)絡(luò) docker network create cytnet # 1.構(gòu)建項(xiàng)目鏡像,不指定tag,則默認(rèn)為latest docker build -t cyt. # 2.創(chuàng)建并運(yùn)行容器,并通過(guò)--network將其加入hmall網(wǎng)絡(luò),這樣才能通過(guò)容器名訪問(wèn)mysql docker run -d --name cyt --network cytnet -p 8080:8080 cyt
5.1.2 部署前端
將前端代碼拷貝到nginx的html目錄下,在nginx.conf
配置文件,完成對(duì)html
下的兩個(gè)靜態(tài)資源目錄做代理。
將整個(gè)nginx目錄上傳到虛擬機(jī)的/root
目錄下
docker run -d \ --name nginx \ -p 18080:18080 \ -p 18081:18081 \ -v /root/nginx/html:/usr/share/nginx/html \ -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \ --network hmall \ nginx
5.2 DockerCompose一鍵部署
編寫docker-compose.yml文件
version: "3.8" # 定義 Docker Compose 文件的版本 services: # MySQL 數(shù)據(jù)庫(kù)服務(wù) mysql: image: mysql # 使用官方 MySQL 鏡像 container_name: mysql # 設(shè)置容器名稱為 "mysql" ports: - "3306:3306" # 將主機(jī)的 3306 端口映射到容器的 3306 端口 environment: TZ: Asia/Shanghai # 設(shè)置容器的時(shí)區(qū)為亞洲/上海 MYSQL_ROOT_PASSWORD: 123 # 設(shè)置 MySQL 的 root 用戶密碼 volumes: - "./mysql/conf:/etc/mysql/conf.d" # 掛載自定義配置文件目錄到容器中 - "./mysql/data:/var/lib/mysql" # 持久化存儲(chǔ) MySQL 數(shù)據(jù)庫(kù)的數(shù)據(jù) - "./mysql/init:/docker-entrypoint-initdb.d" # 初始化 SQL 腳本目錄 networks: - cyt-net # 連接到名為 "cyt-net" 的自定義網(wǎng)絡(luò) # Java 應(yīng)用服務(wù)(cyt) cyt: build: context: . # 設(shè)置構(gòu)建上下文為當(dāng)前目錄 dockerfile: Dockerfile # 指定構(gòu)建 Java 應(yīng)用的 Dockerfile 文件 container_name: cyt # 設(shè)置容器名稱為 "cyt" ports: - "8080:8080" # 將主機(jī)的 8080 端口映射到容器的 8080 端口 networks: - cyt-net # 連接到自定義網(wǎng)絡(luò) "cyt-net" depends_on: - mysql # 設(shè)置依賴關(guān)系:確保 MySQL 容器在 cyt 容器之前啟動(dòng) # Nginx 反向代理服務(wù) nginx: image: nginx # 使用官方 Nginx 鏡像 container_name: nginx # 設(shè)置容器名稱為 "nginx" ports: - "18080:18080" # 將主機(jī)的 18080 端口映射到容器的 18080 端口(可以根據(jù)需要修改) - "18081:18081" # 將主機(jī)的 18081 端口映射到容器的 18081 端口(可以根據(jù)需要修改) volumes: - "./nginx/nginx.conf:/etc/nginx/nginx.conf" # 掛載自定義 Nginx 配置文件 - "./nginx/html:/usr/share/nginx/html" # 掛載靜態(tài)文件目錄到 Nginx 容器中 depends_on: - cyt # 設(shè)置依賴關(guān)系:確保 cyt 容器在 nginx 容器之前啟動(dòng) networks: - cyt-net # 連接到自定義網(wǎng)絡(luò) "cyt-net" # 定義自定義網(wǎng)絡(luò) networks: cyt-net: name: cyt # 將自定義網(wǎng)絡(luò)命名為 "cyt"
在終端中運(yùn)行以下命令,Docker Compose 會(huì)讀取 docker-compose.yml
文件并啟動(dòng)配置的服務(wù)
# 啟動(dòng)所有, -d 參數(shù)是后臺(tái)啟動(dòng) docker compose up -d
到此這篇關(guān)于Docker跨平臺(tái)和環(huán)境部署的文章就介紹到這了,更多相關(guān)Docker跨平臺(tái)部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker安裝部署Mysql8的過(guò)程(以作數(shù)據(jù)持久化)
這篇文章主要介紹了Docker安裝部署Mysql8(以作數(shù)據(jù)持久化),首先創(chuàng)建容器并進(jìn)行持久化處理,接著配置遠(yuǎn)程連接并嘗試,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09如何監(jiān)控docker容器運(yùn)行狀態(tài) shell 腳本
這篇文章主要介紹了如何監(jiān)控docker容器運(yùn)行狀態(tài) shell 腳本的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03docker通過(guò)Dockerfile構(gòu)建mysql鏡像的方法
這篇文章主要介紹了docker通過(guò)Dockerfile構(gòu)建mysql鏡像,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05docker鏡像消失的問(wèn)題及臨時(shí)解決方案
本文主要介紹了docker鏡像消失的問(wèn)題及臨時(shí)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05