项目开发之Docker

基础

核心概念

为什么有docker?
	跨平台的快速安装中间件;
	快速打包项目,方便客户运行;
	快速分享应用,在docker hub;
是什么?
	加速构建、分享、运行服务的应用容器引擎;
	
三个核心概念:dockerfile image/镜像 container/容器
image:镜像
	理解为一个虚拟机的快照,包含所部署项目的应用程序以及它所关联的所有库;
	通常是由dockerfile构建;
	镜像用于部署容器;
container:容器
	容器是从镜像启动的一个运行实例,将镜像的文件系统映射到一个隔离的进程空间中,提供一个运行环境给应用程序;
	就像运行的虚拟机;
	容器运行会提到端口号 xx1:xx2 表示 本地端口:容器端口;

windows系统,可以下载docker desktop

WSL

是什么:
	是windows subsystem for linux的简写,指的是windows10的一个子系统,这个子系统的作用是在windows下运行linux操作系统;一旦运行linux操作系统,适用于linux的所有应用软件就都可以在其中运行。
下载原因:
	由于是在windows下进行打包,而docker使用的是linux内核,故需要下载WSL;

常用命令

docker version
	# 获取docker的版本信息
docker exec -it 容器id /bin/bash
	# 启动image 创建容器
docker attach 容器id
	# 进入容器正在执行的终端
docker images
	# 查看所有镜像


dockerfile

基础概念

是什么?
	Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令,用于指导 Docker 构建一个自定义的镜像。

文档运行

shell脚本运行命令:
docker build -t nginx:v3 .  
# 构建镜像,dockerfile 和 nginx配置文件、静态文件都在同一个目录下
# 通过当前目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)
# 最后一个. 是上下文路径,如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

docker run -d -p 80:80 nginx
# 运行容器;

文档构建

常用命令:
FROM nginx
# FROM ,定制的镜像都是基于nginx的镜像,后续的操作都是基于 nginx。

RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
# RUN 用于执行后面跟着的命令行命令;

ADD <src> <dest> 
# 将文件、目录或远程URL复制到镜像中。

ARG <name>[=<default value>]
# 定义一个变量,通过--build-arg <varname>=<value>标志在构建时通过docker build命令传递给构建器。
# ADD <src> <dest> 思考
src可以根据不同的代码需求设置动态调整么?可以实现;
具体实现:
	ARG ENVIRONMENT = dev
	ADD ./${ENVIRONMENT}/ /app/
	

🍎案例学习:

FROM bitnami/java:1.8.372-7
# 指定了基础镜像,使用的是由 Bitnami 维护的 Java 版本为 1.8.372-7 的镜像。
MAINTAINER xxx(xxx@cnklog.com)
# 指定镜像维护者的姓名和电子邮件地址

