Docker学习篇
Docker学习篇源于自己第一次部署上线前后端分离的项目时,所采用的方法。途中遇到的问题以及是如何解决,我将在这篇博客有所展示,希望对过来阅读的你们有些许所获和学习。那么,废话不多说,赶紧上车!
Docker初认识
- Docker的概念
什么是Docker?看这一篇干货文章就够了! - 知乎 (zhihu.com)
说白了,从上述文章我们可以知道:Docker是一种现代流行的容器技术的一种实现,是可以极简缩小版的操作系统(又或是虚拟机)。兼具操作系统的功能,又能轻量化移植(clone),提高项目部署效率,降低部署的难度。实现“Build once, run everywhere”,这简直不要太香!
Docker初体验
!!!前提:你的虚拟机或者服务器上面得安装Docker,这里我是默认你们是有的。
要想使用Docker的前提,我们得需要知道container、image和Dockerfile的关系,构建镜像命令和Dockerfile相关语句以及如何编写优雅的Dockerfile(重点)
0. 准备工作
安装Docker
- 虚拟机——[虚拟机VMware安装docker完成个人web项目部署_docker vmware用哪个-CSDN博客](https://blog.csdn.net/weixin_43012300/article/details/107304808#:~:text=虚拟机VMware安装docker完成个人web项目部署 1 1.安装并使用虚拟机VMware 2 2.在虚拟机上安装Linux系统centos7 3 3.安装docker 4,7 8.退出并重启容器 [docker restart 7e132767c055] 8 9.访问项目 更多項目)
- 服务器——推荐宝塔,无脑安装docker。
1. 前置知识
- container (容器)
- image (镜像)
- Dockerfile
Docker中容器和镜像的关系梳理_docker一个容器运行多个镜像-CSDN博客
因此我们可以知道,image(镜像)是通过Dockerfile构建出来的,该过程实例化出了container(容器)。即一个容器对应一个镜像,创建了镜像,就也创建了容器!
容器是进程,镜像是文件
。
2. Dockerfile编写
2.0 注意
- 在前后端写Dockerfile文件,
名字千万不能错
!只能是Dockerfile!!!只能是Dockerfile!!!只能是Dockerfile!!!(重要的事情说三遍)要不然docker执行Dockerfile会报错的。 - 指令必须保持全部大写,要不然汇报语法错误!
2.1 常见命令
命令 | 功能 | 备注 |
---|---|---|
FROM | 拉取容器的基本镜像 | 必须是Dockerfile的第一句!!! |
COPY | 复制本地文件到容器的工作目录 | 明确src和dest传递参数 |
ADD | 添加本地文件到容器的工作目录 | 明确src和dest传递参数 |
WORKDIR | 指定容器的工作目录 | 可写在COPY和ADD前面,也可以在它们后面 |
CMD | 执行容器的指令 | 命令根据前后端项目而定 |
2.2 ADD和COPY的异同点
-
异:其实ADD命令远不止上面表格所说的那样,只是添加的功能。它是兼具COPY功能和解压文件的功能的。因此在传送到指定位置时,想省去文件解压还要传递文件的麻烦事,那么ADD是最优选择!当然你也可以先解压,然后再COPY过去,不过这就多走了一步啦!
-
同:传递参数都是src和dest,那么src是根据构建的上下文的规则,那这是什么意思呢?其实说白了就是你Dockerfile文件存放在你项目里的位置。例如:Java项目Dockerfile是存在放在项目的根目录,那么你想把跟Dockerfile文件同级目录的pom.xml添加到容器当中,那么
ADD pom.xml 容器的工作目录下
这就是构建的上下文,其实就是你项目的上下文。要不然在执行Dockerfile文件会报找不到添加文件目录而报错的。COPY指令同理。详情可以参见这篇博客:Dockerfile 中的 COPY 与 ADD 命令 - sparkdev - 博客园 (cnblogs.com)
2.3 WORKDIR
容器的工作目录,就是将运行image实例化的容器存放的地方,该语句可以放在执行COPY和ADD指令前面,也可以在它们后面,不同的是dest参数要进行变化。例如:
# 1. 在前面的写法
WORKDIR /app # 指定工作目录为容器的/app
COPY pom.xml . # 复制到容器目录的根目录下 即/app
# 2. 在后面的写法
COPY pom.xml /app/
WORKDIR /app
2.4 FROM
这是Dockerfile必不可少的指令,也是必须置于文件的第一句!用来拉取基础镜像。
可以直接拉虚拟机的镜像,也可以Java镜像,也可以maven镜像都是可以的。
2.5 Dockerfile范例
何为优雅的Dockerfile呢?就是缩短构建(build)时间,尽可能短的完成项目镜像的制作。
技巧
- 不需要maven拉取项目需要的jar包(对于Java项目)
- 自己手动书写配置项目启动基础环境配置(对于Java项目,最基本是要Java环境)
普通版:
FROM maven:3.5-jdk-8-alpine as builder # 拉取maven镜像 为mvn package做准备
# Copy local code to the container image.
WORKDIR /app
COPY pom.xml . # 复制到根目录下(/app)
COPY src ./src #根目录下的src,即 /app/src
# Build a release artifact.
RUN mvn package -DskipTests # 自动拉取项目所需要的所有jar包,从中央仓库获取
# Run the web service on container startup.
CMD ["java","-jar","/app/target/user_center-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]
优化版:
FROM centos # 最最基本的镜像基础
COPY target/user_center-0.0.1-SNAPSHOT.jar /app/user_center-0.0.1-SNAPSHOT.jar # 减少maven拉取jar包的时间 直接复制jar进入到容器的工作目录当中
ADD jdk-8u381-linux-x64.tar.gz /app/
WORKDIR /app
#5.配置环境变量
ENV JAVA_HOME=/app/jdk1.8.0_381
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
EXPOSE 8081
CMD ["java", "-jar", "user_center-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]
3. Docker常见指令
学习网站:Docker Compose | 菜鸟教程 (runoob.com)
终端提示:docker --help
这里就介绍我部署上线项目,最常用到的命令。
-
docker build
-t (为构建的镜像指定名称和标签。通常tag为了标记镜像的版本号)
-
docker run
-d (以后台模式运行容器,大多数项目都是以后台的形式运行)
-p : (指定项目启动端口和容器的启动端口,一般都是保持一致)
-v :(将主机上的目录或文件挂载到容器中。这样可以在容器和主机之间共享文件。)
–name (指定容器的名称)
-
docker ps
查看正在运行的容器container的信息
-a (查看所有创建过的容器)
-
docker images
查看已经创建的镜像的信息
-
docker kill
后面加上需要停止的容器id,或者是该容器的名(name)
-
docker logs
查看某容器的运行日志,后面跟上容器id,或者是该容器名(name)
-
docker rmi/docker rm
前者删除镜像、后者删除容器
-
docker port
查看容器的端口映射情况