Docker

发布于:2025-08-09 ⋅ 阅读:(11) ⋅ 点赞:(0)

什么是 Docker ?

Docker 是一款快速构建,运行,管理应用的工具。

首先要安装 Docker,参考:https://heuqqdmbyk.feishu.cn/wiki/GAwGwd0GHibOovkLpH3cjpMwnVm

安装完成后启动 Docker 即可,执行命令:systemctl start docker

快速入门

通过前面对于 Linux 学习,会发现在 Linux 完成软件的安装非常麻烦和繁琐,但是如果用 docker的话就会简单很多,这里用安装 MySQL 为例。

安装 MySQL

先停掉虚拟机中的 MySQL,确保你的虚拟机已经安装 Docker,且网络开通的情况下,执行下面命令即可安装 MySQL:

docker run -d \
  --name mysql \
  -p 3307:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql:8

docker run:创建并运行一个容器,-d 是让容器在后台运行

--name mysql:给容器起一个名字,必须唯一

-p 3307:3306:设置映射端口

-e KEY=VALUE:设置环境变量

mysql:8:指定运行的镜像的名字,版本 

镜像和容器

当我们利用 Docker 安装应用时,Docker 会自动搜索并下载应用镜像(image)。

镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库。Docker 会在运行镜像时创建一个隔离环境,称为容器(container)。

镜像仓库:存储和管理镜像的平台,Docker 官方维护了一个公共仓库:Docker Hub。

Docker 核心

常见命令

Docker 最常见的命令就是操作镜像,容器的命令,详细可参考官方文档。

数据卷挂载

利用 Nginx 容器部署静态资源

需求:

        创建 Nginx 容器,修改 nginx 容器内的 html 目录下的 index.html 文件,查看变化

        将静态资源部署到 nginx 的 html 目录

创建容器:

进入容器:

参考官方文档找到这个 html 目录在哪,答案是在 /usr/share/nginx/ 下。

进入该目录,然后可以发现:

再进入 html,如果我们直接用 vi 或者 vim 进行编辑的话,会发现里面没有 vi 和 vim 的指令。因为对于 nginx 来说,这个指令不是必须的,为了控制镜像的体积,它并没有去提供这些指令。

这时候就需要用到数据卷了。

数据卷(volume)是一个虚拟目录,是 容器内目录 宿主机目录 之间映射的桥梁

当我们创建 nginx 容器时,也就是执行 docker run 命令时,使用 -v 数据卷:容器内目录 形式可以完成数据卷挂载(数据卷不存在,会自动创建)

 先把之前创建的容器删除:

然后创建

进入之后可以看到以下,就说明我们已经成功的将容器里面的文件映射到宿主机上,是通过数据卷来实现的。

我们还要知道这个数据卷对应的宿主机上的磁盘是哪个,可以执行以下命令

第四行那个 Mountpoint 叫做挂载点,也就是我们编辑的地方

进入该目录下就可以用 vim 编辑了

最后直接将要上传的文件拖到宿主机的 html/_data 目录下即可,容器内的 html 文件也会自动上传

本地目录挂载

命令:

docker run -d --name 容器名 -p 宿主机端口:容器端口 -v 宿主机目录或文件:容器内目录或文件 镜像名

创建 MySQL 容器并实现本地目录挂载

需求:

        创建 MySQL 容器,并基于本地目录挂载实现 MySQL 容器数据目录,配置文件,初始化脚本的目录挂载。(官方文档)

步骤:

自定义镜像

镜像就是包含了应用程序,程序运行的系统函数库,运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

具体步骤:

镜像结构:

要想描述这个镜像的结构,就得编写一份描述文件,这个文件是固定的叫 Dockerfile

Dockerfile 就是一个文本文件,其中包含了一个个的指令(Insturction),用指令来说明要执行什么操作来构建镜像。将来 Docker 可以根据 Dockerfile 来帮我们构建镜像。

常见指令如下:

我们可以基于 CentOS7 基础镜像,利用 Dockerfile 描述镜像结构

编写好了 Dockerfile 后,可以利用下面命令来构建镜像:

-t:是给镜像起名,格式依然是 respository:tag 格式,不指定 tag 时,默认为 latest

