Docker linux 离线部署springboot
搭建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
```
6.修改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 /home/mysql/log
Mkdir /home/mysql/data
Mkdir /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/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27
#设置root账号密码和版本号 成功会返回一串编码
56ecdc8667fa807506988884deaaa6abd824a9d0995da77bbfc4782bfcac54e9
- 连接验证
Docker ps / docker images
登录
docker exec -it mysql mysql -uroot -p123456
安装jdk
1.jdk在线下载打包离线包
docker pull openjdk:8-jdk
docker save -o openjdk8.tar openjdk:8-jdk
2.上传目标服务器并加载
docker load -i openjdk8.tar
- 验证
Docker images;
编写Dockerfile文件
1.文件路径/home/sunplus/
2.创建文件touch Dockerfile
3.编辑文件内容
FROM openjdk:8-jdk
#时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone
#容器目录
WORKDIR /app
复制java jar包从宿主机路径位置(/home/sunplus/sunplus-cloudclinic.jar)
到容器位置(xxxxx/app/sunplus-cloudclinic.jar)
COPY ./sunplus-cloudclinic.jar ./sunplus-cloudclinic.jar
RUN mkdir -p /app/logs && \ #创建容器日志目录并授权
chmod -R 777 /app/logs
#变量 下面启动用
ENV JAVA_OPTS="-Xms512m -Xmx512m -XX:-HeapDumpOnOutOfMemoryError" \
SPRING_PROFILES_ACTIVE=local
#指定服务端口
EXPOSE 8089
# 指定docker容器启动时运行jar包 (java -jar xx.jar) ./sunplus-cloudclinic.jar容器jar位置
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar ./sunplus-cloudclinic.jar
- 构建镜像
docker build -t sunplus:1.0 . #最后的. 表示当前所在目录执行不可缺少
.
:这个点表示构建上下文(context)的路径
-
这里指的是当前目录
-
Docker 会查找当前目录下的 Dockerfile 文件来构建镜像
查看是否成功
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;
以下为配置内容根据需求修改:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
image/png png;
}
listen 80;
server_name localhost;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~* \.(html|htm|gif|jpg|svg|jpeg|bmp|png|ico|txt|js|css|ttf)$ {
root /home/nginx/html/cloudclinich5;
index index.html;
try_files $uri $uri/ /index.html;
}
location / {
proxy_pass http://sunplus:8089;
}
}
}
3.加载上传的nginx离线包
docker load -i xx.tar
4.创建容器挂载启动
docker run -d \
--name nginx \
--network my-network \
-p 80:80 \
-v /home/nginx/html/cloudclinich5:/usr/share/nginx/html \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
cmhs-nginx:1.0
安装redis
- 在有网络的服务器上拉取docker离线压缩包
- 上传到目标服务器并加载
docker load -i xx.tar
- 启动容器
docker run -d \
--name redis \
--network my-network \
-p 6379:6379 \
-e REDIS_PASSWORD=123456\
cmhs-redis:1.0 \
redis-server --requirepass 123456
一些用到的命令
首先停止并删除现有容器(保留数据卷)
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 exec -i mysql mysql -uroot -p123456
databasename < /home/java/xx.sql
rm -r 逐级删除非空目录
Rm file 删除文件
mkdir -p 创建多级目录
Touch xx.file 创建文件