基于Docker快速部署应用

一、安装docker

1.旧版卸载:下面是docker应用的一些相关运行的包

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    docker-selinux

2.配置docker的yum库(类似于npm和maven)

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

如果此处安装失败,依次执行如下命令:(替换yum的软件源再启动)

# 备份现有的yum仓库
sudo mv /etc/yum.repos.d /etc/yum.repos.d.backup
# 创建新的yum.repos.d目录
sudo mkdir /etc/yum.repos.d
# curl命令从aliyun下载centos的基础仓库的配置文件,保存到CentOS-Base.repo
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清理yum缓存
sudo yum clean all
# 生成或刷新yum缓存,会根据新的仓库配置文件下载最新的元数据到本地缓存中
sudo yum makecache
# 同时安装三个软件包:-y 参数用于自动确认默认的“Yes”响应
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

3.安装成功后配置docker的yum源

# 使用yum-config-manager添加新仓库。
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 替换掉docker-ce.repo文件中出现的download.docker.com地址替换为阿里云的镜像地址mirrors.aliyun.com/docker-ce
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

4.安装Docker(即一组docker组件,包括docker-ce、docker-ce-cli等)

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5.启动和校验Docker

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

6.配置镜像加速(嫌麻烦也可以不做,有一个比较快的稳定的仓库就可以了,从前往后寻找镜像,所以稳定和快的调到前面,调好了再执行)

# 创建目录
mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirrors.tuna.tsinghua.edu.cn",
        "http://mirrors.sohu.com",
        "https://ustc-edu-cn.mirror.aliyuncs.com",
        "https://ccr.ccs.tencentyun.com",
        "https://docker.m.daocloud.io",
        "https://docker.awsl9527.cn",
        "https://docker.211678.top",
        "https://docker.1panel.live",
        "https://hub.rat.dev",
        "https://docker.m.daocloud.io",
        "https://do.nark.eu.org",
        "https://dockerpull.com",
        "https://dockerproxy.cn",
        "https://docker.awsl9527.cn"
    ]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

如果自己在aliyun或huaweiyun的注册了,就可以使用它们的docker镜像仓库,把仓库源加入到上面命令的第一位。

二、部署应用

需求:部署一个应用mall

2.1 前置设置

2.1.1 创建一个网桥

用于各个容器之间的相互通信

docker network create mall-net

2.1.2 创建一个应用目录

(如果你是一台服务器部署单个项目,也可以直接使用linux的/root)

mkdir /root/mall # 创建应用名的目录

2.1.3 创建各个容器的挂载目录

容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建,所以要提前创建好相关目录

# 创建mysql的挂载目录,包括数据、配置文件、初始化脚本(脚本也可以在外部刷)
mkdir -p /root/mall/mysql/data
mkdir /root/mall/mysql/conf
mkdir /root/mall/mysql/init
# 创建nginx的挂载目录
mkdir -p /root/mall/nginx/html
touch /root/mall/nginx/nginx.conf

2.2 部署mysql

1.mysql相关配置文件上传到/root/mall/mysql/conf

文件名为hm.cnf,文件内容如下:(也可以不用管,使用默认配置也行)

[client]

default_character_set=utf8mb4

[mysql]

default_character_set=utf8mb4

[mysqld]

character_set_server=utf8mb4

collation_server=utf8mb4_unicode_ci

init_connect=‘SET NAMES utf8mb4’

2.创建容器并运行

docker run -d \
  --name hm-mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=admin@1234 \
  -v /root/mall/mysql/data:/var/lib/mysql \
  -v /root/mall/mysql/conf:/etc/mysql/conf.d \
  -v /root/mall/mysql/init:/docker-entrypoint-initdb.d \
  --network mall-net \
  --restart=always \
  mysql

上诉命令实际上只有一条,下面是其参数的解释,请根据实际情况修改相关参数的值。

docker run # 创建并运行一个容器

-d # 在后台运行容器

\ # 命令未结束换行(命令太长可以使用)

–name hm-mysql # 给容器命令,必须唯一

-p 3306:3306 # 端口映射

-v 宿主机目录:/var/lib/mysql \ # 数据卷挂载

-e key=value # 设置环境变量(是否需要设置由镜像制作者提供,需要查看官方文档)

mysql # 运行指定镜像的名字

3.工具访问

对启动的mysql应用进行访问,比如说navicat工具,将初始表结构和数据刷入进去。

2.3 部署nginx

1.上传nginx.conf和前端资源

nginx.conf覆盖/root/mall/nginx/nginx.conf

前端资源放置到/root/mall/nginx/html


worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/json;

    sendfile        on;
    
    keepalive_timeout  65;

    server {
        listen       18080;
        # 指定前端项目所在的位置
        location / {
            root /usr/share/nginx/html/hmall-portal;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location /api {
            rewrite /api/(.*)  /$1 break;
            proxy_pass http://hm-nginx:8080;
        }
    }
    server {
        listen       18081;
        # 指定前端项目所在的位置
        location / {
            root /usr/share/nginx/html/hmall-admin;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location /api {
            rewrite /api/(.*)  /$1 break;
            proxy_pass http://hm-nginx:8080;
        }
    }
}

2.创建并运行nginx

docker run -d \
  --name hm-nginx \
  -p 18080:18080 \
  -v /root/mall/nginx/html:/usr/share/nginx/html \
  -v /root/mall/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network mall-net \
nginx

访问地址:远程地址+端口号(注意,如果是云服务器需要在相关控制台开启端口号访问权限)

2.4 部署java应用

2.4.1 自定义镜像

制镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。

打包镜像包括如下步骤:

  • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
  • 安装并配置JDK
  • 拷贝jar包(注意数据库访问密码)
  • 配置启动脚本

1.编写Dockerfile运行脚本(注意写完后,放置到应用mall目录下)

# 基础镜像
FROM openjdk:11.0-jre-buster  # 包括jdk和Linux系统环境
# 设定时区(也可以不用设置)
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /root/mall/app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/root/mall/app.jar"]

2.构建镜像(注意到mall目录下执行)

# 进入镜像目录
cd /root/mall
# 开始构建
docker build -t hm-app:1.0 .

2.4.2 创建容器并运行java应用

通过2.4.1运行之后会生成自定义的镜像文件,通过docker run运行:

# 1.创建并运行容器 
docker run -d --name hm-app -p 8080:8080 --network mall-net hm-app:1.0

2.5 DockerCompose

对于2.2/2.3/2.4部署容器的过程可以实现一键部署,重点就是编写docker-compose文件,然后进行执行。

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:
  hm-net:
    name: hmall

执行:

# 1.进入root目录
cd /root

# 2.删除旧容器
docker rm -f $(docker ps -qa)

# 3.删除hmall镜像
docker rmi hmall

# 4.清空MySQL数据
rm -rf mysql/data

# 5.启动所有, -d 参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                    0.0s
 => => transferring dockerfile: 358B                                                    0.0s
 => [internal] load .dockerignore                                                       0.0s
 => => transferring context: 2B                                                         0.0s
 => [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster             15.4s
 => [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3  0.0s
 => [internal] load build context                                                       0.0s
 => => transferring context: 98B                                                        0.0s
 => CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo   0.0s
 => CACHED [3/3] COPY hm-service.jar /app.jar                                           0.0s
 => exporting to image                                                                  0.0s
 => => exporting layers                                                                 0.0s
 => => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71  0.0s
 => => naming to docker.io/library/root-hmall                                           0.0s
[+] Running 4/4
 ✔ Network hmall    Created                                                             0.2s
 ✔ Container mysql  Started                                                             0.5s
 ✔ Container hmall  Started                                                             0.9s
 ✔ Container nginx  Started                                                             1.5s

# 6.查看镜像
docker compose images
# 结果
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
hmall               root-hmall          latest              32eebee16acd        362MB
mysql               mysql               latest              3218b38490ce        516MB
nginx               nginx               latest              605c77e624dd        141MB

# 7.查看容器
docker compose ps
# 结果
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s…"   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint.…"   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp

三、docker部署常用命令

# 镜像相关命令
sudo docker images          # 查看镜像列表
sudo docker search ubuntu   # 镜像搜索ubuntu(可选)
sudo docker pull 镜像名         # 下拉镜像
sudo docker pull 镜像名:Tag     # 下拉镜像(tag表示版本,没写表示最新版本)
sudo docker rmi -f 镜像名/镜像ID           # 删除镜像
docker save 镜像名/镜像ID -o 文件保存地址   # 保存镜像
docker load -i 文件保存地址      # 加载镜像

# 容器相关命令
sudo docker ps                   # 查看正在运行的容器
sudo docker ps -a                # 查看所有容器
sudo docker stop 容器名/容器ID   # 停止容器
docker rm -f 容器名/容器ID                # 删除一个容器
docker rm -f 容器名/容器ID 容器名/容器ID   # 删除多个容器
docker rm -f $(docker ps -aq)             # 删除全部容器
sudo docker attach 容器ID/容器名   # 进入容器
docker update --restart=unless-stopped nacos    # 更新为容器自启动

# 创建容器
docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置 镜像名:Tag /bin/bash 
-it 表示 与容器进行交互式启动
-d 表示可后台运行容器 (守护式运行)  
--name 给要运行的容器 起的名字  
/bin/bash  交互路径
-p 将容器的端口映射到宿主机上,通过宿主机访问内部端口
-v 将容器内的指定文件夹挂载到宿主机对应位置

# 数据卷相关命令
docker volume create 数据卷名   # 创建数据卷
docker volume rm 数据卷名        # 删除指定数据卷
docker volume inspect 数据卷名   # 查看某个数据卷的详情
docker volume ls                # 查看所有数据卷
docker volume prune             # 清除所有数据卷

# 网络相关命令
docker network create 网络名    # 创建一个网络
docker network ls               # 查看所有网络
docker network rm 网络名        # 删除指定网络
docker network prune 网络名     # 清除未使用的网络
docker network connect 网络名 容器名   # 使指定容器连接加入某网络
docker network disconnect 网络名 容器名 # 使指定容器连接离开某网络
docker network inspect 网络名    # 查看网络详细信息       

# linux命令
clear # 清空命令行
systemctl start docker   # 启动软件docker(其他软件类似)
systemctl stop docker    # 停止软件docker
systemctl restart docker # 重启软件docker
systemctl enable docker  # 设置开机自启docker
mkdir 文件夹名           # 创建文件夹
touch 文件名             # 创建文件

补充1:脚本编写的指令

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值