0%

Docker部署开发环境

Docker部署

Docker部署应用

涉及Docker命令

镜像操作

1
2
3
4
# 查看本地镜像
docker images
# 移除镜像
docker rmi nginx:latest

容器操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 列出运行中的容器
docker ps
# 列出所有容器
docker ps -a

# 进入容器
docker exec -it mysql /bash
docker exec -it openjdk /bin/bash
# 停止容器
docker stop <CONTAINER ID|NAME>
# 删除容器
docker rm <CONTAINER ID|NAME>
# 杀死运行中的容器
docker kill -s KILL eladmin
# 退出
exit

镜像运行到容器

1
2
3
4
5
6
7
# 镜像运行到容器    /bin/bash 指定容器内目录
docker run -d -it --name myopenjdk openjdk /bin/bash
-d # 后台运行
-p 3306:3306 # 将容器的3306端口映射到主机的3306端口
-v /opt/docker_v/mysql/conf:/etc/mysql/conf.d #将主机/opt/docker_v/mysql/conf目录挂载到容器的/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456 # 初始化root用户的密码
imageID # mysql镜像ID

日志

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker logs [OPTIONS] CONTAINER
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如40m(即40分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如40m(即40分钟)

# 例子
docker logs eladmin
docker logs -f eladmin

部署应用

第一种:挨个部署

部署流程

  1. 购买服务器
  2. 安装docker
  3. 部署后端
    1. 准备后端基础运行环境
      1. jdk
      2. redis
      3. mysql
        1. 拉镜像
        2. 启动mysql
        3. 服务器开放对外mysql端口
        4. navicat连接服务器,执行初始化sql脚本
    2. 制作后端应用镜像
      1. maven install 打包
      2. 编写Docfile
      3. 两者都上传到服务器同一目录下
      4. 进入该目录,制作镜像
    3. 后端启动脚本
      1. 脚本内容
      2. 编写为应用启动脚本
    4. 启动后端应用
    5. 验证
      1. 查看启动日志
      2. 开放服务器端口号
      3. PostMan测试接口
      4. 关闭服务器端口号
  4. 部署前端
    1. 前端基础运行环境
    2. 前端代码打包
    3. 配置nginx
    4. 启动nginx

部署后端

后端基础运行环境

jdk,redis,mysql

  1. jdk

    1
    2
    3
    4
    5
    6
    7
    docker  search  jdk  
    # 拉取openjdk最新镜像
    docker pull openjdk
    # 运行
    docker run -d -it --name openjdk openjdk /bin/bash
    # 验证
    docker exec -it openjdk /bin/bash
  2. redis

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 拉取redis最新镜像
    docker pull redis:latest

    # 运行到容器中
    # -p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。
    docker run -itd --name redis-hxr -p 6379:6379 redis

    # 测试连接redis
    docker exec -it redis-hxr /bin/bash
  3. mysql

    1. 拉取镜像并运行到容器

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # 查看mysql版本
      # 看不到版本?
      docker search mysql
      # 拉取指定版本镜像
      docker pull mysql:8.0.19
      # 运行
      docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=*** mysql:8.0.19
      # 进入容器
      docker exec -it mysql bash
    2. 开放服务器端口

    3. 连接mysql

    4. 执行初始化SQL脚本

制作后端应用镜像
  1. maven install 打包

    image-20220301112453557

  2. 编写Docfile

    1
    2
    3
    4
    5
    FROM java:8
    ARG JAR_FILE=./*.jar
    COPY ${JAR_FILE} app.jar
    ENV TZ=Asia/Shanghai
    ENTRYPOINT ["java","-jar","/app.jar"]
  3. 两者都上传到服务器同一目录下

    image-20220301112638520

  4. 制作镜像

    1
    docker build -t eladmin /home/eladmin

    或者

    1
    2
    3
    cd /home/eladmin

    docker build -t eladmin . # .代表Docfile所在目录是当前目录
后端启动脚本
  1. 内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    docker run -d \
    --name eladmin \
    --restart always \
    -p 8000:8000 \
    -e "TZ=Asia/Shanghai" \
    -e DB_HOST=172.17.0.1 \
    -e DB_PWD=*** \
    -e REDIS_HOST=172.17.0.1 \
    -v /home/data/:/home/eladmin/ \
    eladmin
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    docker run -d \  # -d后台启动
    --name eladmin \ # 镜像启动为容器的名称
    --restart always \ # 随docker重启而重启;失败重启?
    -p 8000:8000 \ # 指定端口映射
    -e "TZ=Asia/Shanghai" \
    -e DB_HOST=172.17.0.1 \ # mysql地址是docker地址 宿主机ifconfig查看
    -e DB_PWD=*** \ # todo
    -e REDIS_HOST=172.17.0.1 \ # redis地址是docker地址
    -v /home/data/:/home/eladmin/ \ # docker内指定目录挂载到与宿主机
    eladmin # 镜像名称
  2. 脚本

    1. 编写

      新建文件start.sh

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      docker run -d \
      --name eladmin \
      --restart always \
      -p 8000:8000 \
      -e "TZ=Asia/Shanghai" \
      -e DB_HOST=172.17.0.1 \
      -e DB_PWD=*** \
      -e REDIS_HOST=172.17.0.1 \
      -v /home/data/:/home/eladmin/ \
      eladmin
    2. 添加执行权限

      1
      chmod +x start.sh
    3. 执行

      1
      /home/eladmin/start.sh

部署前端

前端运行环境
  1. nginx

    1
    # nginx
前端项目
  1. 检查生产配置

    image-20220301114645266

  2. 打包

    1
    npm run build:prod

    image-20220301114730178

  3. 上传

    1
    /home/nginx/html/eladmin

    image-20220301151357030

  4. nginx配置

    /home/nginx目录创建nginx.conf

    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
    user  nginx;
    worker_processes 1;

    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;


    events {
    worker_connections 1024;
    }


    http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    # access_log /var/log/nginx/access.log main;

    sendfile on;
    #tcp_nopush on;

    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf; # server单独配置
    }

    /home/nginx/conf.d目录创建eladmin.conf,配置 server

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    server
    {
    listen 80;
    server_name 域名/外网IP;
    index index.html;
    root /usr/share/nginx/html/eladmin/dist; #dist上传的路径

    # 避免访问出现 404 错误
    location / {
    try_files $uri $uri/ @router;
    index index.html;
    }

    location @router {
    rewrite ^.*$ /index.html last;
    }

    # 接口
    location /api {
    proxy_pass http://172.17.0.1:8000;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }

    # 授权接口
    location /auth {
    proxy_pass http://172.17.0.1:8000;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }

    # WebSocket 服务
    location /webSocket {
    proxy_pass http://172.17.0.1:8000;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }

    # 头像
    location /avatar {
    proxy_pass http://172.17.0.1:8000;
    }

    # 文件
    location /file {
    proxy_pass http://172.17.0.1:8000;
    }
    }
  5. 前端启动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    docker run -d \
    --name nginx --restart always \
    -p 80:80 -p 443:443 \
    -e "TZ=Asia/Shanghai" \
    -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /home/nginx/conf.d:/etc/nginx/conf.d \
    -v /home/nginx/logs:/var/log/nginx \
    -v /home/nginx/cert:/etc/nginx/cert \
    -v /home/nginx/html:/usr/share/nginx/html \
    nginx:alpine

第二种:componse编排

用配置文件一次编排应用所需所有镜像。