微服务-Docker

一、概念

1.1 安装Docker

  1. 卸载旧版本
    执行语句:
bash 复制代码
sudo yum remove docker

返回结果:

  1. 安装新版本工具

执行语句:

bash 复制代码
sudo yum install -y yum-utils

返回结果:

  1. 配置yum源

执行语句:

bash 复制代码
 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

返回结果:

  1. 安装docker

执行语句:

bash 复制代码
 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

返回结果:

  1. 查看docker版本

执行语句:

bash 复制代码
docker -v

返回结果:

  1. 查看docker是否安装成功

执行语句:

bash 复制代码
docker images

执行结果:说明docker没有连接上,docker没有启动

  1. 启动docker

执行语句:

bash 复制代码
systemctl start docker
执行完成后,通过使用docker images 命令来验证是否启动成功


配置镜像加速

  • 注册阿里云账号: https://www.aliyun.com/,注册一个账号
  • 开通镜像服务: 首页---产品---容器镜像服务ACR---管理控制台---


验证配置是否生效,如果能看到你配置的那个阿里云地址,说明配置成功了。

bash 复制代码
sudo docker info | grep -A 1 "Registry Mirrors"

验证返回结果:

  1. 停止docker

执行语句:

bash 复制代码
systemctl stop docker
  1. 重启docker
    执行语句:
bash 复制代码
systemctl restart docker
  1. 设置开机自启动
    执行语句:
bash 复制代码
systemctl enable docker
  1. 执行docker ps命令,如果不报错,说明安装启动成功
    执行语句:
bash 复制代码
docker ps

1.2 docker的使用

镜像和容器:

当我们利用docker安装应用时,Docker会自动搜索并下载应用镜像(image) ,镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器
镜像仓库: 存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub ;

1.2.1 部署MySQL

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

bash 复制代码
docker run -d  --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql

返回结果:

以上问题是由于镜像加速器没有配置成功,使用一下命令重新配置镜像加速器

bash 复制代码
# 1. 创建/写入配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me"
  ]
}
EOF

# 2. 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 3. 验证配置是否生效(应该能看到镜像地址)
docker info | grep -A 5 "Registry Mirrors"

在navicat上连接MySQL

1.2.2 命令解读

bash 复制代码
docker run -d  --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
  • docker run: 创建并运行一个容器;
  • -d: 是让容器在后台运行
  • --name mysql: 给容器起个名字必须唯一
  • -p 3306:3306: 设置端口映射,前面端口是宿主机端口(只能用一次),后面端口是容器内端口
  • -e KEY=VALUE: 是设置环境变量KEY(官方查找)VALUE(自定义值),通过镜像制作者制定,使用官网中的定义的;
  • mysql: 指定运行的镜像的名字,默认为最新版本的镜像;

镜像命名规范:

  • 镜像名称一般分成两部分组成:[repository]:[tag]repository 就是镜像名,tag是镜像的版本,正常应该mysql:5.7;
  • 在没有指定tag时,默认是latest,代表最新版本的镜像;

二、Docker基础

2.1 常见命令

Docker最常见的命令就是操作镜像、容器的命令 ,官方文档:https://docs.docker.com/

案例:查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器
需求:

  1. 在DockerHub中搜索Nginx镜像,查看镜像的名称;
    官方网址:https://hub.docker.com/
  2. 拉取Nginx镜像;
    执行命令:
bash 复制代码
docker pull nginx

返回结果(报错:无法连接到位于国外的 Docker Hub 官方仓库):

解决方法:
使用一键配置脚本,在终端中,直接执行下面这行命令。它会自动完成所有配置并重启Docker:

bash 复制代码
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)

验证配置是否成功,脚本执行完毕后,运行下面的命令,如果能看到你配置的镜像加速器地址,就代表成功了

bash 复制代码
docker info | grep "Registry Mirrors" -A 5

再次尝试拉取镜像

bash 复制代码
docker pull nginx

以上报错,根据一下方法解决

bash 复制代码
# 配置单个稳定源(推荐使用 DaoCloud 或 USTC)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF

# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep -A 3 "Registry Mirrors"

# 如果验证输出显示 https://docker.m.daocloud.io,说明配置成功
docker pull nginx
  1. 查看本地镜像列表;
bash 复制代码
docker images


保存镜像包: docker save -o 镜像包名 镜像名:版本号

bash 复制代码
docker save -o nginx.tar nginx:latest

查看本地镜像: ll

删除镜像: docker rmi 镜像名:版本号

bash 复制代码
docker rmi nginx:latest


将本地镜像重新加载到docker: docker load

当不知道docker命令如何使用时,可以在命令后面加上--help,查看对象的讲解

