docker和项目部署
docker可以帮助项目部署,同样比较常见的K8S是容器编排技术。·不同操作系统下其安装包、运行环境是都不相同的!如果是手动安装,必须手动解决安装包不同、环境不同的、配置不同的问题!而使用Docker,这些完全不用考虑,因为Docker会自动搜索并下载镜像(不是安装包)。镜像中不仅包含了服务本身,还包含了其运行所需要的环境、配置、系统级函数库。因此它在运行时就有自己独立的环境,就可以跨系统运行,也
一、docker介绍
·docker可以帮助项目部署,同样比较常见的K8S是容器编排技术。
·不同操作系统下其安装包、运行环境是都不相同的!如果是手动安装,必须手动解决安装包不同、环境不同的、配置不同的问题!而使用Docker,这些完全不用考虑,因为Docker会自动搜索并下载镜像(不是安装包)。镜像中不仅包含了服务本身,还包含了其运行所需要的环境、配置、系统级函数库。因此它在运行时就有自己独立的环境,就可以跨系统运行,也不需要手动再次配置环境了。这套独立运行的隔离环境我们称为容器。因此,Docker安装软件的过程,就是自动搜索下载镜像,然后创建并运行容器的过程。
·镜像英文是image,容器英文是container。容器会隔离各个进程的运行环境,互不干扰。
Docker官方提供了一个专门管理、存储镜像的网站,并对外开放了镜像上传、下载的权利。
·每个容器有自己的独立的内存空间,独立的文件系统,甚至有独立的网络空间,有自己的IP地址(不同于宿主的IP地址,对宿主外部屏蔽),所以只能连接宿主的端口,让宿主映射到容器的端口)。
·镜像有两种创建方式:去官网拉取,自己制作(后面我的项目部署就是基于这个方式)
·例子,docker创建并运行mysql容器:
二、docker常见命令
docker pull拉取镜像
docker push推送镜像到DockerRegistry
docker images查看本地镜像
docker rmi删除本地镜像
docker run创建并运行容器(不能重复创建)
docker stop停止指定容器
docker start启动指定容器
docker restart重新启动容器
docker rm删除指定容器
docker ps查看容器
docker logs查看容器运行日志
docker exec进入容器,因为本来容器是隔离的
docker save保存镜像到本地压缩文件
docker load加载本地压缩文件到镜像
docker inspect查看容器详细信息
注意区分:run创建并运行容器,start运行容器;镜像和容器间的区别;
·测试发现,容器确实准备了系统函数库,但是只配备了应用运行必备的函数。就算宿主安装了vim等库,容器中仍然需要重新安装。
·在docker里启动的mysql服务不能通过mysql -v来查看版本,而需要在前面加上docker变成 docker mysql -v
三、数据卷
还可以自己指定数据卷挂载的位置。
四、自定义镜像制作
自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。部署java应用需要4步,如果要让别人拿到我们的镜像直接就能用,我们需要在镜像内部替代这4步骤。镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。
制作镜像对于我来说还是太难,好在Docker提供了自动打包镜像的功能。只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可,而这种记录镜像结构的文件被称为Dockerfile。常用指令:
有人提供了基础的系统+JDK环境,可以此基础上制作java镜像:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区东8区,方便查看日志
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"]
五、docker网络
查看mysql容器的详细信息,发现IP为172.17.0.2,网关为172.17.0.1
查看nginx容器的详细信息,发现IP为172.17.0.3,网关为172.17.0.1
查看dd容器的详细信息,发现IP为172.17.0.4,网关为172.17.0.1
我们发现前面启动的容器的ip地址在同一个网段内,且有相同的网关,也就是可以相互访问,怎么做到的呢?查阅资料发现,docker安装的时候会创建一个172.17.0.1/16的网卡充当网桥,所有和它连上的容器都会依次分配一个IP。
于是就产生了一个问题,容器重新启动,ip地址就会变动,后面我部署项目的时候,怎么填写连接的套接字呢?
答:可以自定义网络代替之前的172.17.0.1/16,这样就可以通过容器名字相互访问,即便重启,容器名也不会变动。以下是常见命令:
docker network connect hmall mysql --alias db #起别名
docker network connect hmall dd
–在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身;
–在同一个自定义网络中的容器,可以通过别名互相访问;
–也可以在创建容器的时候加上–network 自定义网络名来连接到自定义网络;
–默认网络没有别名功能;
–现在无需记住IP地址也可以实现容器互联了。
六、使用docker进行项目部署
方法一
- 后端部署:
先将项目打包得到jar包,并编写dockerfile文件
将前面两个文件导入Linux 通过docker
bulid命令构建项目镜像 通过docker
run利用镜像创建并启动容器 - 前端nginx部署:
准备好静态资源和配置文件
将前面两个文件导入Linux
下载ngnix镜像
创建容器并完成挂载 - mysql部署:
准备好初始sql语句和配置文件
将前面两个文件导入Linux
下载mysql镜像
创建容器并完成挂载 - 中间件部署…
注意:各个容器需要连接同一个自定义网络,相互之间使用别名访问。
怎么挂载的?创建容器的时候通过参数 -v 宿主挂载目录:容器资源目录来挂载,这样就不用进入容器内部来配置资源和文件了。
项目部署方法二
后面我发现还有更简便的方式:DockerCompose能实现多个相互关联的Docker容器的快速部署。只需编写docker-compose.yml文件就能定义一组相关联的应用容器。编写这个文件过后,我发现基本就是把docker run命令的参数换了个地方合并到了一起。DockerCompose官方文档
编写docker-compose.yml文件如下
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 114514
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: wnl
命令行启动:
docker compose up -d
打开浏览器访问:
更多推荐
所有评论(0)