什么是docker?

Docker是一种轻量级的虚拟化技术,同时是一个开源的应用容器运行环境搭建平台,可以让开发者以便捷方式打包应用到一个可移植的容器中,然后安装至任何运行Linux或Windows等系统的服务器上。 相较于传统虚拟机,Docker容器提供轻量化的虚拟化方式、安装便捷、启停速度快。

docker的安装

下载DockerDeskTop

DockerDeskTop下载地址: https://www.docker.com/products/docker-desktop/

配置Docker环境

1.启动Hyper服务

如果计算机windows功能中没有Hyper服务

新建一个文本文件,将下列命令加入

1
2
3
4
5
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

修改文件名为Hyper.cmd

以管理员身份运行该程序,运行完毕后,在windows服务中启动该服务即可

2.检查是否配置成功

3.配置一些国内镜像站点加速

在这个配置中,列出了一些常用的国内镜像站点,比如阿里云、网易云、七牛云、中科大和Docker中国官方镜像。这些镜像站点的作用是提供一个与Docker官方镜像仓库相连的代理服务,可以加速Docker镜像的下载和上传过程。

在docker设置选项的Docker Engine栏的配置项中修改成下列json格式的配置项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://bytkgxyr.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com/",
"https://reg-mirror.qiniu.com/",
"https://docker.mirrors.ustc.edu.cn/",
"https://registry.docker-cn.com"
]
}

4.验证docker环境及其桌面版是否能使用

powershell 管理员 输入docker version检查版本

cmd命令窗口输入docker run hello-world验证Docker桌面版

至此docker环境搭建完毕

docker基本命令的使用

命令 作用
docker search ... 在 Docker registry 中搜索镜像
docker pull image 从 Docker registry 下载指定镜像
docker push image 将本地的镜像推送到 Docker registry
docker images 查看当前拥有的所有镜像
docker rmi image 删除指定的镜像
docker run image 根据当前镜像创建并启动一个容器
docker ps 列出当前正在运行的容器
docker stop container 停止当前指定的容器运行
docker rm container 删除指定的容器名
docker inspect coontainer 获取一个或多个容器的底层信息
docker exec container command 在指定的容器内部执行指定命令
docker logs container 获取指定容器的日志

更多命令请参考docker官方API文档: https://docs.docker.com/reference/

MySql容器的部署

搜索MySql镜像:

docker search mysql

拉取MySql的镜像:

docker pull mysql

利用镜像创建容器:

docker run -p 3308:3306 –name mysql_1 -e MYSQL_ROOT_PASSWORD=a -d mysql –character-set-server=utf8mb4 –collation-server=utf8mb4_unicode_ci

  • docker run: Docker命令,用于创建和运行容器。
  • -p 3308:3306: 指定容器的端口映射,将容器的端口3306映射到主机的端口3308。格式为主机端口:容器端口
  • --name mysql_1: 为容器指定名称为mysql_1,方便后续管理。
  • -e MYSQL_ROOT_PASSWORD=a: 设置MySQL容器的root用户的密码为a。
  • -d: 让容器在后台运行。
  • mysql: 指定要使用的Docker镜像,这里使用的是MySQL镜像。
  • --character-set-server=utf8mb4: 设置MySQL服务器的字符集为utf8mb4。
  • --collation-server=utf8mb4_unicode_ci: 设置MySQL服务器的字符排序规则为utf8mb4_unicode_ci。
  • -e MYSQL_ROOT_PASSWORD=a: 连接到该数据库需要密码认证

进入到容器的bash命令行环境:

docker exec -it msql_1 /bin/bash

登录mysql

mysql -uroot -pa

创建数据库

create database data_1 default character set=’utf8’

docker容器间的相互访问

docker的网络桥接模式

Docker 的网络桥接模式是一种允许容器通过一个网桥与宿主机或其他容器进行通信的网络模式。在桥接模式下,Docker 会为每个容器创建一个虚拟网络接口,并为其分配一个 IP 地址。这样,每个容器都可以通过桥连接与同一主机上的其他容器或宿主机进行通信。

优点

桥接模式的优点之一是容器间的通信非常简单。容器可以使用它们的 IP 地址直接相互通信,就像它们在同一物理网络中一样。此外,桥接模式还允许容器与宿主机进行通信,以及容器与外部网络进行通信

原理图

常用命令

命令 作用
docker network create -d bridge 创建bridge网络
docker network ls 查看所有网络
docker network inspect bridge 查看某个网络详情
docker network remove bridge 删除某个网络
docker network connect bridge container 将一个容器连接到网桥
docker network disconnect bridge container 将容器从网桥中移除

实例: 两个容器通过 Bridge网络 实现互联

1.建立两个MySql容器并启动

1
2
3
docker run  -p 3309:3306 --name mysql_1 -e MYSQL_ROOT_PASSWORD=a -d  mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

docker run -p 3310:3306 --name mysql_2 -e MYSQL_ROOT_PASSWORD=a -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

2.用 docker ps -a 命令查看两个容器是否启动