bash 复制代码
docker load -i nginx.tar
  1. 创建并运行Nginx容器;
    执行命令:
bash 复制代码
docker run -d --name nginx -p 8080:80 nginx

返回结果:

  1. 查看容器;
    执行命令:
bash 复制代码
docker ps

返回结果:

指定输出命令:

bash 复制代码
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"

返回结果:

  1. 停止容器;
    执行命令:
bash 复制代码
docker stop nginx

返回结果:

  1. 再次启动容器
    执行命令:
bash 复制代码
docker start nginx

返回结果:

查看日志:

bash 复制代码
docker start -f nginx

返回结果:

  1. 进入Nginx容器
    执行命令:
bash 复制代码
docker exec -it nginx bash

返回结果:

退出容器:exit

  1. 删除容器
    先确保容器是关闭状态:docker stop 容器名称,再删除docker rm 容器名称 -f[可选,强制删除]
    执行命令:
bash 复制代码
docker rm mysql -f
  1. 命令别名
bash 复制代码
vi ~/.bashrc

使别名文件生效

bash 复制代码
source ~/.bashrc

2.2 数据卷

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

使用docker volume --help命令查看数据卷相关的命令

案例1---利用Nginx容器部署静态资源
需求:

  • 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化;
  • 将静态资源部署到nginx的html目录;

提示:

  1. 在执行docker run命令是,使用-v 数据卷:容器内目录可以完成数据卷挂载;
  2. 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷;

创建容器并创建数据卷

bash 复制代码
docker run -d --name nginx -p 8080:80 -v html:/usr/share/nginx/html nginx


删除数据卷

bash 复制代码
docker volume rm

查看数据卷

bash 复制代码
docker volume ls


查看数据卷的详细信息

bash 复制代码
docker volume inspect html

返回结果:


删除未使用的数据卷

bash 复制代码
docker volume prune

案例2---mysql容器的数据挂载
需求:

  • 查看mysql容器,判断是否有数据卷挂载;
  • 基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档);
    • 挂载/root/mysql/data到容器内的/var/lib/mysql目录;
    • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录;
    • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录;
      提示:
  • 在执行docker run命令时,使用-v本地目录:容器内目录可以完成本地目录挂载;
  • 本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
    -- -v mysql:/var/lib/mysql会被识别为一个数据卷叫mysql
    -- -v./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录

查看容器中是否有数据卷

bash 复制代码
docker inspect mysql

2.3 自定义镜像

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

  • Dockerfile语法
  • Dockerfile 是一个文本文件 ,里面包含了一系列构建镜像的指令 。可以把它理解为镜像的配方制作说明书


  • 自定义镜像
    jdk.tar包复制到根目录下(如yueyue/目录)------执行docker load -i jdk.tar命令,载入镜像------执行cd demo/命令,进入demo目录------执行docker build -t docker-demo .,构建基础镜像------基础镜像构建完成,使用docker images查看------执行docker run -d --name dd -p 8080:8080 docker-demo命令,启动该镜像
    执行docker build -t docker-demo【基础镜像构建完成】

    执行docker run -d --name dd -p 8081:8080 docker-demo【启动镜像】

    执行docker logs -f dd【查看jdk镜像日志】

    在浏览器中使用http://192.168.19.128:8081/hello/count路径访问

2.4 网络

查看容器

执行docker inspect mysql,查看【mysql】容器详情

执行docker inspect dd,查看【jdk】容器详情

执行docker inspect nginx,查看【nginx】容器详情

发现以上容器IP地址,均在同一网段,则这些容器之间可以互相访问
网络

默认情况下,所有容器都是以bridge方式 连接到Docker的一个虚拟网桥上:

使用网络,可以将容器加入同一个自定义网络,可以通过容器名互相访问;

三、项目部署

3.1 部署Java应用

需求: 将hmall项目打包为镜像并部署,镜像名为hmall
idea工具打开项目------maven中package打包(注意要取消test用例)------打包项目在target中(.jar包)------将对应的src中的Dockerfile和target中的jar包放入虚拟机------

浏览器中访问http://192.168.19.128:8081/hi

3.2 部署前端

需求:创建一个新的nginx容器,将nginx.conf、html目录与容器挂载
打开前端文件nginx------复制到虚拟机------执行命名1(报nginx名已存在)------执行命令2(删除重名容器nginx)------再次执行命令1------

bash 复制代码
# 命令1
docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /home/yueyue/nginx/html:/usr/share/nginx/html \
  -v /home/yueyue/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  --network yue \
  nginx
# 命令2
docker rm -f nginx

浏览器中访问http://192.168.19.128:18080/

