使用Docker遷移服務(wù)到離線服務(wù)器的過(guò)程
前言
最近遇到的這個(gè)場(chǎng)景,需要把之前開發(fā)的一套系統(tǒng)遷移到一個(gè)離線的服務(wù)器上,這個(gè)服務(wù)器有點(diǎn)麻煩,接入VPN后通過(guò)堡壘機(jī)才能訪問,速度也很慢,遇到不少坑,本文記錄一下遷移過(guò)程。
基本信息
原本這套系統(tǒng)也挺簡(jiǎn)單的,Django 寫的后端接口,搭配 Vue+Echarts
大屏,數(shù)據(jù)庫(kù)用 Mysql 和 Redis 作為緩存,這些在原服務(wù)器上都是用 docker 部署的。
這臺(tái)離線的服務(wù)器是 Centos7.9 系統(tǒng)的,雖然不能訪問外網(wǎng),但還好有個(gè)本地的 yum 倉(cāng)庫(kù),可惜 yum 官方源少得可憐,只能安裝很有限的幾個(gè)軟件。
現(xiàn)在除了前端不需要遷移之外,其他的服務(wù)都需要遷移到這個(gè)離線的服務(wù)器上。
遷移步驟:
- 在離線服務(wù)器上安裝 docker
- 在原服務(wù)器上導(dǎo)出容器鏡像
- 在離線服務(wù)器上傳并導(dǎo)入鏡像
- 在離線服務(wù)器上傳各種docker配置并啟動(dòng)容器
- 配置周邊組件,如 nginx
離線安裝docker
前面說(shuō)到這個(gè)服務(wù)器是有 yum 本地鏡像的,但里面并沒有 docker,所以需要自行下載 docker 的 RPM 安裝包。
在這個(gè)地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
需要下載以下安裝包(版本號(hào)本文撰寫時(shí)的最新版,請(qǐng)讀者自行下載當(dāng)下的最新版本)
- containerd.io-1.6.21-3.1.el7.x86_64
- docker-buildx-plugin-0.10.5-1.el7.x86_64
- docker-ce-24.0.2-1.el7.x86_64
- docker-ce-cli-24.0.2-1.el7.x86_64
- docker-ce-rootless-extras-24.0.2-1.el7.x86_64
- docker-compose-plugin-2.18.1-1.el7.x86_64
然后把這些安裝包都上傳到服務(wù)器
執(zhí)行命令安裝
sudo yum install containerd.io-1.6.21-3.1.el7.x86_64.rpm docker-ce-24.0.2-1.el7.x86_64.rpm # 以及其他...
就是把全部文件都放在同一個(gè) install 命令后面,因?yàn)檫@些包是有相互依賴要求的,如果一個(gè)個(gè)裝的話可能會(huì)因?yàn)轫樞騿栴}報(bào)錯(cuò)。
安裝之后啟動(dòng)一下 docker
sudo systemctl enable docker sudo systemctl start docker
添加用戶組啥的也屬于安裝 docker 后的常規(guī)操作了
sudo groupadd docker sudo usermod -aG docker $USER newgrp docker
之后就可以不使用 root 用戶來(lái)執(zhí)行 docker 命令了
導(dǎo)出鏡像
導(dǎo)出鏡像有兩種方式
- docker export - 對(duì)應(yīng) docker import 導(dǎo)入鏡像
- docker save - 對(duì)應(yīng) docker load 導(dǎo)入鏡像
PS:這倆的導(dǎo)出導(dǎo)入命令的匹配的,不能混用
前者主要用于制作基礎(chǔ)鏡像,導(dǎo)出后是沒有歷史記錄和元數(shù)據(jù)的,也沒有 entrypoint 所以無(wú)法直接運(yùn)行,這次遷移服務(wù)使用 save 方式。
操作命令
docker save <container_id> -o image.tar
也可以重定向
docker save <container_id> > image.tar
補(bǔ)充一下這倆方式的具體區(qū)別
- 文件大小不同,export 導(dǎo)出的鏡像文件體積小于 save 保存的鏡像,因?yàn)?save 會(huì)把所有 layer 都導(dǎo)出
- save 可以把多個(gè)鏡像打包到一個(gè)文件,export 不可以
- export 導(dǎo)出(import 導(dǎo)入)是根據(jù)容器拿到的鏡像,再導(dǎo)入時(shí)會(huì)丟失鏡像所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)),所以無(wú)法進(jìn)行回滾操作
- save 保存(load 加載)的鏡像,沒有丟失鏡像的歷史,可以回滾到之前的層(layer)
應(yīng)用場(chǎng)景區(qū)別
- docker export 的應(yīng)用場(chǎng)景:主要用來(lái)制作基礎(chǔ)鏡像,比如我們從一個(gè) ubuntu 鏡像啟動(dòng)一個(gè)容器,然后安裝一些軟件和進(jìn)行一些設(shè)置后,使用 docker export 保存為一個(gè)基礎(chǔ)鏡像。然后,把這個(gè)鏡像分發(fā)給其他人使用,比如作為基礎(chǔ)的開發(fā)環(huán)境。
- docker save 的應(yīng)用場(chǎng)景:如果我們的應(yīng)用是使用 docker-compose.yml 編排的多個(gè)鏡像組合,但我們要部署的客戶服務(wù)器并不能連外網(wǎng)。這時(shí)就可以使用 docker save 將用到的鏡像打個(gè)包,然后拷貝到客戶服務(wù)器上使用 docker load 載入。
打包數(shù)據(jù)
在舊的服務(wù)器上,使用了 docker 來(lái)部署 MySQL 服務(wù),并且將 data 映射出來(lái),需要把 data 也一并遷移到新的服務(wù)器上。
MySQL docker 的 volumes 配置
volumes: - ./data:/var/lib/mysql
因?yàn)閂PN帶寬很低,這次使用 tar + bzip2 來(lái)打包壓縮
tar -cjvf ./data data.tar.bz2
命令參數(shù)說(shuō)明:
-c
: 建立一個(gè)壓縮檔案的參數(shù)指令 (create)-j
: 使用 bzip2 壓縮-v
: 壓縮的過(guò)程中顯示詳情 (verbose)-f
: 指定文件名,這個(gè)參數(shù)后面就不能再帶其他參數(shù)了
然后將這個(gè) data.tar.bz2
上傳到新的服務(wù)器。
解壓命令我也貼一下
tar -xjvf data.tar.bz2
這個(gè)命令會(huì)在當(dāng)前目錄生成 data 目錄。
命令參數(shù)說(shuō)明:
-x
: 表示解壓 (extract)- 其他的參數(shù)上面有了
導(dǎo)入鏡像
把前面導(dǎo)出的 docker 鏡像上傳后,執(zhí)行導(dǎo)入命令
docker load < image.tar
之后執(zhí)行 docker images
看看是否導(dǎo)入成功
啟動(dòng)容器
把原本的幾個(gè) docker-compose 配置上傳
之前為了方便更新,Django項(xiàng)目是上傳代碼之后在服務(wù)器直接 build,像這樣
version: "3.6" services: web: restart: always build: . environment: - ENVIRONMENT=docker - URL_PREFIX=demo/api - DEBUG=false - DEFAULT_DATABASE=mysql command: uwsgi uwsgi.ini volumes: - .:/code
但在離線服務(wù)器上,沒有網(wǎng)絡(luò)肯定是沒法 build 了
所以要把 build .
改成 image: 鏡像名稱
搞定后順利啟動(dòng)~
配置周邊組件
只提供接口的話,也沒啥啦,再安裝個(gè) nginx 就好
然而眾所周知 yum 的默認(rèn)源連 nginx 都沒有,要安裝 nginx 的話還得添加 epel-release 源
sudo yum install epel-release
萬(wàn)幸,離線服務(wù)器的本地源有這個(gè)東西
sudo yum update sudo yum install nginx
搞定~
然后還是老套路,用 systemctl
啟動(dòng) nginx,不重復(fù)了。
這個(gè)服務(wù)器很折騰的,既然搞定了,得測(cè)試一下,但是接口都不開放,ssh鏈接也是通過(guò)多層跳轉(zhuǎn)的,好像沒法開啟 ssh-tunnel 轉(zhuǎn)發(fā)在本地測(cè)試。
所以只能用 curl 之類的工具來(lái)測(cè)試一下。
不過(guò)我這次另辟蹊徑,用命令行瀏覽器來(lái)試試能不能打開項(xiàng)目的網(wǎng)頁(yè)。
分別試了這倆:
- w3m
- lynx
成功打開了網(wǎng)頁(yè),這倆瀏覽器的效果都差不多。
參考資料
- https://www.hangge.com/blog/cache/detail_2411.html
- https://www.cnblogs.com/52linux/archive/2012/03/04/2379738.html
- https://docs.docker.com/engine/install/centos/#install-from-a-package
到此這篇關(guān)于使用Docker遷移服務(wù)到離線服務(wù)器的文章就介紹到這了,更多相關(guān)Docker遷移服務(wù)到離線服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在IntelliJ IDEA中使用Docker的開發(fā)指南
這篇文章主要給大家介紹了在IntelliJ IDEA中使用Docker開發(fā)指南,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)我們的使用Docker有一定的幫助,需要的朋友可以參考下2023-09-09云原生之使用Docker部署homer靜態(tài)主頁(yè)的方法步驟
本文主要介紹了云原生之使用Docker部署homer靜態(tài)主頁(yè)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08使用Docker-compose離線部署Django應(yīng)用的方法
這篇文章主要介紹了使用Docker-compose離線部署Django應(yīng)用的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03docker安裝nacos2.2.4圖文詳解(含:nacos容器啟動(dòng)參數(shù)、環(huán)境變量、常見問題整理)
文章詳細(xì)介紹了如何在Docker中下載、安裝和配置Nacos?2.2.4,包括在線和離線安裝步驟、使用不同網(wǎng)絡(luò)模式(如Host模式)以及一些常見問題的解決方法,感興趣的朋友跟隨小編一起看看吧2025-02-02docker容器狀態(tài)出現(xiàn)Exit(1)的問題及解決
這篇文章主要介紹了docker容器狀態(tài)出現(xiàn)Exit(1)的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Docker啟動(dòng)PostgreSQL時(shí)創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)的解決方案
這篇文章主要介紹了Docker啟動(dòng)PostgreSQL時(shí)創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)的解決方案,重點(diǎn)給大家介紹如何把shell/sql腳本放入/docker-entrypoint-initdb.d/目錄中,讓容器啟動(dòng)的時(shí)候自動(dòng)執(zhí)行創(chuàng)建2021-06-06