Docker linux 离线部署springcloud
搭建dcoker环境
1. 首先在有网络的机器上下载Docker的离线安装包:
- 访问 https://download.docker.com/linux/static/stable/x86_64/
- 下载对应版本的 docker-<version>.tgz 文件
2. 将下载的安装包传输到目标Linux机器上(可以使用U盘或其他存储设备)
3. 在目标机器上执行以下命令:
```bash
# 解压安装包
tar xzvf docker-<version>.tgz
# 将docker二进制文件复制到系统目录
sudo cp docker/* /usr/bin/
# 创建docker服务
sudo groupadd docker
sudo useradd -g docker docker
# 创建docker配置文件
sudo mkdir -p /etc/docker
sudo touch /etc/docker/daemon.json (没外网 删除 不然可能会启动不了)
# 创建systemd服务文件
sudo mkdir -p /etc/systemd/system
sudo touch /etc/systemd/system/docker.service
4. 编辑docker.service文件,添加以下内容:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
[Install]
WantedBy=multi-user.target
5. 启动Docker服务:
```bash
# 重新加载systemd配置
sudo systemctl daemon-reload
# 确保docker.socket服务存在
sudo touch /etc/systemd/system/docker.socket
# 编辑docker.socket文件,添加以下内容:
[Unit]
Description=Docker Socket for the API
PartOf=docker.service
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
# 启用并启动服务
sudo systemctl enable docker.socket
sudo systemctl enable docker.service
sudo systemctl start docker.socket
sudo systemctl start docker.service
(这里报错执行6启动成功执行7)或者直接删掉daemon.json 文件重新start
```
- 修改daemon.json
# 创建目录
mkdir -p /etc/docker
# 复制内容 (不通外网没啥用)
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
7. 验证安装:
```bash
docker --version
docker info
```
- 使用 `systemctl status docker.service` 查看详细错误信息
安装mysql
1.在有网络的服务器上拉取镜像包
docker pull mysql:8.0.31
2.打包为tar上传到目标服务器
docker save -o /home/mysql-8.0.27.tar mysql:8.0.27
3.传输装载
docker load -i /home/mysql/mysql-8.0.27.tar
- 挂载启动
docker network create my-network (创建个docker网络)
创建挂载目录
mkdir -p /home/mysql/log
mkdir -p /home/mysql/data
mkdir -p /home/mysql/conf
docker run \
--name mysql -p 3306:3306 \
--network my-network \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD='xxxx' \
-d mysql:8.0.27
#设置root账号密码和版本号 成功会返回一串编码
密码xxxx
56ecdc8667fa807506988884deaaa6abd824a9d0995da77bbfc4782bfcac54e9
- 连接验证
Docker ps / docker images
登录
docker exec -it mysql mysql -uroot -xxxx
安装jdk
1.jdk在线下载打包离线包
docker pull openjdk:8-jdk
docker save -o openjdk8.tar openjdk:8-jdk
2.上传目标服务器并加载
docker load -i openjdk8.tar
- 验证
Docker images;
安装docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
输出类似 Docker Compose version v2.x.x 即成功。
Nacos 启动
docker logs <nacos容器名或ID>
docker pull nacos/nacos-server:v2.2.3
docker save -o /home/nacos/nacos.tar nacos/nacos-server:2.2.0
docker load -i xx
mkdir -p /opt/nacos/logs /opt/nacos/data
docker run -d \
--name nacos \
--network my-network \
-p 8848:8848 \
-v /opt/nacos/logs:/home/nacos/logs \
-v /opt/nacos/data:/home/nacos/data \
-e MODE=standalone \
nacos/nacos-server:latest
使用 Docker Compose 启动 Nacos (推荐) 用这个
创建 docker-compose.yml 文件:
version: '3'
services:
nacos:
image: nacos/nacos-server:latest
container_name: cmhs-nacos
environment:
MODE: standalone # 注意这里改为 key: value 格式
ports:
- "8848:8848"
- "9848:9848"
volumes:
- ./logs/:/home/nacos/logs
- ./nacos/data:/home/nacos/data
networks:
- my-network
restart: always
networks:
my-network:
driver: bridge
name: my-network
external: true
然后运行:
docker-compose up -d
常用命令
移除镜像docker rm -f cmhs-nacos
停止并清理由 docker-compose up 或 docker-compose start 启动的所有容器、网络、卷和其他资源
docker-compose down
启动后登录后台添加nacos 配置yml文件
docker-compose up --build -d
启动gateway模块
/home/lz/cmhs-gateway/ 目录下文件
docker-compose.yml
dockerfile
nacos.env
Dockerfile内容:
# 基础镜像
FROM openjdk:8-jdk
# author
MAINTAINER cmhs
# 挂载目录
VOLUME /home/cmhs
# 创建目录
RUN mkdir -p /home/cmhs
# 指定路径
WORKDIR /home/cmhs
# 复制jar文件到路径
COPY ./jar/cmhs-gateway.jar /home/cmhs/cmhs-gateway.jar
# 启动网关服务
ENTRYPOINT ["java","-Xms64m","-Xmx1024m","-jar","cmhs-gateway.jar"]
docker-compose.yml内容:
version : '3.8'
services:
cmhs-gateway:
image: cmhs-gateway:latest
container_name: cmhs-gateway
restart: always
mem_limit: 1024m
build:
context: ./
dockerfile: dockerfile
env_file:
- nacos.env
volumes:
- /etc/localtime:/etc/localtime:ro
- ./logs:/opt/logs/cmhs-gateway
networks:
- my-network
networks:
my-network:
name: my-network
external: true
nacos.env文件内容:
TZ=Asia/Shanghai
spring.cloud.nacos.discovery.server-addr=cmhs-nacos:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.config.server-addr=cmhs-nacos:8848
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.profiles.active=dev
logging.level.root=debug
docker build -t cmhs-gateway .
docker-compose up -d
其他模块大同小异
docker-compose down # 停止并删除旧容器
docker-compose up -d # 重新创建
docker-compose up --build -d
Yfc-admin&&yfc-harbor模块
docker-compose.yml
nacos.env
yfc-admin(文件夹)
yfc-harbor(文件夹)
docker-compose.yml:
version : '3.8'
services:
cmhs-yfc-admin:
image: cmhs-yfc-admin:latest
container_name: cmhs-yfc-admin
restart: always
mem_limit: 2048m
build:
context: yfc-admin
dockerfile: dockerfile
env_file:
- nacos.env
volumes:
- /etc/localtime:/etc/localtime:ro
- ./yfc-admin/logs:/opt/logs/cmhs-yfc-admin
networks:
- my-network
cmhs-yfc-harbor:
image: cmhs-yfc-harbor:latest
container_name: cmhs-yfc-harbor
restart: always
mem_limit: 2048m
build:
context: yfc-harbor
dockerfile: dockerfile
env_file:
- nacos.env
volumes:
- /etc/localtime:/etc/localtime:ro
- ./yfc-harbor/logs:/opt/logs/cmhs-yfc-harbor
networks:
- my-network
networks:
my-network:
external: true
docker build -t cmhs-yfc-admin .
docker build -t cmhs-yfc-harbor .
docker-compose up -d (同时构建两个jar)
编写dockerfile文件
1.文件路径/home/lz/cmhs-
2.创建文件touch Dockerfile
3.编辑文件内容
# 基础镜像
FROM openjdk:8-jdk
# author
MAINTAINER cmhs
# 挂载目录
VOLUME /home/cmhs
# 创建目录
RUN mkdir -p /home/cmhs
# 指定路径
WORKDIR /home/cmhs
# 复制jar文件到路径
COPY ./jar/cmhs-gateway.jar /home/cmhs/cmhs-gateway.jar
# 启动网关服务
ENTRYPOINT ["java","-Xms64m","-Xmx1024m","-jar","cmhs-gateway.jar"]
- 构建镜像
docker build -t sunplus:1.0 . #最后的. 表示当前所在目录执行不可缺少
查看是否成功
Docker images;
- 启动java jar包
docker run -d \
-v /home/sunplus:/app \ #挂载宿主机位置 实际启动的是/home/sunplus/下的jar包
-v /home/sunplus/logs:/app/logs \ #挂载宿主机日志位置
--name sunplus \
--network my-network \ #设置与mysql同一网络
-p 8089:8089 \ #端口
sunplus:1.0 #容器名称版本号
说明:
--network my-network \ #设置与docker容器里的mysql同一网络
application-pr.yml 数据库连接用myql docker容器名称代替ip
url: jdbc:mysql://mysql:3306/database?
logback配置路径配置为容器路径
<property name="log.path" value="/app/logs" />
- 查看启动日志
docker logs -f <容器名称># 实时跟踪日志(类似 tail -f)
并查看宿主机目录文件是否挂载成功 /home/sunplus/logs
安装nginx
- 创建文件目录
mkdir -p /home/nginx/html/
mkdir -p /home/nginx/conf/
2.创建编辑配置文件
touch nginx.conf
vim nginx.conf;
以下为配置内容根据需求修改:
user nginx;
worker_processes 8;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 600;
gzip on;
gzip_min_length 1024;
client_body_buffer_size 400m;
client_max_body_size 800m;
underscores_in_headers on;
upstream gatewaysever {
least_conn;
server cmhs-gateway:8080 weight=1 max_fails=3 fail_timeout=30;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
#websocket
upstream websocketserver {
server cmhs-gateway:8080;
}
include /etc/nginx/conf.d/*.conf;
}
/conf.d/default.conf
server {
listen 8001;
listen [::]:8001;
server_name localhost;
# apk安装包
location /apk/ {
root /usr/share/nginx/html/apk;
autoindex on;
}
# 药房 pc端 前端资源
location / {
root /usr/share/nginx/html/yfc-pc/dist;
index index.html index.htm;
# 处理静态资源缓存
try_files $uri $uri/ /index.html;
}
# 匹配静态资源(图片/CSS/JS等)
location ~* \.(gif|jpg|jpeg|png|svg|css|js|flv|ico|swf)$ {
root /usr/share/nginx/html/yfc-pc/dist;
expires max;
access_log off;
}
# 匹配 HTML 文件
location ~* \.(htm|html)$ {
root /usr/share/nginx/html/yfc-pc/dist;
expires -1;
add_header Cache-Control "no-store";
add_header Pragma "no-cache";
}
# 药房 pda端 前端资源
location /pharmacy/pda/ {
alias /usr/share/nginx/html/yfc-pda/dist/;
if ($request_uri ~ \.(gif|jpg|jpeg|png|svg|css|js|flv|ico|swf)(.*)) {
expires max;
}
if ($request_filename ~* .*\.(?:htm|html)$) {
expires -1;
add_header Cache-Control 'no-store';
}
try_files $uri $uri/ /index.html /usr/share/nginx/html/yfc-pda/dist/index.html;
index index.html index.htm;
}
# 后端服务统一网关
location /manager/ {
proxy_pass http://gatewaysever/;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
3.加载上传的nginx离线包
docker load -i xx.tar
- 创建容器挂载启动
docker run -d \
--name cmhs-nginx \
--network my-network \
-p 9110:8001 \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/html/yfc-pc/dist:/usr/share/nginx/html/yfc-pc/dist \
-v /home/nginx/html/yfc-pda/dist:/usr/share/nginx/html/yfc-pda/dist \
-v /home/nginx/html:/usr/share/nginx/html \
cmhs-nginx:1.0
安装redis
- 在有网络的服务器上拉取docker离线压缩包
- 上传到目标服务器并加载
docker load -i xx.tar
- 启动容器
docker run -d \
--name cmhs-redis \
--network my-network \
-p 6379:6379 \
cmhs-redis:1.0
密码自己设置
一些用到的命令
首先停止并删除现有容器(保留数据卷)
docker stop sunplus
docker rm sunplus
删除镜像 docker rmi <IMAGE_ID>
docker build -t sunplus:1.0 .
docker images
Docker ps
Docker logs -f 容器名
chmod 755 xx 授权
docker restart sunplus 重启容器
查看容器ip
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名
验证容器是否在指定网络中
docker inspect 容器名 | grep NetworkMode
容器被删除(docker rm nacos)
需要重新执行完整的 docker run 命令
元数据(包括挂载卷配置)会被清除,必须重新运行 docker run 并指定 -v
需要修改挂载路径或其他参数
例如,想将 /opt/nacos/data 改为 /data/nacos,必须重新 docker run
sudo netstat -tulnp 查看端口
docker rmi -f abc123def456 # 强制删除(慎用)
cp file.txt /path/to/directory/newfilename.txt
mv oldname.txt newname.txt
导入数据库
docker exec -i mysql mysql -uroot -p123456
databasename < /home/java/xx.sql
rm -r 逐级删除非空目录(谨慎使用)
rm -rf
rm file 删除文件
mkdir -p 创建多级目录
touch xx.file 创建文件
systemctl status docker.service
sudo dockerd --debug
查看后100行日志
sudo journalctl -u docker --no-pager -n 50
sudo journalctl -u docker --no-pager -n 100
安装containerd
1. 确认是否已安装 containerd
bash
containerd --version
如果返回版本号(如 containerd 1.6.28),说明已安装但服务未配置。
如果提示 command not found,说明完全未安装。
2. 安装 containerd
Ubuntu/Debian
bash
sudo apt updatesudo apt install -y containerd.io
CentOS/RHEL
bash
sudo yum install -y containerd.io
3. 生成并启用 systemd 服务
(1)创建服务单元文件
bash
sudo mkdir -p /usr/local/lib/systemd/systemsudo nano /usr/local/lib/systemd/system/containerd.service
粘贴以下内容:
[Unit]
Description=containerd container runtimeDocumentation=https://containerd.ioAfter=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlayExecStart=/usr/bin/containerdRestart=alwaysRestartSec=5Delegate=yesKillMode=processOOMScoreAdjust=-999LimitNOFILE=1048576LimitNPROC=infinityLimitCORE=infinity
[Install]
WantedBy=multi-user.target
(2)启用并启动服务
bash
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
sudo systemctl status containerd
4. 配置 containerd
生成默认配置文件:
bash
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
修改配置(如需调整):
bash
sudo nano /etc/containerd/config.toml
确保关键配置:
toml
[grpc]
address = "/run/containerd/containerd.sock"
重启服务:
bash
sudo systemctl restart containerd
5. 验证安装
bash
sudo ctr images pull docker.io/library/hello-world:latestsudo ctr run docker.io/library/hello-world:latest test
如果成功运行,说明 containerd 已正常工作。
6. 关联 Docker(如果使用 Docker)
确保 Docker 配置指向正确的 containerd.sock:
bash
sudo nano /etc/docker/daemon.json
添加:
json
{
"runtimes": {
"containerd": {
"path": "/run/containerd/containerd.sock"
}
}}
重启 Docker:
bash
sudo systemctl restart docker
修复containerd
1. 确认 containerd 的安装位置
首先检查 containerd 的实际安装路径:
bash
which containerd
或
bash
sudo find / -name "containerd" -type f 2>/dev/null
常见正确路径:
/usr/bin/containerd(标准安装)
/usr/local/bin/containerd(手动编译安装)
2. 修复方案
情况 1:containerd 未安装
如果 which containerd 无输出,说明未安装:
bash
# Ubuntu/Debiansudo apt updatesudo apt install -y containerd.io
# CentOS/RHELsudo yum install -y containerd.io
# 验证安装
containerd --version
情况 2:containerd 安装在非默认路径
如果 containerd 存在但路径不是 /usr/local/bin/containerd(例如 /usr/bin/containerd):
bash
# 创建符号链接(推荐)sudo ln -s $(which containerd) /usr/local/bin/containerd
# 或直接修改服务文件sudo nano /usr/lib/systemd/system/containerd.service
将 ExecStart=/usr/local/bin/containerd 改为实际路径:
ini
ExecStart=/usr/bin/containerd
然后重新加载 systemd:
bash
sudo systemctl daemon-reload
sudo systemctl restart containerd
情况 3:手动安装但文件丢失
如果之前手动安装过 containerd 但文件被删除:
bash
# 重新下载二进制文件(以 v1.6.28 为例)wget https://github.com/containerd/containerd/releases/download/v1.6.28/containerd-1.6.28-linux-amd64.tar.gzsudo tar Cxzvf /usr/local containerd-1.6.28-linux-amd64.tar.gz
# 验证文件是否存在ls -l /usr/local/bin/containerd
3. 重建 systemd 服务文件
如果服务文件损坏,重新生成:
bash
sudo mkdir -p /usr/local/lib/systemd/systemsudo nano /usr/local/lib/systemd/system/containerd.service
粘贴以下内容:
ini
[Unit]Description=containerd container runtimeDocumentation=https://containerd.ioAfter=network.target local-fs.target
[Service]ExecStartPre=-/sbin/modprobe overlayExecStart=/usr/bin/containerdRestart=alwaysRestartSec=5Delegate=yesKillMode=processOOMScoreAdjust=-999LimitNOFILE=1048576LimitNPROC=infinityLimitCORE=infinity
[Install]WantedBy=multi-user.target
然后启用服务:
bash
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
4. 验证修复
bash
sudo systemctl status containerd
sudo ctr version # 测试 containerd 功能
正常输出应显示:
containerd github.com/containerd/containerd v1.6.28 ...
方法2:手动挂载 cgroups
临时解决方案(重启后失效):
sudo mkdir /sys/fs/cgroup/devices
sudo mount -t cgroup -o devices none /sys/fs/cgroup/devices
确保用户有权限访问 Docker
Docker 默认需要 root 或 docker 用户组权限:
# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 更新组权限(需重新登录或运行)
newgrp docker
# 检查是否生效groups
⚠️ 重要:重新登录终端或重启生效
5. 常见问题及解决
(1) Containerd 未运行
Docker 依赖 containerd:
sudo systemctl status containerd
sudo systemctl start containerd
禁用用户态代理(推荐)
编辑 Docker 配置文件 /etc/docker/daemon.json:
sudo nano /etc/docker/daemon.json
添加以下内容(如果文件不存在则新建):
json
{
"userland-proxy": false}
保存后重启 Docker:
sudo systemctl restart docker