前言
在当今的软件开发领域,容器化技术已经成为了部署和管理应用程序的重要手段。Docker作为容器化技术的代表,它通过轻量级、可移植的容器来简化应用的部署和运维过程。这篇文章主要是记录自己学习的过程,如有错误之处可以指出讨论修改。
准备工作
需要有一个前端项目
需要有一个后端项目
这两个项目之间在本地可以正常运行
一台部署项目的服务器
一、安装docker
1.安装docker依赖环境
yum -y install yum-utils device-mapper-persistent-datalvm2
2.设置下载Docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装docker
#将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度
#centos 8的命令。根据自己服务器的版本选择对应的命令
#yum makecache fast
#centos 7的命令。根据自己服务器的版本选择对应的命令
dnf makecache
#提高安装速度以后,安装docker相关的(docker-ce 社区版 而ee是企业版)
yum install docker-ce docker-ce-cli containerd.io
4.启动docker,并设置为开机自动启动
#启动docker
systemctl start docker
#设置开机自启动
systemctl enable docker
5.测试是否安装成功
docker version
出现以下提示则安装成功
6.设置国内镜像
提醒:如果你的网络访问外网也很快则可以不设置,或者公司内部有自己的镜像源,可以根据自己的实际需求调整配置。设置国内镜像主要是为了解决docker拉取外国官方镜像超时的问题,设置为国内的镜像源可以提高拉取的速度
找到etc/docker/daemon.json文件并修改,添加代码如下(如果在/etc/docker下找不到daemon.json文件,可以自己新建对应的文件夹和文件。cd切换到/etc/docker目录下,使用touch命令创建)
#创建目录
sudo mkdir -p /etc/docker
#创建文件并设置国内镜像源
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://ox288s4f.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]
}
EOF
#重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
二、安装nginx
1.拉取nginx镜像
# 拉取nginx镜像
docker pull nginx
# 查看镜像
docker images
2.创建并运行Nginx容器
# 创建容器
docker run -d --name nginx -p 80:80 nginx
# 查看正在运行的镜像
docker ps
# 查看是否运行成功
curl localhost:80
#命令详解:
# docker run 启动一个镜像
# -d 表示后台允许
# --name nginx 表示为当前容器起一个别名
# -p 80:80 表示将本机的80端口映射到nginx镜像的80端口
3.扩展
以下内容为根据项目要求,把nginx配置文件放到容器外面,方便查看和修改,如没特殊要求,可跳过以下操作。
3.1.进入到nginx容器内部
docker exec -it nginx /bin/bash
命令详解:
# docker exec 在运行的容器中执行命令
# -i 以交互模式运行容器,通常与 -t 同时使用;例如-it
# -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;例如-it
# nginx 容器名
# /bin/bash 其实就是表示载入容器后运行bash(命令语言解释程序), 因为docker中必须要保持一个进程(运行的程序)的运行,要不然整个容器就会退出,所以说,bash就担任起了docker中运行的那个进程的角色!
#而/bin/bash则是bash在linux下的位置
3.2.查询容器中配置文件存放位置
# 在容器中查询出nginx的相关配置文件存放位置
whereis nginx
# 退出容器
exit
3.3.创建管理目录并挂载
# 创建对应的配置文件
mkdir -p /home/yooyee/base/nginx
mkdir -p /home/yooyee/base/nginx/www
mkdir -p /home/yooyee/base/nginx/conf
mkdir -p /home/yooyee/base/nginx/logs
# 将容器中的相应文件copy到刚创建的管理目录中
docker cp 8e645f97196a:/etc/nginx/nginx.conf /home/yooyee/base/nginx/
docker cp 8e645f97196a:/etc/nginx/conf.d /home/yooyee/base/nginx/conf/
docker cp 8e645f97196a:/usr/share/nginx/html/ /home/yooyee/base/nginx/www/
docker cp 8e645f97196a:/var/log/nginx/ /home/yooyee/base/nginx/logs/
# 停止Nginx容器,8e645f97196a表示容器的ID,即:CONTAINER ID
docker stop 8e645f97196a
#移除容器
docker rm 8e645f97196a
#移除和停止容器,那个容器id也可以换成容器名
3.4.再次启动容器并作目录挂载
#再次启动容器并作目录挂载
docker run --name nginx \
-p 80:80 \
-v /home/yooyee/base/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/yooyee/base/nginx/www/:/usr/share/nginx/html/ \
-v /home/yooyee/base/nginx/logs/:/var/log/nginx/ \
-v /home/yooyee/base/nginx/conf/:/etc/nginx/conf.d \
--privileged=true \
-d nginx
# 详解
# -p 80:80 端口进行映射,将本地 80端口映射到容器内部的 80 端口
# -v 将宿主机上的对应目录挂载到容器内的对应目录
# --privileged=true 赋予容器扩展的权限,使得容器内的进程可以执行一些需要特殊权限的操作
# -d 后台运行
三、安装mysql
1.拉取mysql镜像
#默认最新版本
docker pull mysql
#指定版本号
#docker pull mysql:xxx
#查看镜像
docker images
2.启动mysql容器
#镜像部署为容器
docker run --name mysql -d -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
#查看运行中的容器
docker ps -a
#命令解释
# --name 自定义容器名称
# -d 后台运行
# -p 指定映射的端口号( 宿主机端口号 : 容器内端口号)
# -e MYSQL_ROOT_PASSWORD=root账号的数据库密钥
# 最后面那个mysql是镜像名
3.验证是否成功
#查看运行中的容器
docker ps -a
4.扩展
以下内容为根据项目要求,把mysql配置文件放到容器外面,方便查看和修改,如没特殊要求,可跳过以下操作(建议执行以下步骤把配置文件挂载到服务器,防止容器挂了导致数据丢失)。
4.1.移除mysql容器
# 停止mysql容器
docker stop mysql
#移除容器
docker rm mysql
4.2.创建对应目录
# 创建对应的配置文件
mkdir -p /home/yooyee/base/mysql
mkdir -p /home/yooyee/base/mysql/conf
4.3.在conf文件夹下添加一个my.cnf文件
# my.cnf文件内容
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
#datadir=/var/lib/mysql
sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
character-set-server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
default_authentication_plugin=mysql_native_password
4.4.启动容器,重新验证
docker run -d \
--name mysql \
-p 33061:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /home/yooyee/base/mysql/data:/var/lib/mysql \
-v /home/yooyee/base/mysql/conf:/etc/mysql/conf.d \
mysql
三、部署后端项目
1.后端打jar包
2.编写DockerFile
#工程java版本
FROM java:openjdk-8-jdk
#作者
MAINTAINER yooyee
#设定时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
#将所有的jar包整合为app.jar
COPY *.jar /app.jar
#执行jar包
ENTRYPOINT ["java","-jar","app.jar"]
3.把jar包和DockerFile放到服务器的某个目录
注意:这两个文件必须放在同一个目录里面
4.构建镜像
# . 点千万别漏了,这里取名镜像为practice_serve_images,可以随便取名!
docker build -t practice_serve_images .
#查看镜像
docker images
5.创建容器并运行
#镜像运行为容器
docker run -d -p 8686:8088 --name practice_serve practice_serve_images
# 查看正在运行的容器
docker ps -a
# 命令详解
# 将宿主机8686端口映射到容器8088端口
# practice_serve为自定义容器名字
# practice_serve_image是镜像名字
# 8088是后端项目实际访问的端口,对应项目配置文件设置的端口
# 注意端口间的关系,否则会出现访问404的情况
6.测试接口
四、部署前端项目
1.打包Vue工程
2.编写default.conf和Dockerfile文件
#default.conf文件
server {
listen 80;
server_name ip地址; # 修改为docker服务宿主机的ip
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
location /api {
proxy_pass http://ip地址:后端服务端口号/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#Dockerfile文件
# 基础镜像使用Nginx
FROM nginx
# 作者
MAINTAINER yooyee
# 添加时区环境变量,亚洲,上海
ENV TimeZone=Asia/Shanghai
# 将前端dist文件中的内容复制到nginx目录
COPY dist /usr/share/nginx/html/
# 用本地的nginx配置文件覆盖镜像的Nginx配置
COPY default.conf /etc/nginx/conf.d/default.conf
# 暴露端口
EXPOSE 8687
3.上传文件到服务器的同一个文件夹当中
4.构建前端镜像
# . 点千万别漏了,这里取名镜像为practice_page_images,可以随便取名!
docker build -t practice_page_images .
#查看镜像
docker images
5.创建容器并运行
#镜像运行为容器
docker run -d -p 8687:80 --name practice_page practice_page_images
# 查看正在运行的容器
docker ps -a
#将8687端口映射到80端口,端口记得放开
# practice_page为自定义容器名字
# practice_page_images是镜像名字
# 8687为前端访问的界面地址栏的那个端口,
# 80为通过nginx配置端口,通过80端口转发到后端的实际接口
6.测试界面是否能正常访问
至此,完成docker方式的前后端项目部署。