Docker基本教程 (实现通过Dockerfile构建镜像部署后端项目 + 不通过容器直接部署后端项目)

b站讲解:https://www.bilibili.com/video/BV1Zn4y1X7AZ/?p=13&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=714b8a2323b700f15d0b7b31226f1d5d

语雀笔记:https://www.yuque.com/leifengyang/sutong/au0lv3sv3eldsmn8

安装教程
# 移除旧版本docker
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 配置docker yum源    如果报网络错误,则先更改->阿里云的镜像源来替代默认的 CentOS 仓库
# 1. 禁用默认的 CentOS 仓库:   禁用默认的 base、updates 和 extras 仓库,以防止 yum 尝试连接到不可用的镜像源:
sudo yum-config-manager --disable base
sudo yum-config-manager --disable updates
sudo yum-config-manager --disable extras
# 2. 配置阿里云的 CentOS 镜像源:  创建新的 /etc/yum.repos.d/CentOS-Base.repo 文件并添加阿里云镜像源:
sudo tee /etc/yum.repos.d/CentOS-Base.repo << 'EOF'
[base]
name=CentOS-7 - Base - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-7 - Updates - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-7 - Extras - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-7 - Plus - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/7/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
EOF
# 3.清理并生成新的缓存 
sudo yum clean all
sudo yum makecache

# 然后执行下面的命令
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


# 安装 最新 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动& 开机启动docker; enable + start 二合一
systemctl enable docker --now

# 配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

 

常用命令
#查看运行中的容器
docker ps
#查看所有容器
docker ps -a
#搜索镜像
docker search nginx
#下载镜像
docker pull nginx
#下载指定版本镜像
docker pull nginx:1.26.0
#查看所有镜像
docker images
#删除指定id的镜像
docker rmi e784f4560448


#运行一个新容器
docker run nginx
#停止容器
docker stop keen_blackwell
#启动容器
docker start 592
#重启容器
docker restart 592
#查看容器资源占用情况
docker stats 592
#查看容器日志
docker logs 592
#删除指定容器
docker rm 592
#强制删除指定容器
docker rm -f 592
# 后台启动容器
docker run -d --name mynginx nginx
# 后台启动并暴露端口
docker run -d --name mynginx -p 80:80 nginx
# 进入容器内部
docker exec -it mynginx /bin/bash
# 退出容器
exit

# 提交容器变化打成一个新的镜像
docker commit -m "update index.html" mynginx mynginx:v1.0
# 保存镜像为指定文件
docker save -o mynginx.tar mynginx:v1.0
# 删除多个镜像
docker rmi bde7d154a67f 94543a6c1aef e784f4560448
# 加载镜像
docker load -i mynginx.tar 


# 登录 docker hub
docker login
# 重新给镜像打标签
docker tag mynginx:v1.0 leifengyang/mynginx:v1.0
# 推送镜像
docker push leifengyang/mynginx:v1.0

存储的两种方式,注意区分:

  • 目录挂载: -v /app/nghtml:/usr/share/nginx/html
  • 卷映射:-v ngconf:/etc/nginx
挂载和映射
 docker run -d -p 99:80 \
-v /app/nghtml:/usr/share/nginx/html \
-v ngconf:/etc/nginx \
--name app03 \
nginx

  

自定义网络

docker network create mynet

启动两个容器,分配到自定义网络

docker run -d -p 88:80 --name app1 --network mynet nginx
docker run -d -p 99:80 --name app2 --network mynet nginx

容器1通过自定义网络访问容器2

docker exec -it app1 bash
Redis主从同步集群
#自定义网络
docker network create mynet
#主节点
docker run -d -p 6379:6379 \        #后台运行和端口映射
-v /app/rd1:/bitnami/redis/data \   #目录挂载
-e REDIS_REPLICATION_MODE=master \  #表示Redis的复制模式,告诉他是一个主机
-e REDIS_PASSWORD=123456 \          #设置当前主机密码
--network mynet --name redis01 \    #设置自定义网络和名称
bitnami/redis                       #选择镜像