3.创建一个bridge, 将两个容器都连接上它,查看网络详情是否两个容器连接上了了同一个bridge网络

1
2
3
4
5
6
7
8
新建一个名为bridge_1的bridge网络
docker network create -d bridge bridge_1

将mysql_1容器加入bridge_1网络
docker network connect bridge_1 mysql_1

将mysql_1容器加入bridge_1网络
docker network connect bridge_1 mysql_2

查看网络详情

4.实现两个容器相互访问

为了可以更加直观看到两台容器互联的效果,我们在mysql_1容器中创建一个名为data_1的数据库(建立数据库代码可以参考 MySql容器的部署 ),然后登录mysql_2容器通过远程连接mysql_1容器

1.以-it交互式终端进入其中一台容器mysql_2

1
docker exec -it mysql_2 /bin/bash

2.用mysql_2容器连接到数据库mysql_1

1
2
//172.19.0.2为mysql_1所分配的地址
myql -h 172.19.0.2 -uroot -pa

3.用 show databases; 命令查看详情

如图上图mysql_2容器通过bridge网络完成了对mysql_1连接,并且成功访问到 mysql_1中含有data_1数据库,说明两个容器实现了相互访问

FastDFS

FastDFS是什么?

FastDFS是一个开源的分布式文件系统,用于实现大规模文件存储和访问。它由两部分组成:Tracker Server 和 Storage Server。

Tracker Server 跟踪和管理 Storage Server 的状态,负责客户端请求的负载均衡和文件定位。

Storage Server 负责实际的文件存储和访问,它们之间可以水平扩展,可以根据需要添加更多的 Storage Server 实例来增加存储容量和吞吐量。

FastDFS 提供了高可靠性、高扩展性和高性能的文件存储解决方案。它适用于需要存储大量文件的应用场景,如图片上传、视频处理等。同时,FastDFS 还提供了灵活的接口和工具,使开发者能够方便地集成和使用。

FastDFS的安装与部署

fastDFS镜像

1
2
3
4
5
6
7
//查找FastDFS镜像

docker search tracker

//拉取镜像

docker pull delron/fastdfs

新建本地tracker和storage目录

E:\dockercontainers\fastdfs\tracker

E:\dockercontainers\fastdfs\storage

tracker安装

1
docker run -d  --name tracker   --network=ycnetwork     E:\dockercontainers\fastdfs\tracker:/var/fdfs delron/fastdfs tracker

storage安装

1
docker run -d  -p 8888:8888 --name storage --network=ycnetwork  -e TRACKER_SERVER=172.18.0.4:22122 -v E:\dockercontainers\fastdfs\storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

storage文件上传

SpringBoot项目上传

1.导入依赖

1
2
3
4
5
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>fastdfs-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>

2.配置上线项目的application-prod.yaml文件

注:redis与mysql地址因与启动容器时docker分配的地址一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server:
port: 9999

nginx:
address: http://localhost:8888/

#激活文件
spring:
session:
store-type: redis #将session保存到redis中
redis:
database: 1 #redis 默认0-15总共16个库 这里采用1库
host: 172.18.0.2 #到docker后修改,还要加上用户名和密码,且redis中配置访问的主机的ip,以提高安全性
password: a
port: 6379
timeout: 5000
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.18.0.3:3306/134res?serverTimezone=UTC
username: root
password: a
type: com.alibaba.druid.pool.DruidDataSource

logging:
level:
root: info
org.springframework: info
org.apache: info
file:
path: logs/

fdfs:
#客户端在连接到服务器时的超时时间为2秒
connect-timeout: 2000
#连接到服务器后的读取数据超时时间为3秒
so-timeout: 3000
#服务器的地址和端口,与tracker的一致
tracker-list:
- 172.18.0.4:22122

3.将项目用idea插件推送镜像至docker

1.pom.xml导入插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<build>
<plugins>
<!-- 根据Dockfile文件生成docker镜像 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>javastack/${project.name}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<dockerfile>Dockerfile</dockerfile>
</configuration>
</plugin>
</plugins>
</build>

2.配置DockFile文件

1
2
3
4
5
6
7
8
9
10
11
#从openjdk的官方镜像仓库中拉取一个OpenJDK 8的镜像
FROM openjdk:8

#添加参数
ARG JAR_FILE

#将Maven构建生成的JAR文件(由构建参数 JAR_FILE 指定)复制到镜像中的app.jar文件。
ADD target/${JAR_FILE} app.jar

#通过 Java 运行 app.jar,并指定了一些 Java 运行参数,如激活名为 prod 的 Spring Profile,并设置随机数种子源为 /dev/./urandom。
ENTRYPOINT ["java","-Dspring.profiles.active=prod","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

3.项目打包生成docker镜像

打包项目自动生成镜像

docker生成的镜像

4.用镜像生成一个container容器

5.将容器加入birdge网络

1
2
3
docker network connect ycnetwork 134res
//查看网络中是否含有134res容器
docker inspect ycnetwork

在docker上重新启动134res容器