安装docker
先在服务器安装docker,如果是云服务器可以在装系统指定安装docker就不用再安装docker了
如果没安装docker的可以看下面链接步骤安装
现在安装好docker之后,我们开始部署。
首先说一下docker安装东西的逻辑:
首先docker需要有镜像在服务器里面,再通过镜像来安装容器,一个镜像可以安装多个容器。他们之间互相独立的,并且相互之间分配了不同的虚拟ip。
查看镜像
首先拿mysql举例:首先查看镜像存在mysql吗:docker images查看所有存在镜像,假如我没有mysql 我就需要去拉取mysql镜像,前提是联网哈。
搜索镜像
先用docker search mysql 查看并选择合适的版本安装
拉取镜像
再使用docker pull mysql5.7,拉取镜像好之后我们使用docker images 查看所有镜像(也可以直接使用docker pull mysql 默认会安装最新的mysql)
我们再直接
创建mysql容器
docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
这个时候我们就可以进行数据库连接了,我用的是云服务器,可以直接通过ip密码来连接了,账号是默认的root
下面是一些
参数说明
-p端口映射,因为docker的容器是封闭的,需要和外界映射
-name 知道容器名称
-e 环境名称,不同的镜像不一样,比如mysql设置密码就是使用这个MYSQL_ROOT_PASSWORD=123456
-d 后台运行
这就是最简单的docker部署mysql,部署其他的redis,nacos等同理
部署redis,nginx等就不说了,和mysql雷同,只是启动容器命令稍微不一样
拉取redis镜像就不说了,和mysql一样
下面是安装redis容器
docker run -id --name=myredis -p 6379:6379 docker.io/redis:latest --requirepass 123456
docker ps
查看容器名为myredis有没有安好
容器编辑
docker exec -it my-container /bin/bash
容器网络互联
这里有一个网络的问题,就是上面说的每个容器相互独立,是不能互相ping通的,
所以我们就要使用docker network create net1 来创建网络net1为网络名
然后我们可以使用docker connect net1 mysql来让我们的mysql能连接net1网络
使用命令docker connect net1 redis 来让我们的redis能连接net1网络,
使用命令查看我们的net1里面有没有我们的mysql,在最下面的containers有
说明我们的mysql连接进去了。
这个时候着两个容器就可以处于同一个网络之下了。可以ping通了。但是这个时候你可能会问,这有什么用?确实没什么用,但是项目容器如果要访问mysql的话可以通过假如net1网络直接连接。虽然好像直接连接ip也可以的。
创建容器指定网络
我们连接网络可以直接在容器创建的时候就去指定网络 -network net1 ,这样就不用再来连接的麻烦了。
我们可以先把mysql容器删除。删除的步骤一般是先停掉容器 docker stop 容器名/容器id,然后再删除容器,docker rm 容器名/容器id,当然也可以暴力删除,docker rm -f 容器名/容器id
然后重新部署容器就行了,下面是部署的代码,竖着写还好看点捏!
docker run -d\
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
-network net1 \
mysql:5.7
参数意思
-e TZ=Asia/Shanghai \指定时区
-v 挂载
数据挂载
这里多了一个挂载,那什么又是挂载呢?
docker每个容器是分配在docker要想进入管理配置文件很麻烦,需要使用参数
docker exce -it 容器名称/id bash
但是进去之后由于是在docker里面。就用不了一些常见的编辑功能比如vim等
,所以我们就要把他挂载出来。做一个双向绑定,没错就是vue的双向绑定概念。
绑定之后我们只需要在我们linux文件下修改文件,docker内部文件也会受到改变,我们到时候改配置文件就只需要在挂载的linux里该就可以了。
-v /root/mysql/data:/var/lib/mysql \
意思是把宿主机的/root/mysql/data文件和docker的/var/lib/mysql文件夹做绑定。后者我们去docker官网查询。
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
绑定初始化文件夹,绑定配置文件夹。
这就是文件的挂载
项目部署
后端部署
忙活这么多就是为了项目部署。
我们首先第一步是需要编写dockerfile文件的
这是文件内容
基础镜像
FROM openjdk:11.0-jre-buster
设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/TZ /etc/localtime && echo TZ > /etc/timezone
拷贝jar包
COPY docker-demo.jar /app.jar
入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
入口就是java的启动命令,一般最多再加一个jvm参数
然后我们把项目jar包和dockerFile放到docker里面
然后我们启动命令先创建镜像然后就可以直接让他创建容器启动了
//构建docker镜像
docker build -t hmall .
.代表的是dockerfile文件的路径 . 代表当前文件夹下
//根据镜像构建启动容器
docker run -d --name docker-demo -p 8080:8080 --network net1 hmall
然后使用docker logs docker-demo查看我们的启动情况
看到在运行这样就是启动成功的。
前端部署
这只是后端部署下面我们来看前端部署,前端一般是部署到nginx上面的,如何拉取nginx镜像就不说了。我们直接创建 nginx容器,参数都是之前提到的参数,挂载配置文件,端口映射,网络接入
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network net1 \
nginx
然后我们需要到/root/nginx/nginx.conf改配置文件内容,改成我们需要的内容,端口怎么映射啊之类的。
-v /root/nginx/html:/usr/share/nginx/html \就是把我们的前端项目文件挂载到/root/nginx/html这里就行,我们把前端文件放到这里面/root/nginx/html就行了。
这样就算是部署好了,但是部署有点繁琐。于是就有了dockerCompose部署。
使用dockerCompose部署:
上面我们是一个镜像一个镜像的配置,好累呀。
我们可以直接写一个dockerCompose文件,把所有的配置信息都写上去,这样就可以进行一键部署了,比上面简单多了。参数大致是一样的,只是名称变了,我们执行命令docker compose up -d就部署好了,我们查看docker ps是否有容器运行,有就说明成功了捏。
version: "3.8"
services:
mysql:
image: mysql:5.7
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
然后前后端就部署完成了捏。虽然写的有点模糊,但是大致步骤就是这样,有什么问题希望能提出来。