部署一个完整的项目步骤:

  1. 创建一个自定义网络;
  2. docker在自定义网络中部署mysql、java后端代码、nginx前端代码,形成同一个自定义网络下的不同容器;
  3. docker启动容器;
  4. Java后端数据库的连接、前端与后端接口的连接;

3.3 DockerCompose

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


部署mysql

部署项目------docker-compose

将项目中所有使用到的容器全部写入到docker-compose文件中(yaml格式),------将docker-compose文档上传的虚拟机------

执行命令docker rm -f nginx hm mysql,将之前部署的容器删除)------执行命令docker compose up -d,实现一键部署(如下图)------执行docker compose ps,查看项目下的所有进程------

列出所有启动的容器

查看虚拟机中的所有的镜像

停止并移除所有容器、网络

Docker Compose文件模板

yaml 复制代码
# 版本声明(新版可省略)
version: '3.8'

# 服务定义(必需)
services:
  service1:
    # 服务配置...
  service2:
    # 服务配置...

# 网络定义(可选)
networks:
  my-network:

# 数据卷定义(可选)
volumes:
  my-volume:

hmall示例项目docker-compose文件

yaml 复制代码
name: hmall

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: unless-stopped
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123
      TZ: Asia/Shanghai
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - hmall-network

  backend:
    build: ./hmall
    container_name: hmall-backend
    restart: unless-stopped
    ports:
      - "8081:8080"
    depends_on:
      mysql:
        condition: service_healthy
    environment:
      DB_HOST: mysql
      DB_PORT: 3306
      DB_PASSWORD: 123
    networks:
      - hmall-network

  frontend:
    image: nginx:alpine
    container_name: hmall-nginx
    restart: unless-stopped
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - backend
    networks:
      - hmall-network

networks:
  hmall-network:
    driver: bridge

volumes:
  mysql_data:

标准化的部署流程:

  1. 准备阶段: 确保代码在虚拟机上,进入项目目录;
bash 复制代码
# 1. 确保代码在虚拟机上(任选一种方式)
# 方式A:Git拉取(推荐)
git clone https://github.com/your/project.git

# 方式B:手动上传
scp -r ./project user@192.168.19.128:/home/user/

# 2. 进入项目目录
cd /home/user/project
  1. 准备Docker相关文件: 在项目根目录创建文件(Dockerfile、docker-compose.yml);
dockerfile 复制代码
# Dockerfile
FROM openjdk:17-jdk-alpine
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
yaml 复制代码
# docker-compose.yml
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - mysql_data:/var/lib/mysql
  
  backend:
    build: .                    # 使用当前目录的Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - mysql
  
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro

volumes:
  mysql_data:
  1. 构建和部署: 构建镜像(使用Dockerfile)、一键启动所有服务(使用Compose)、验证部署是否成功;
bash 复制代码
# 1. 构建镜像(如果使用Dockerfile)
docker build -t myapp:latest .

# 2. 一键启动所有服务(使用Compose)
docker compose up -d

# 3. 验证部署是否成功
docker compose ps                    # 查看容器状态
docker compose logs -f              # 查看日志
curl http://localhost:8080          # 测试接口
  1. 维护更新: 更新代码后重新部署(或者更简单的热更新)、停止项目、停止并删除数据卷(会丢失数据)
bash 复制代码
# 更新代码后重新部署
git pull                            # 拉取新代码
docker compose build                # 重新构建镜像
docker compose up -d --force-recreate  # 强制重建容器

# 或者更简单的热更新(开发环境用)
docker compose restart backend

# 停止项目
docker compose down

# 停止并删除数据卷(⚠️会丢失数据)
docker compose down -v
相关推荐
雪碧聊技术2 小时前
微服务实战:彻底解决子项目找不到父项目工具类、实体类的问题
微服务·云原生·架构
Taking_fish3 小时前
docker常见操作命令(基础服务搭建)
运维·docker·容器
眷蓝天10 小时前
Docker 镜像瘦身:从 GB 到 MB 的优化实践
运维·docker·容器
fanly1112 小时前
surging 的Agent插件研发全流程:从定义到落地
微服务·ai·surging
一叶飘零_sweeeet13 小时前
Docker Compose实战指南
运维·docker·容器
亚空间仓鼠13 小时前
Docker 容器技术入门与实践 (六):Docker镜像瘦身
docker·容器·eureka
SPC的存折14 小时前
10、Docker容器故障排查
linux·运维·数据库·docker·容器
乌托邦的逃亡者16 小时前
Dockerfile的配置和使用
linux·运维·docker·容器
七七powerful16 小时前
loki监控docker容器&系统&nginx日志的告警规则
nginx·docker·容器