Docker一文搞懂
[toc]
快速持续集成 弹性伸缩 节省机器资源 容器化
自动化部署软件的方式
什么是docker
理解docker
走进docker
运行hello world
nginx
docker化的java web
1 什么是Docker
1.1docker历史
2013开源
2014.6 v1.0
目前v1.13,托管在GitHub,跨平台
2 理解
装应用的容器,可以把程序放到docker里
1 集装箱
2 标准化 运输方式,存储方式 API接口标准化
3 隔离
解决运行环境不一致的问题(我本地没问题啊) 操作系统 jdk 配置 打包
杀掉死循环服务,
每条服务器执行命令 快速扩展 弹性伸缩变得简单 10台变100台服务器
3 走进docker
3.1运行过程
build 构建镜像
ship :运输镜像 从仓库和主机运输
run:运行
DOCEKER:运行过程:去仓库把镜像拉到本地 ,用命令把镜像运行,变成容器
3.2 镜像(Image)
目的:希望在其他环境运行
不同目录挂到同一个文件
联合文件系统: 实现文件分层 实现镜像存储
镜像存储格式
每层文件系统都只读的
这些文件会被看成同一个目录 相当于一个文件系统引导
应用代码 tomcat jdk 底层是操作系统引导 操作系统 底层软件
3.3 容器(Contains)
容器只有上面一层是可写可读的,其余都是可读的
写镜像文件也可能
写这个文件之前 会把这个文件拷到容器最上层,再修改,
应用读一个文件的时候 从顶层开始查找 ,如果没有再往下读取
同一个镜像可以生成多个容器独立运行
3.4 docker仓库(Repository)
把镜像传到docker仓库,再从目的地拉取
docker自己提供
docker仓库: hub.docker.com
4 安装docker
实践
报错:
解决: 启用或关闭windows功能 开启hype-v 虚拟
restart wsl版本低 需要更新 ,此外windows版本需要适配 可以查看这个图片中的链接
网上其他回答:www.cnblogs.com/h-z-y/p/144… 还没来得及试 上面就解决了
配置源
5 命令
docker pull name
docker images
参考博客: blog.csdn.net/qq_39611230…
菜鸟教程命令连接: www.runoob.com/docker/dock…
docker run image
1 cmd打开命令行
docker --version
2 拉取镜像
docker pull ubuntu //官方镜像
docker pull hub.c.163.com/library/mysql:latest //第三方库名
库名
3 查看镜像
docker image ls
docker images
docker image rm hello-world
4 运行镜像 创建一个新的容器并运行一个命令,从hub下载镜像
docker run hello-world //前台运行
docker run hub.c.163.com/library/nginx //前台运行
docker stop hub.c.163.com/library/nginx //停止 另起一个窗口 ctrl+C 无效呢
docker run -d hub.c.163.com/library/nginx // 后台运行
5 查看容器
docker ps // 正在运行的容器
docker ps -a //全部容器
6 删除容器 删除镜像 注意 先删除容器 再删除镜像 否则无法删除镜像 会报错
Error response from daemon: conflict: unable to delete 2dc68ff797db (must be forced) - image is being used by stopped container fa41f1b98a84
解决:
docker rm fa41f1b98a84 //删除容器
docker rmi 2dc68ff797db //删除镜像
7 启动关闭容器
docker ( container ) start xxx
docker ( container ) stop xxx
docker ( container ) kill xxx //强制关闭
8 进入容器
docker ps 查看容器 选择id进入
docker exec -it 61f2d252a566 bash
9容器制作成镜像
docker commit containsName imageName
镜像打包备份
docker save -o fileName imageName
镜像解压
docker load -i filePath
6 docker 运行Nginx
nginx 持久运行的容器
前台挂起 后台运行
前台ctrl+C前台运行
进入容器内部
网易云镜像中心 c.163.com/hub#/m/home… 账号liuzy111 邮箱qq
命令如上所示
7 docker网络
容器端口可以在容器所在主机运行---端口映射
开放容器端口到主机
网路类型
1 桥接
2 使用主机 ip
3 没网络
端口映射
查看开放端口
查看开放端口:netstat -na|findstr 8080
在cmd环境下,所以要用findstr
主机端口8080,通过网卡来到docker0的网桥,会对端口映射, 映射到容器的80
网桥把请求转发到容器的80 端口,并且把响应返回
-p
8080是主机端口 80是容器端口
docker run -d -p 8080:80 hub.c.163.com/library/nginx
-P
所有监听端口都和主机做映射
开放所有端口映射到一个随机端口
记得docker stop 容器
8 java web应用
1 制作自己的镜像 build
java web运行在tomcat里面 但是运行springboot呢
Dockerfile
docker build
Jpress War包 :www.jpress.io/download
163下载tomcat
包括jdk
Dockerfile
1 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录、以及一个URL标记的文件 拷贝到镜像中。
其格式是: ADD 源路径 目标路径
2
/bin/bash 进入交互模式
tag 版本 imagename 起名
容器开启关闭后数据不删除
数据持久化问题
linux数据挂载 逻辑上独立
卷:volumn挂载磁盘 重新拉去镜像会把这块自动插上
mysql数据重启删除
nginx 前后端分离 想访问后端接口
前端npm打包命令 放在html文件夹里面 conf配置文件
location / 默认访问
不同服务器 js触发跨域 部署+代替执行请求
用自己写的conf文件覆盖 nginx.conf
nginx映射前缀 映射mdop,不是全路径 后端有规范
tomcat不能代理 nginx可以
-
打成jar包 ,添加Dockerfile文件,pom.xml同级别目录
FROM java:8 EXPOSE 8080 ARG JAR_FILE ADD target/${JAR_FILE} /application.jar ENTRYPOINT ["java", "-jar","/application.jar"] #第一行的FROM命令,指定了我们这个镜像基于openjdk这个镜像制作。 # #ADD,把本地目录下target文件夹里打好的jar文件添加到容器里,重命名为app.jar. # ENTRYPOINT 镜像运行的起始点用这种绝对路径:
FROM java:8 EXPOSE 8080 ADD target/application.jar /application.jar ENTRYPOINT ["java", "-jar","/application.jar"] -
cmd切换到此目录
-
docker build -t imageName:latest . -
docker run -d -p 8081:80 application
2 运行自己的容器 run
DockerHub 搜
检测底层镜像
镜像分层
底层有 检测到不用下载
dockerfile文件:
run 这里差8小时 run事件纠正
不然日志事件也是错的
entrypoint
前端打包:
npm run install
dockerfile
在dockerfile文件夹下面cmd运行
FROM nginx:1.18.0
COPY build/ /etc/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
copy 源文件地址 目标地址
dockerfile文件不能向上访问 需要把build放到config里面
COPY build/ /etc/nginx/html
把build文件夹全部复制到 linux文件夹下面的html文件里面