1.初识Docker
大型项目组件较多,运行环境也较为复杂,部署时会碰到依赖关系复杂,容易出现兼容性问题;开发,测试,生产环境也有差异。
Docker通过将应用的Libs(函数库),Deps(依赖库),配置与应用一起打包;将每个应用放到一个隔离的容器中去运行,避免互相干扰。
解决(大型项目依赖关系复杂,不同组件依赖有兼容性问题):
Docker允许开发中将应用,依赖,函数库,配置一起打包,形成可移植镜像。
Docker应用运行在容器中,使用沙箱机制,相互隔离。
解决(开发,测试,生产环境有差异):
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。
1.Docker和虚拟机的区别
docker是一个系统进程;虚拟机是在操作系统中的操作系统。
docker体积小,启动速度快,性能好;虚拟机体积大,启动速度慢,性能一般。
2.Docker架构
总结:
镜像:将应用程序及其依赖,环境,配置打包在一起
容器:镜像运行起来就是容器,一个镜像可以运行多个容器
Docker结构:
服务端:接收命令或远程请求,操作镜像或容器
发送命令或者请求到Docker服务端
d. DockerHub:
i.一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry
e. 什么是Docker:帮助我们快速构建应用镜像,交付应用,运行应用的技术
f. Docker工作流:
i.构架自定义镜像或者从DockerRegistry拉取镜像
ii.根据镜像创建容器,并运行
2.Docker的基本操作
启动前先关闭防火墙:systemctl stop firewalld
启动Docker:systemctl start docker
查看版本:docker -v
查看帮助文档: docker --help
1.镜像相关命令:
docker save -o nginx.tar nginx:1.23.3 “保存镜像为一个压缩包”
docker load -i nginx.tar "加载压缩包为镜像"
2.容器相关命令:
注意:多去DockerHub搜索镜像,可以更加了解如何使用。
docker run --name myNginx -p 80:80 -d nginx 运行Nginx镜像,容器名为myNginx
-p:将宿主机端口与容器端口映射,冒号左侧为宿主机端口,右侧为容器端口。
-d:后台运行容器
docker logs 查看日志
-f:添加此参数可以持续查看日志
docker ps 查看运行的容器
-a:添加此参数可以查看所有容器
docker start 容器名/docker stop 容器名 启动和关闭容器
docker rm mn 删除容器
加-f 强制删除,包括运行中的容器
docker exec -it myNginx bash 进入容器
docker exec:进入容器内部,执行一个命令
-it: 给当前进入的容器创建一个标准输入,输出终端,允许我们与容器交互
myNginx: 要进入的容器名字
bash: 进入容器后执行的命令,bash是一个linux终端交互命令
不推荐在容器内修改文件。
3.数据卷
容器与数据耦合
1.不便于修改
2.数据不可复用
3.升级维护困难
数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录。
作用:将容器和数据分离,解耦合,方便操作容器内数据,保证数据安全。
docker volume [command] | 数据卷操作 |
create | 创建一个volume |
inspect +数据卷名 | 显示一个或多个volume的信息 |
ls | 列出所有的volume |
prune | 删除未使用的volume |
rm | 删除一个或多个指定的volume |
创建容器时,可以通过 -v参数来挂载一个数据卷到某个容器目录。
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
-v html:/usr/share/nginx/html:把html数据卷挂载到容器中的/usr/share/nginx/html这个目录中。
docker volume inspect html:查看html数据卷位置再进入该目录
cd /var/lib/docker/volumes/html/_data
然后可以直接修改index.html,容器中的index.htm也会跟着变,反过来也一样。
4.目录挂载和数据卷挂载的语法是类似的:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件] : [容器内文件]
总结:
1.docker run的命令中通过 -v 参数挂载文件或目录到容器中:
-v volume名称:容器内目录
-v 宿主机文件:容器内文件
-v 宿主机目录:容器内目录
2.数据卷挂载与目录直接挂载的:
数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看
3.Dockerfile自定义镜像
1.镜像结构
镜像是将应用程序及其需要的系统函数库,环境,配置,依赖打包而成
总结:镜像是分层结构,每一层称为一个Layer
BaseImage层:包含基本的系统函数库,环境变量,文件系统
Entrypoint:入口,是镜像中应用启动的命令
其他:在BaseImage基础上添加依赖,安装程序,完成整个应用的安装和配置
2.Dockerfile语法
https://docs.docker.com/engine/reference/builder
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
Dockerfile的第一行必须是FROM,从一个基础镜像来构建
基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
4.Docker-Componse
1.初识DockerCompose
https://docs.docker.com/compose/compose-file/
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
web:
build: .
ports:
- "8090:8090"
5.Docker镜像仓库
镜像仓库( Docker Registry )有公共的和私有的两种形式:
公共仓库:例如Docker官方的 Docker Hub,国内也有一些云服务商提供类似于 Docker Hub 的公开服务,比如 网易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等。
除了使用公开仓库外,还可以在本地搭建私有 Docker Registry。
向镜像仓库推送镜像
推送镜像到私有仓库必须先tag
重新tag本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
推送镜像
docker push 192.168.150.101:8080/nginx:1.0
从镜像仓库拉取镜像
拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0
总结:
推送本地镜像到仓库前都必须重命名(docker tag)镜像,以镜像仓库地址为前缀
镜像仓库推送前需要把仓库地址配置到docker服务的daemon.json文件中,被docker信任
推送使用docker push命令
拉取使用docker pull命令