.:是指定 Dockerfile 所在目录,如果就在当前目录,则指定为 "."

网络

以下是 MySQL 容器的 IP 地址

以下是 java应用app容器 对应的 IP 地址

可以看见这两个容器的 IP 地址是在同一个网段,意味着它们很大概率可以互相通信。下面来解释其原理:

默认情况下,所有容器都是以 bridge 方式连接到 Docker 的一个虚拟网桥上,虚拟网桥就是我们安装 Docker 后自带的,就是下面的 docker0.

现在想一个问题,当我的一个应用连接到一个 MySQL 容器时,我把这个 MySQL 容器停止后重新启动起来,那么因为这个 IP 地址是随机分配的,所以这个容器的地址就会产生变化,进而导致 bug,对于这个问题,我们可以通过 Docker 当中的自定义网络来解决。

指的就是我们可以通过 Docker 中的一些指令,自己创建一个虚拟的网桥,然后我们创建容器的时候,我们让我们所创建的容器连接到我们自己创建的虚拟网卡当中,这样我们容器之间相互通信你的时候,就可以通过容器之间的名字相互通信,就不用再管这个 IP 地址了,容器名字是不会变化的。

项目部署

服务端部署

首先要让 DataGrip 连接上 docker 里面的数据库

然后记得修改 yml 文件里的 url 和 logback.xml 文件下日志保存路径,这里的 url 可以不用 ip 地址,直接用容器名,因为我们之前在 网络 配置过了。修改后打包成 jar 包即可

之后编写 Dockerfile 文件,OSS 的 ID 和 SECRET 要改成自己的。

# 使用 CentOS 7 作为基础镜像
FROM centos:7

# 添加 JDK 到镜像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ &&  rm /usr/local/jdk17.tar.gz

# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH

ENV OSS_ACCESS_KEY_ID=LTAI5tP6dc4cvccdvvySE39X
ENV OSS_ACCESS_KEY_SECRET=ZSyIT31qhxIkS0dH1H9WzHqPiyM3Ot

#统一编码
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8

# 创建应用目录
RUN mkdir -p /tlias
WORKDIR /tlias

# 复制应用 JAR 文件到容器
COPY  tlias.jar  tlias.jar

# 暴露端口
EXPOSE 8080

# 运行命令
ENTRYPOINT ["java","-jar","/tlias/tlias.jar"]

然后在 /usr/local 目录下新建一个目录 docker-app,并将文件上传上来

构建镜像

有了镜像就可以创建容器了

前端部署

这里主要是用到目录映射

我们先将需要挂载的文件上传到 /root/tlias-nginx目录里        

然后创建这个 nginx 容器

docker run -d \
 --name nginx-tlias \
 -v /root/tlias-nginx/html:/usr/share/nginx/html \
 -v /root/tlias-nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
 --network itheima \
 -p 80:80 \
nginx:1.20.2

DockerCompose

Docker Compose 通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的 Docker 容器的快速部署

我们先把之前创建的容器,网络全部删掉,镜像的话留这三个

然后我们分三步完成:

1:准备资源(tlias.sql,服务端的 jdk17,jar包,Dockerfile,前端项目打包文件,nginx.conf)

2:准备 docker-compose.yml 配置文件

services:
  mysql:
    image: mysql:8
    container_name: mysql
    ports:
      - "3307:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "/usr/local/app/mysql/conf:/etc/mysql/conf.d"
      - "/usr/local/app/mysql/data:/var/lib/mysql"
      - "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - tlias-net
  tlias:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: tlias-server
    ports:
      - "8080:8080"
    networks:
      - tlias-net
    depends_on:
      - mysql
  nginx:
    image: nginx:1.20.2
    container_name: nginx-tlias
    ports:
      - "80:80"
    volumes:
      - "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
      - "/usr/local/app/nginx/html:/usr/share/nginx/html"
    depends_on:
      - tlias
    networks:
      - tlias-net
networks:
  tlias-net:
    name: itheima

3:基于 Docker-Compose 快速构建项目

将我们需要的东西全部上传到 /root/usr/local/app 这个文件夹里

然后就可以用 compose 来构建项目了,这些需要用到 compose 命令

启动

移除


网站公告

今日签到

点亮在社区的每一天
去签到