DockerStudyNote

多容器通信

Docker中的容器直接不可以通信,需要通过 User-defined networks(推荐)进行容器间的通信。

创建虚拟网络:docker network create bwl-net

diff 复制代码
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456789 --network bwl-net --network-alias bwl-net mysql:8.0.33
--network:使用的网络名称 
--network-alias:网络别名
-it:两个选项的结合,常用于Docker命令中,表示创建一个交互式容器

docker run -d -p 6379:6379 --name redis redis:6.0.20
-d:后台运行容器
-p:将容器端口暴露到宿主机端口(前为宿主机端口,后为容器端口) 
--name:redis容器名称

docker run -d -p 3309:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456789 mysql:8.0.33
MySql运行之后,可以通过Navicat对容器数据库进行连接,并进行操作(mysql需要指定密码)

Springboot项目部署

运行镜像:docker run -p 8099:8099 --name springboot-bwl springboot-bwl:1.0.0

构建镜像:docker build -f Dockerfile -t springboot-bwl:2.0.0

  • -f:指定Dockerfile文件
  • -t:指定镜像名称与版本号

编写Dockerfile文件:

  • FROM:指定基础依赖镜像
  • ADD:从上下文目录中复制文件或者目录到容器里指定路径
  • EXPOSE:声明软件端口
  • ENTRYPOINT:类似于RUN指令,用于运行程序
  • ARG:构建参数

示例

dockerfile 复制代码
FROM openjdk:17-jdk
EXPOSE 8099
ARG JAR_FILE=target/springboot-bwl-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Docker是什么

沙箱机制(Sandbox Mechanism)是一种计算机安全技术,通过创建一个隔离的虚拟环境来限制程序或进程的运行权限,防止其对系统资源(如文件系统、网络、硬件等)进行未经授权的访问。沙箱技术的核心在于提供一个安全、可控的执行环境,即使恶意代码试图执行有害操作,其影响也仅限于沙箱内部,不会波及整个系统。

Docker是一个快速交付应用、运行应用的技术

​ 1. 可以将程序及其 依赖、运行环境 一起打包为一个镜像,可以迁移到任意Linux操作系统

​ 2. 运行时利用沙箱机制形成隔离容器,各个应用互不干扰

​ 3. 启动、移除都可以通过一行命令完成,方便快捷

docker通过将用户程序与所需要调用的系统函数库一起打包方式,解决不同系统环境的问题(只要系统内核是 Linux 即可运行)

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。

Docker结构

  • 服务端:接收命令或远程请求,操作镜像或容器。
  • 客户端:发送命令或者请求到 Docker 服务端。

DockerHub:一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为 DockerRegistry。

启动docker命令

sh 复制代码
systemctl start docker  # 启动docker服务

systemctl stop docker  # 停止docker服务

systemctl restart docker  # 重启docker服务

镜像操作命令

docker xxx --help/docker --help // 查看命令使用方法

docker build // 构建镜像

  • -t:指定镜像名称和标签
  • -f:指定dockerfile文件路径

docker pull // 从服务器中拉取镜像

docker push // 推送镜像到服务器

docker save // 保存镜像为一个压缩包

docker load // 加载压缩包为镜像

docker images // 查看镜像

docker rmi // 删除镜像

容器相关命令

docker run // 创建运行容器(dockerhub官网查看镜像使用方式)

  • --name:指定容器名称
  • -p:指定端口映射
  • -d:让容器后天运行
markdown 复制代码
docker run --name nginx -p 80:80 -d nginx:latest 

docker run --name redis -p 6379:6379 -d redis:latest redis-server --appendonly yes
redis-server:  Redis 的主程序,用于启动 Redis 服务。
--appendonly yes: Redis 的一个配置参数,用于启用 AOF(Append Only File)持久化模式。AOF 模式会将每个写操作追加到日志文件中,从而实现数据的持久化。

docker rm // 删除容器

  • -f:删除运行的容器

docker pause

docker unpause

docker stop // 停止容器

docker start // 启动容器

docker ps -a // 查看容器(默认查看up状态容器)

  • -a:查看所有容器

docker logs container_name // 查看容器日志

  • -f:持续输出日志

docker exec -it container_name bash // 进入容器内部,执行一个命令

  • -it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
  • bash:进入容器后执行的命令,bash是一个linux终端交互命令
  • exit:退出容器

数据卷

数据卷(Volume)是一种用于持久化和共享数据的机制。它解决了容器数据存储和管理中的几个关键问题,尤其是在容器生命周期较短、数据需要持久化或跨容器共享的场景中。

作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全(解决容器与数据耦合的问题)

操作数据卷

markdown 复制代码
docker volume create // 创建一个volume
docker volume inspect // 显示一个或多个volume的信息
docker volume ls // 列出所有的volume
docker volume prune // 删除未使用的volume
docker volume rm // 删除一个或多个指定的volume

数据卷挂载方式

markdown 复制代码
docker run --name nginx -p 80:80 -v html:/usr/share/nginx/html -d nginx:latest 
	-v: 数据卷名称:容器内目录	若是数据卷不存在,docker自动创建数据卷

手动挂载方式

diff 复制代码
docker run -d \
-p 3309:3306 \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456789 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
mysql:5.7.25
	-v: 宿主机文件:容器内文件
	-v: 宿主机目录:容器内目录

数据卷挂载与目录直接挂载

  • 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

Dockerfile自定义镜像

镜像结构 是分层结构,每一层称为一个Layer

  • BaseImage层:包含基本的系统函数库、环境变量、文件系统
  • Entrypoint:入口,是镜像中应用启动的命令
  • 其他:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置

Dokerfile文件(官方文档

总结

  • Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
  • Dockerfile的第一行必须是FROM,从一个基础镜像来构建
  • 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine

示例

dockerfile 复制代码
#指定基础镜像
FROM ubuntu:16.04

#配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

#拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

#·安装JDK
RUN cd $JAVA_DIR \
&& tar-xf./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8

#配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

#暴露端口
EXPOSE 8090

#入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
dockerfile 复制代码
#指定java项目基础镜像
FROM java:8-alpine

#拷贝java项目的包
COPY ./docker-demo.jar /tmp/app.jar

#暴露端口
EXPOSE 8090

#入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

DockerCompost快速部署

  • DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。

  • Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。

通过DockerCompost部署的微服务之间可以直接通过服务名称相互访问

yaml 复制代码
version: "3.8" # docker-compost版本

services:
	mysql: # 容器名称
		image: mysql:5.7.25 # 镜像名称
		environment:
			MYSQL_R00T_PASSW0RD: 123456789 # 数据库密码配置
		volumes:
		 - /tmp/mysql/data:/var/lib/mysql # 容器数据挂载
		 - /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf # 容器配置文件挂载
	web: # 容器名称
		build: . # 当前目录构建
		ports:
		 - 8090:8090 # 容器暴露的端口
相关推荐
fanly113 天前
Surging AI Agent 完整产品介绍
微服务·microservice
蝎子莱莱爱打怪9 天前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
SamDeepThinking10 天前
Java微服务练习方式
java·后端·微服务
米丘13 天前
微前端之 Web Components 完全指南
微服务·html
霸道流氓气质16 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
霸道流氓气质16 天前
Spring Boot 微服务性能优化完全指南
spring boot·微服务·性能优化
地瓜伯伯16 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
Devin~Y16 天前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频
递归尽头是星辰16 天前
AI 访问数据仓库:从直连到微服务化
数据仓库·人工智能·微服务·dataagent·ai数据治理
就改了17 天前
Windows 环境 SkyWalking 完整实操教程
windows·微服务·skywalking