Docker将用户程序与所需要调用的系统函数库一起打包,这样程序会去调用他打包好的系统函数库,不用再管系统应用具体是什么,只要他们的内核一样就可以。
无视具体的系统应用。
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
Docker允许开发中将应用、依赖、函数库、配置-起打包,形成可移植镜像
Docker应 用运行在容器中,使用沙箱机制,相互隔离
Docker如何解决开发、测试、生产环境有差异的问题
Docker是一个快速交付应用、运行应用的技术:
1.可以将程序及其依赖、运行环境一 起打包为一-个镜像,可以迁移到任意Linux操作系统
2.运行时利用沙箱机制形成隔离容器,各个应用互不干扰.
3.启动、移除都可以通过一-行命令完成,方便快捷
Docker是直接调用操作系统内核的,它的性能会比虚拟机好很多。
虚拟机是在一个操作系统中运行另一个操作系统,一层一层的调用最后去调用计算机硬件,性能不太好。
Docker和虚拟机的差异:
镜像就是硬盘中的文件。容器就是我们把mysql这个应用跑起来,形成的进程就是容器。只不过容器在Docker里面还要做隔离。
镜像都是只读的,容器在运行过程中,不能向镜像当中去写东西。你可以基于镜像去创建容器,容器可以在镜像当中读数据,不能写。
当容器需要写操作的时候,可以拷贝一份镜像当中的data文件到自己的容器中,
那怎么把镜像分享给别人使用呢?使用DockerHub
1、想办法获得镜像
2、把镜像创建成容器运行,完成部署即可。
查看帮助文档
docker --help
案例:从DockerHub中拉取一个nginx镜像并查看
利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
容器暂停:操作系统会将容器内的进程挂起,容器关联的内容暂存起来,cpu不再执行这个进程。如果你把他给回恢复了,内存空间被恢复,程序接着运行。
容器停止:操作系统会将容器内的进程杀死,所占内存回收。保留下来的只是容器的文件系统,一些静态的东西。只能用start重新生成。
删除容器不仅把里面的进程干掉,里面的文件删除,删的干干净净。
案例:创建运行一个Nginx容器
基于最新版本的nginx创建一个容器,并起个名字为mn,且做了一个端口映射,在后台运行。
容器是对外隔离的
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx
端口映射的目的:将原本完全隔离的容器暴露一个窗口,让你通过它可以访问。
左边为宿主机的端口,只要没有被其他的占用些什么都可以。
80端口可以不写
持续查看监控日志
和tail -f 一样
docker run命令的常见参数有哪些?
–name: 指定容器名称
-p:指定端口映射办
-d:让容器后台运行
查看容器日志的命令:
案例:进入Nginx容器,修改HTML文件内容,添加"欢迎您”
容器的内部有自己的文件系统
nginx没有封装vi命令,那怎么修改index.html?进行内容的替换
去浏览器再刷新下页面就知道是否修改成功。
从容器中退出来exit,
查看容器状态:
删除容器:
进入容器:
$ docker run --name mr -p 6379:6379 -d redis redis-server --save 60 1 --loglevel warning
进入redis容器,并执行redis-cli客户端命令,存入num=666
docker run -it --network some-network --rm redis redis-cli -h mr
容器与数据耦合的问题
数据卷就相当于是一个桥梁,将容器里面的文件数据和宿主机文件系统上的数据关联映射到一起,在宿主机上进行相关文件的修改后,容器里面的文件也会发生相应的改动。
解决了修改不方便,以及在创建容器想要数据一致的问题(让他也指向相同的数据卷)、容器删除了之后数据卷还在三个问题。
案例:创建一个数据卷 ,并查看数据卷在宿主机的目录位置
数据卷的作用:
将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
数据卷操作:
我们在创建容器时,可以通过-V参数来挂载一个数据卷到某个容器目录
案例:创建一 个nginx容器, 修改容器内的html目录内的index.html内容
需求说明:.上个案例中, 我们进入nginx容器内部,已经知道nginx的html目录所在位置
/usr/share/nginx/html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
提示:运行容器时使用-V参数挂载数据卷
-v参数前面是数据卷名称,后面是容器内的对应文件所在位置
在做数据卷挂载时,如果数据卷不存在,dockerhi自动创建对应的数据卷。
案例:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
宿主机文件会直接覆盖容器内文件的内容
导入镜像:
创建多级目录:mkdir -p mysql/data
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3006:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
测试是否能连接成功,连接的时候注意端口号映射为了3006
数据卷挂载:当我们使用数据卷时,docker会全自动的创建数据卷对应的目录,这样数据卷就指向了目录,而docke挂载时只需要挂载在数据卷上即可,不需要关心目录在哪里,这种方式相当于全权交给了docker去处理,我们不用去操心。劣势就是目录文件不是我们自己创建的,文件目录比较深,我们不知道去哪里去找。
目录挂载:目录是我们自己创建的,挂载的时候也没有人做代理,直接挂上去。将来想要定位到这个文件在哪,一目了然。
一个是自动化隐藏了细节,一个是需要自己去实现细节,但是比较清晰。
数据卷挂载:-v volume 数据卷名称:容器内目录
宿主机挂载:-v 宿主机目录:容器内目录
镜像是分层结构,每一层称为一个Layer
Dockerfile就是一-个文本文件, 其中包含-一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每
一个指令 都会形成一层Layer。
案例:基于Ubuntu镜像构建一个新镜像,运行一个java项目
先创建目录文件
上传文件到虚拟机
Dockerfile文件里面的内容
创建镜像:
docker build -t javaweb:1.0 .
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qROAMWch-1648084811496)(C:/Users/大 大/AppData/Roaming/Typora/typora-user-images/image-20220322144924876.png)]
案例:基于java;8-alpine镜像,将一个Java项目构建为镜像
采用分层的思想,将对jdk的安装封装为一个镜像
什么是DockerCompose
分布式应用部署的帮手
Compose文件可以看作n个docker run命令的集合,
在微服务集群配置当中,mysql仅仅是统计给服务内的集群中用的,端口不需要暴漏,内部能访问就可以了。
DockerCompose有什么作用?
帮助我们快速部署分布式应用,无需一个个微服务去构建镜像和部署。
curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
案例:将之前学习的cloud-demo微服务集群利用DockerCompose部署**
启动镜像
在浏览器验证
镜像仓库( Docker Registry )有公共的和私有的两种形式:
1、首先配置Docker的信任地址
2、写docker-compose.yml文件
需要注意的是docker-compose的版本与docker引擎的版本要一一对应,版本之间有对应关系。
version: '3.8'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8086:80
environment:
- REGISTRY_TITLE=我的私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
在私有镜像仓库推送或拉取镜像
本质是一样的,只不过是重命名的而已.
在浏览器中查看是否推送成功
从仓库中拉取镜像到本地
推送镜像到仓库之前一定要重命名,并且以镜像仓库地址为前缀.
1.推送本地镜像到仓库前都必须重命名(docker tag)镜像,以镜像仓库地址为前缀
2.镜像仓库推送前需要把仓库地址配置到docker服务的daemon.json文件中,被docker信任
3.推送使用docker push命令
4.拉取使用docker pull命令