Docker部署环境-前后端分离

566 阅读8分钟

参考文档

Docker学习文档

环境

  • 服务器 CentOS Linux release 7.9.2009
  • Docker 24.0.7
  • 后端 java
  • 前端 vue3
  • 数据库 mysql 5.7.31
  • Nginx 1.20.1
  • redis

linux服务器

yum更新

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

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

命令

firewall-cmd --zone=public --add-port=80/tcp --permanent // 防火墙开放80端口

Docker

安装

// 安装docker
sudo yum install docker-ce docker-ce-cli containerd.io

// 启动docker
systemctl start docker 

配置

修改安装源

  • 创建配置文件daemon.json
mkdir -p /etc/docker

vi /etc/docker/daemon.json // 进入编辑并写入下面内容
  • daemon.json内容
{ 
    "registry-mirrors":["http://hub-mirror.c.163.com"] 
}

docker命令行

systemctl daemon-reload // 重新加载文件 
systemctl restart docker // 重启docker 
systemctl enable docker // 开机自启

镜像命令行

docker images // 查看镜像

docker rmi <image-name> // 删除镜像

docker build -t <image-name> . // 制作镜像

容器命令行

docker ps // 查看正在运行docker容器
docker ps -a // 查看所有容器

docker run -p 8080(宿主端口):80(容器端口)  -d -v 主机路径:容器路径 nginx(容器名称) // 运行容器nginx并映射文件

docker restart <容器name> // 重启容器
docker stop <容器name> // 关闭容器
docker rm <容器name> // 删除容器
docker rm -f <容器name> // 删除正在运行容器
docker-compose down -v //命令清除Docker的缓存。这个命令会删除未使用的镜像、容器以及网络等资源

docker exec -it <mysql_container_id> mysql -u <username> -p <password> < <path_to_sql_file> // 执行命令

docker exec -it <容器name> /bin/bash // 进入到容器环境

exit // 退出容器环境内

docker update --restart=unless-stopped <container_name> // 设置容器开机自动重启

// 复制文件
docker cp 容器名:容器文件路径 主机路径 // 后面路径是要复制到的目标路径
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf // 示例

docker logs --tail 50 <container_id> // 查看输出日志

docker inspect <container_name> // 检查容器配置

docker build -t myimage . // 打包镜像,'.'表示参数'PATH'命令将从当前目录读取构建上下文,即包含 Dockerfile 的同级目录

Dockerfile

  • 配置文件,放到需要创建镜像文件的同级目录下
# 使用官方Nginx镜像作为基础镜像 
FROM nginx:latest 

# 将宿主机上的nginx.conf复制到容器内的/etc/nginx/nginx.conf 
COPY /home/nginx/conf/nginx.conf /etc/nginx/nginx.conf 

# 暴露容器的80端口 
EXPOSE 80 

# 启动容器时自动运行Nginx服务 
CMD ["nginx", "-g", "daemon off;"]
`FROM`:指定基础镜像,后续的指令将基于这个基础镜像进行构建。
`RUN`:在构建过程中执行命令。
`ADD`:将文件或目录添加到镜像中。
`COPY`:将文件或目录从宿主机复制到容器中。
`ENV`:设置环境变量。
`EXPOSE`:指定容器中的端口。
`CMD`:指定容器启动时执行的命令。
`ENTRYPOINT`:指定容器启动时执行的命令,与`CMD`不同的是,`ENTRYPOINT`不会被`docker run`命令覆盖。
`USER`:指定执行后续命令的用户。
`WORKDIR`:指定工作目录。
`VOLUME`:定义容器数据卷
`ONBUILD`:当构建一个被继承的DockerFile时运行命令
`MAINTAINER`:指定维护者信息

打包镜像

docker build [OPTIONS] PATH

