一、docker是什么
是一款开源的应用容器引擎,由Docker Inc.公司开发,自推出以来迅速成为云计算领域中的关键技术之一。Docker利用Linux的内核特性如cgroups(Control Groups)和namespaces实现了资源隔离与限制,可以在同一主机系统上轻松地创建和管理多个容器实例,每个容器都像是一个轻量级的、独立运行的虚拟环境。
二、docker核心部分
-
Docker Client(客户端):用户通过Docker CLI(命令行界面)与Docker守护进程交互,发送构建、运行、停止容器等相关命令。
-
Docker Daemon(守护进程):在宿主机上持续运行的后台服务,负责接收客户端命令,管理容器、镜像和网络等核心组件。
-
Docker Image(镜像):一种分层结构的只读模板,包含了运行应用程序所需的所有依赖文件和配置信息。用户可以根据基础镜像创建新的定制镜像,或者从Docker Hub这样的镜像仓库拉取现成的镜像。
-
Docker Container(容器):基于镜像运行的可执行实例,容器之间相互隔离,各自拥有独立的文件系统、网络空间以及其他资源,可以快速启动、停止和迁移。
三、docker常用命令
使用前先安装docker
yum install docker
1.启动docker
systemctl start docker
2.关闭docker
systemctl stop docker
3.重启docker
systemctl restart docker
4.设置docker开机自启
systemctl enable docker
5.查看docker运行状态
systemctl status docker
6.查看docker版本
docker version
7.docker帮助命令
docker help
也可以指定帮助指令
如不知道pull拉取后边的参数,可以
docker pull --help
8.查看本机已经安装的镜像
docker images
9.搜索镜像
docker search 镜像名
10.拉取镜像
docker pull 镜像名(默认拉取最新版)
docker pull 镜像名:tag(tag是拉取指定版本)
11.运行镜像
docker run 镜像名
docker run 镜像名:tag(指定版本)
12.删除镜像(删除前要确认当前镜像有没有被任何容器使用)
删除镜像,只删除一个(-f是强制删除)
docker rmi -f 镜像名或镜像id
删除多个镜像:其镜像ID或镜像用用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
docker image rm 镜像名称/镜像ID
13.保存镜像:
将镜像保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像
例如:docker save tomcat -o /opt/myimg.tar
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
14.加载镜像:任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像
docker load -i 镜像保存文件位置
例如 docker load -i nginx.tar 他会将nginx解压为一个镜像,前提是nginx是一个镜像的压缩包
docker在容器中的命令:
15.列出正在运行的容器列表
docker ps
docker ps -a(查看所有容器,包括死掉的)
16.运行一个容器 重点
-it 表示 与容器进行交互式启动
-d 表示可后台运行容器 (守护式运行)
--name 给要运行的容器 起的名字
/bin/bash 交互路径,/bin/bash
: 这指定了容器启动后运行的命令。容器启动后会运行一个bash
shell。这意味着你可以进入容器内部并执行命令。
docker run -it --name 要取的别名 镜像名:Tag /bin/bash
例如:docker run -it --name tomcat1 tomcat:3.0.1 /bin/bash
给tomcat起别名为tomcat1并指定运行版本和交互路径
17.退出容器
exit
18.停止、重启、杀死容器
docker stop、restart、kill 容器ID/容器名
19.从主机拷贝文件到容器上
docker cp 1.txt mycontainer:/1.txt
20.--rm
在Docker中, --rm 标志用于在容器停止后自动删除容器。当使用该标志运行容器时,容器停止运行后会立即被删除,释放相关的资源。这对于临时性的容器和一次性任务非常有用,可以避免手动删除容器的麻烦。
21、进入运行时的容器内部
docker exec -it 容器名/容器ID /bin/bash
在启动的时候就以交互式的形式进入容器内部:
docker run -it -d --name=mynginx -p 90:80 nginx /bin/bash
这段的意思是在容器启动的时候就进入容器内部
-it:以交互式运行
-d:以守护式运行
--name:指定别名
-p:指定端口,冒号前是物理机的端口,冒号后是虚拟机的端口,如果我们要在物理机访问nginx,就用冒号前的90端口访问
/bin/bash:交互的路径
22、查看容器日志:
-f 参数跟踪日志
--tail=要查看末尾多少行
docker logs -f --tail=5 容器ID
查看日志后五行
23、设置容器自启动 --restart=always
docker run -d -p 8888:80 --restart=always --name my-nginx nginx
24、数据挂载
就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!
参数:-v 宿主机文件存储位置:容器内文件位置
冒号前宿主机文件存储位置,冒号后容器文件存储位置
docker run -d --name mysql-test -p 3306:3306 -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
25、指定容器连接网络 --network=host
docker run -d --network=host --name=nginx -v /opt/wms-web/:/usr/share/nginx/html/ nginx
1. bridge (默认模式):在桥接网络中,每个容器都分配了一个IP地址,并且可以通过ip相互访问。这是最常用的网络模式,适用于大多数应用程序。(类似于虚拟机有自己的网卡,有独立的网络命名空间)
2. host :在主机网络模式下,容器与主机共享网络命名空间,即容器使用主机的网络栈。这使得容器可以直接使用主机的网络接口,无需进行端口映射。(没有独立的网络命名空间,使用主机的)
3. none :在无网络模式下,容器不会连接到任何网络。这意味着容器无法通过网络与其他容器或外部进行通信。这种模式适用于某些安全性要求较高的容器。
4. container:<name|id> :在容器网络模式下,容器与另一个指定容器共享网络命名空间。这意味着两个容器可以通过本地主机进行通信,就像它们在同一主机上一样。
重点中的重点dockerfile文件
FROM:指定容器基础镜:FROM redis
WORKDIR:设置docker容器工作目录
WORKDIR /opt(我们以后默认把工作目录设置在opt里面)
复制文件到镜像COPY/ADD
COPY:
- 只支持从本地文件系统复制文件。
- 不支持压缩或解压文件。
- 不支持从URL下载文件。
- 适用于复制文件、目录等。
ADD:
- 支持从URL下载文件。
- 自动解压 tar 文件(如果目标路径以
.tar
结尾)。 - 支持从本地文件系统复制文件。
- 可能会导致意外的行为,如自动解压非预期的文件。
建议用COPY因为简单
RUN:运行命令
编译java类 RUN javac App.java
CMD和ENTRYPONIT
区别:
CMD指定容器启动后的默认命令,可以被docker run命令后边的参数覆盖
ENTRTPONIT类似于CMD,但是不能被docker run命令后边的参数覆盖
CMD ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。
dockerfile文件格式;
# 基础镜像
FROM openjdk:8
# 作者
LABEL maintainer="heimi"
# 工作目录,因为我们已经指定了工作目录为opt,所以在执行build的命令的时候我们只需要用“.”指定当前目录就可以确定我们dockerfile的文件路径了。
WORKDIR /opt
# 复制文件,copy . 的意思是复制当前opt目录下的所有文件
COPY . /opt/
# 编译java类
RUN javac App.java
# 运行java类
#CMD ["java", "App"]
ENTRYPOINT [ "java", "App" ]
构建镜像时,通过在命令行中运行 docker build
并指定Dockerfile所在的路径来创建镜像:
docker build -t myapp:v1 .
-t myapp:v1 .:意思是指定我们镜像的名字叫做myapp版本号为v1 后边 “.” 的意思是指定当前文件
因为我们在WORKDIR里边已经指定了工作文件,我们在这里可以直接用.指定我们当前所在文件是我们的工作文件。
四java项目基于docker发布
1.先打包应用,找到我们本机的jar文件,把它复制到我们的服务器里边,也就是那个wms-app里面,注意一定要注意dockerfile文件里的wms-app文件千万不要吧“-”写成“_”,会报错
2.新建dockerfile文件
FROM openjdk:8
#设置工作目录
WORKDIR /workspace
#COPY *.jar app.jar
ADD *.jar app.jar
#配置容器暴漏的端口
EXPOSE 8080
#查看是否已经copy进去
RUN ls
#运行jar包
#CMD ["java","-jar","app.jar"]
ENTRYPOINT ["java","-jar","app.jar"]
-
java
:- 这是 Java 虚拟机(JVM)的可执行文件名,它负责运行 Java 应用程序。
- 当你运行一个包含 Java 代码的 Docker 容器时,
java
命令告诉容器使用 Java 虚拟机来执行后续的命令。
-
-jar
:- 这是一个 JVM 参数,用于指定接下来的参数应该被视为一个 JAR 文件,并启动该 JAR 文件作为一个应用程序。
- 在这种情况下,它告诉 JVM 接下来的参数 (
app.jar
) 是一个可执行的 JAR 文件。
-
app.jar
:- 这是指包含 Java 应用程序的 JAR 文件的名称。
app.jar
必须存在于容器的文件系统中,通常是在/app
或/opt/app
等目录中。- 这个 JAR 文件应该是自包含的,意味着它包含了所有必要的依赖项,并且有一个主类定义了
main
方法。
五、Vue前端项目打包
1.第一步先编译打包,通过输入npm run build命令打包
在我们VSCode的文件目录中会出现一个dist文件,这个就是我们打包过的项目;
如果打包出错了,那就是我们在package.json文件的build属性是"vue-tsc -b && vite build"
ts表示typescript,c是check意思是打包的时候检索我们代码的格式,将其删除就好,改为只有
"vite build"
2.将dist文件拷贝到虚拟机的/opt目录下,opt目录是我们指定的工作目录
3.先切换到指定的工作目录,创建Dockerfile文件并编辑
Dockerfile内容:
FROM nginx
# 先删除本地的default.conf
RUN rm /etc/nginx/conf.d/default.conf
# 把改过的default.conf复制到nginx的conf.d目录下
COPY ./default.conf /etc/nginx/conf.d
#拷贝dist文件到/usr/share/nginx/html
COPY ./dist /usr/share/nginx/html
default.conf:里的内容,这个文件在etc/nginx/conf.d里
upstream wms-web {
server 192.168.21.67:8080 ;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
//#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api/ {
// # 当请求以 /api/ 开头的时候,将请求转发到 http://192.168.21.67:8080/api/
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization';
proxy_pass http://wms-web ; #可以配置多个下游服务,
// 具有负载功能,这里的wms-app是上面定义的upstream的名称,要名称保持一致
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
①. root:设置静态根目录为 /usr/share/nginx/html
②. index:设置目录的默认文件为 index.html 、index.htm
③. try_files:设置文件查找规则为 $uri $uri/ /index.html。即3个规则,先从 $uri 查找,再从 u r i / 目录中查找,最后查找 / i n d e x . h t m l 。
4.构件镜像
docker build -t wms-web:v1 .
5.运行
docker run -it -p 8086:80 wms-web:v1