ADD target/*-execute.jar  /app.jar
# 将本地构建路径 target/ 目录下的以 -execute.jar 结尾的 JAR 文件添加到镜像中的 /app.jar 路径下;
# 也就是dockerfile所在的路径
ADD src/main/resources_dev/config /data/appdatas/cat
# ADD <src> <dest>
# 指令将本地项目中的 src 目录复制到镜像内的 dest 目录

#持久化目录
VOLUME /logs
# 创建了一个挂载点(volume),使得容器运行时 /logs 目录可以被持久化存储或与主机或其他容器共享。

ENV TZ=PRC
# 设置了时区环境变量为 PRC(中国标准时间)
RUN ln -snf /usr/share/zoneinfo/PRC /etc/localtime 
	&& echo PRC > /etc/timezone 
    && /usr/sbin/useradd -d /tmp -u 1100 unimms
    # 创建一个从 /etc/localtime 到 /usr/share/zoneinfo/PRC 的符号链接
    # 将PRC写入 /etc/timezone 文件(存在-删除原内容,不存在-新建文档)
    # /usr/sbin/useradd--创建新用户的命令工具;创建一个名为 unimms 的用户,其用户 ID 是 1100,并且该用户的家目录被设置为系统的临时目录 /tmp。

ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /app.jar $PARAMS"]
# 设置了容器启动时执行的命令。这里是一个 shell 命令,它会启动 Java 进程并运行 /app.jar。$JAVA_OPTS 和 $PARAMS 是环境变量,可以在运行容器时通过 -e 参数覆盖它们来传递额外的 JVM 参数或应用参数。

🍎通用dockerfile文档:


实操

windows11 docker mysql

参考博客1:https://blog.csdn.net/nmajsjpy/article/details/130183104
参考博客2:https://blog.csdn.net/joeyoj/article/details/136427362

docker desktop 配置文件:

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": [
    "https://docker.linkedbus.com",
    "https://docker.xuanyuan.me",
    "https://inhj05a1.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ]
}

🍎 具体过程:

🍇 docker version
🍇 docker pull mysql:8.0
🍇 docker run --name mysql8.0 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=xxx -d mysql:8.0 --default-authentication-plugin=mysql_native_password
// --name 构建contains容器名称为mysql8.0 
// -p 设置端口号 将本机3308端口隐射到docker中的3306
// -e MYSQL_ROOT_PASSWORD=xxx 设置密码
// -d 设置运行的是哪个image
// --default-authentication-plugin=mysql_native_password 设置身份校验:MySQL执行本地身份验证插件

🍇 docker desktop运行:
	contains 找到对应image运行的容器 --》 点击name --》点击Files --》打开目录etc/my.cnf点击下载到本地要同步数据的目录;
🍇 docker stop mysql8.0
// 停止容器运行
docker rm mysql8.0
// 重新启动容器
docker run --name mysql8.0 -p 3308:3306  -v /d/soft/docker/mysql8.0/data:/var/lib/mysql -v /d/soft/docker/mysql8.0/conf/my.cnf:/etc/mysql/my.cnf  -e MYSQL_ROOT_PASSWORD=xxx -d mysql:8.0 --default-authentication-plugin=mysql_native_password
// -v /d/soft/docker/mysql8.0/data:/var/lib/mysql 隐射本地目录:容器目录
// 如果密码含有特殊字符 会导致连接失败 比如 !@#
// 测试数据库的连接情况
🍇 dbeaver软件测试
🍇 进入容器
docker exec -it mysql-container bash

docker部署 xxljob

见博客中XXL-Job文档中的《本地配置XXL-JOB》。

container间调用异常问题

描述:
可以打开xxl-job网页,但是没有办法登录;
网址是:http://127.0.0.1:9056/xxl-job-admin/toLogin
无法实现登录

分析:
数据库连接出现问题,原因是项目中配置的数据库账号密码与本地的不相同,但是镜像中的xxl-job又不能进行修改,所以需要重新搭建匹配xxl-job的mysql数据库;
下载xxl-job项目代码,按照properties配置文件定义mysql;

总结:
xxl-job和mysql分别都属于不同的contains,这样不能实现xxl-job项目调用mysql数据库,可以本地电脑运行xxl-job项目,调用docker中的数据库;

部署mysql数据库

具体步骤:

1. 通过desktop docker运行数据库的contains
2. 进入该contains
docer ps // 显示正在运行的contains
docker cp D:\...\xxx.sql mysql1:xxx.sql // 拷贝sql脚本文件到容器
docker exec -it 容器名 /bin/bash // 进入该容器
3. 操作数据库
mysql -u用户名 -p密码 // 登录数据库
show databases; // 查看现有数据库
create database xxx; // 创建xxx数据库
use xxx; // 进入xxx数据库
select database(); // 查看当前所在数据库是哪个
source xxx.sql // 执行sql脚本
set password for 'root'@'%' = 'root123!@#'; // 修改密码,'root'@'%'允许任何ip访问该服务器;

问题:

🍇 source导入sql脚本 dbeaver查看comment中文乱码?
https://blog.csdn.net/ssergsw/article/details/9114967

docker desktop unexpected wsl error

参考:
	https://blog.csdn.net/u011807844/article/details/133308920 不行
	https://blog.csdn.net/Demoo26/article/details/136286606 不行
	https://blog.csdn.net/2201_75921737/article/details/139288092  可行

操作:
	win+R 输入services.msc找Hyper开头的所有内容;
	Hyper-V Data Exchange Service = 提供一种机制,用于在虚拟机和运行在物理计算机上的操作系统之间交换数据。
	Hyper-V Guest ServiceI nterface =Hyper-V 主机提供一个接口,以便与虚拟机内运行的特定服务进行交互。
	Hyper-V Guest Shutdown Service = 提供一种机制,用于从物理计算机上的管理界面关闭此虚拟机的操作系统。
	Hyper-V Heartbeat Service = 通过定期报告检测信号来监视此虚拟机的状态。此服务有助于你识别哪些运行的虚拟机已停止响应。
	Hyper-V PowerShell DirectService = 提供了一种在不使用虚拟网络的情况下,通过 VM 会话使用PowerShell 管理虚拟机的机制。
	Hyper-V Time Synchronization Service = 将此虚拟机的系统时间与物理计算机的系统时间同步。
	Hyper-V 卷影复制请求程序 = 协调使用卷影复制服务所需的通讯,以从物理计算机上的操作系统备份此虚拟机上的应用程序和数据。
	Hyper-V 远程桌面虚拟化服务 = 提供一个平台以在虚拟机和物理计算机上运行的操作系统之间进行通信。
	Hyper-V 主机计算服务 = 为运行的 Windows 容器和虚拟机提供支持。
	
	wsl --status   // 查看wsl状态
总结:
	通过修改开启启动项,将WSLService添加到开机启动项。

dockerfile构建image

思考:
	计划通过docker desktop实现;
	参考博客:https://blog.csdn.net/qq_42725148/article/details/107339718
构建image:
	cmd进入到dockerfile所在的目录;
	执行命令:docker build -t "opn-api" . 
	// 其中"xxx" 表示镜像image的名字;
docker desktop:
	下载具体的镜像image;
构建contains:
命令:
docker run -d \
  -p 8080:8080 \
  --name my-springboot-app \
  -e JAVA_OPTS="-Xms512m -Xmx1g -XX:+UseG1GC" \
  -e PARAMS="--spring.profiles.active=prod --server.port=8080" \
  your-image-name

最后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值