docker build -t myimage . // demo '.'表示参数'PATH'命令将从当前目录读取构建上下文,即包含 Dockerfile 的同级目录
# 参数说明
`OPTIONS` 是可选的参数,`PATH` 是指定构建上下文的路径。
下面是一些常用的 `docker build` 命令选项:
-   `-f`或`--file`:指定构建镜像的 Dockerfile 文件名。
-   `-t`或`--tag`:为生成的镜像指定一个标签。
-   `-q`或`--quiet`:以静默模式运行构建过程,减少输出。
-   `-m`或`--memory`:设置构建过程使用的内存限制。
-   `--build-arg`:传递构建时的参数给 Dockerfile。
-   `--cache-from`:从指定的镜像中提取缓存。
-   `--no-cache`:禁用构建缓存

Nginx

文档

安装

docker pull nginx:latest

运行容器

  • 单行
docker run -p 8080:80 --name nginx-8080 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf/conf.d:/etc/nginx/conf.d -v /home/nginx/log:/var/log/nginx -v /home/nginx/html:/etc/nginx/html -d nginx:latest
  • 多行
# 直接复制,会包含'换行符'运行可能出错,建议复制上面'单行'命令
docker run \ 
-p 9002:80 \ 
--name nginx \ 
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ 
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \ 
-v /home/nginx/log:/var/log/nginx \ 
-v /home/nginx/html:/usr/share/nginx/html \ 
-d nginx:latest

image.png

后端java

添加Dockerfile 文件

  • 在 jar 包的同一级文件夹下新建 Dockerfile 文件,文件内容如下
FROM java:8 
VOLUME /tmp 
ADD authority.jar authority.jar 
EXPOSE 8888 
ENTRYPOINT ["java","-jar","/authority.jar"]

生成镜像

docker build -t authority . // 后面'.'代表

运行容器

docker run -d -p 8888:8888 --name java-8888 authority

mysql

安装

docker pull mysql:5.7.31

运行容器

docker run -d --name mysql-3306 -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31

# 参数解析
-   -d: 后台运行容器,并返回容器 ID
-   –name myMysql: 为容器指定一个名称
-   -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-   -v: 绑定一个卷,容器的 /var/lib/mysql 映射到 主机的目录 /data/mysql
-   -e MYSQL_ROOT_PASSWORD=123456: 设置环境变量,密码设置为 123456  
    mysql:5.7.31:使用镜像 mysql:5.7.31

测试连接

docker exec -it <容器name> mysql -u root -p // 进入到myqsl环境

redis

文档

安装

docker pull redis

创建redis配置文件

// 宿主路径 /home/redis/conf/redis.conf
// 对应容器路径 /etc/redis/redis.conf
 
# 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求
bind 127.0.0.1
 
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。
#开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭,设置为no
protected-mode no
 
#redis监听的端口号
port 6379
 
#此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。
#当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。
#在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p
tcp-backlog 511
 
#此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0
timeout 10000
 
#tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。
#检测到对端关闭需要两倍的设置值
tcp-keepalive 300
 
#是否在后台执行,yes:后台运行;no:不是后台运行
daemonize yes
 
#redis的进程文件(容器内需要建立对应路径,报错建议注释掉使用默认)
# pidfile /var/run/redis/redis.pid
 
#指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)
loglevel notice
 
#指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null(容器内需要建立对应路径,报错建议注释掉使用默认)
# logfile /usr/local/redis/var/redis.log
 
 
#是否打开记录syslog功能
# syslog-enabled no
 
#syslog的标识符。
# syslog-ident redis
 
#日志的来源、设备
# syslog-facility local0
 
#数据库的数量,默认使用的数据库是0。可以通过”SELECT 【数据库序号】“命令选择一个数据库,序号从0开始
databases 16

启动容器

docker run  -d -p 6379:6379 -v /home/redis/data:/data -v /home/redis/conf/redis.conf:/etc/redis/redis.conf --name redis-6379 redis

测试

docker exec -it redis-6379 /bin/bash // 进入容器内部
redis-cli
ping
// 显示PONG 成功

遇到问题

  1. 容器内配置nginx反向代理不生效
  • 容器内不能使用localhost127.0.0.1地址,要使用宿主的ip地址
  1. 后端打包生成容器后,出现下面不能访问服务情况的错误
curl: (56) Recv failure: Connection reset by peer 
  • 容器内部抛出的端口要和后端服务的端口保持一致
  1. redis提示连接不上
  • 修改redis相关配置文件,建议直接使用上面提供配置文件测试