#从节点
docker run -d -p 6380:6379 \       #后台运行和端口映射
-v /app/rd2:/bitnami/redis/data \  #目录挂载
-e REDIS_REPLICATION_MODE=slave \  #表示Redis的复制模式,告诉他是一个从机
-e REDIS_MASTER_HOST=redis01 \     #通过自定义网络,通过域名,告诉从机,主机的地址
-e REDIS_MASTER_PORT_NUMBER=6379 \ #设置访问主机的端口
-e REDIS_MASTER_PASSWORD=123456 \  #设置访问主机的密码
-e REDIS_PASSWORD=123456 \         #设置当前从机密码
--network mynet --name redis02 \   #设置自定义网络和名称
bitnami/redis                      #选择镜像

通过Dockerfile构建镜像部署后端项目

1. 首先将项目打jar包  点击 Maven -> OA(项目名称) -> Lifecycle -> package       

2. 打包完成后会提示绿色的  BUILD SUCCESS     

3. 在项目的target文件夹中找到打包好的jar包(通常为 ×××-0.0.1-SNAPSHOT.jar)

注:×××-0.0.1-SNAPSHOT.jar.original   这是Maven在Spring Boot重新打包之前创建的原始jar文件。(只包含少量用户的类,不包含依赖)  .jar.original 是普通jar包,不包含依赖
.jar 是可执行jar包,包含了pom中的所有依赖,可以直接用java -jar 命令执行
如果是部署,就用.jar
如果是给别的项目用,就要给.jar.original这个包
解释地址:https://blog.csdn.net/wupan6688/article/details/103629664

4.在服务器端输入 rz  传入刚才打包好的jar包

5. 输入vim Dockerfile  编写Dockerfile文件   确保 Dockerfile 和刚才上传的jar包在同一路径下

Dockerfile 
# 指定基础镜像 SpringBoot3要求jdk17+
FROM openjdk:17
# 作者名字、可不写
LABEL author=zxd
# 拷贝jar包(将system_oa-0.0.1-SNAPSHOT.jar拷贝到容器的 /OA.jar目录下)
COPY system_oa-0.0.1-SNAPSHOT.jar /OA.jar
# 暴露后端项目的端口(需要与项目中yml文件的端口一致)
EXPOSE 8086
# 默认执行jar
ENTRYPOINT ["java","-jar","/OA.jar"]

6. 输入构建镜像命令    然后输入 docker images 查看所有镜像,可以看到刚才构建的镜像

(注:最后那个“.” 很重要,不可以漏掉,表示复制当前路径下的jar包。 前提是 Dockerfile 和刚才上传的jar包在同一路径下)         cd app/backend

docker build -f Dockerfile -t oa:v1.0 .

7. 输入命令运行容器   启动后输入 docker ps 查看容器是否正常工作

docker run -d -p 8086:8086 --name oa oa:v1.0

8. 然后就可以通过服务器的 ip地址+端口号访问到后端服务了 

9.可以通过 docker logs -f <容器ID> 查看实时日志

 

补充:不通过docker启动后端项目命令

sudo nohup java -jar system_oa-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
启动命令详解
1. sudo:以超级用户(root)权限运行命令。某些操作可能需要超级用户权限,例如绑定到特定端口或访问特定系统资源。

2. nohup:表示“no hang up”,允许命令在用户退出会话(例如关闭终端)后继续运行。`nohup` 会忽略所有的`SIGHUP`信号(挂起信号)。

3. java -jar system_oa-0.0.1-SNAPSHOT.jar:运行一个 Java 程序。`-jar` 选项表示要运行一个 JAR 文件,`system_oa-0.0.1-SNAPSHOT.jar` 是要运行的 JAR 文件名。

4. > nohup.out:将标准输出(stdout)重定向到文件 `nohup.out`。这意味着程序的输出将写入到该文件中,而不是显示在终端上。

5. 2>&1:将标准错误(stderr)重定向到标准输出(stdout)。结合前面的 `> nohup.out`,这意味着标准错误也将写入到 `nohup.out` 文件中。

6. &:将命令放入后台执行。这意味着用户可以继续在终端中执行其他命令,而不需要等待该命令执行完成。

总结:
这条命令将以后台进程的方式启动一个 Java 应用程序,即使用户关闭终端,程序也会继续运行。程序的所有输出(包括错误信息)都会被记录到 `nohup.out` 文件中。使用 `sudo` 确保命令具有必要的权限。

     查看日志命令

sudo cat nohup.out

     如果是重新启动需要杀掉之前的端口进程  下图为查看指定端口的PID

sudo lsof -i :8086

  
   然后根据PID杀掉进程(-9 表示强制终止进程)

sudo kill -9 2859409

 

posted @   xd99  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示