目录
1. 初识Docker
1.1 Docker为什么出现?
微服务部署难
- 依赖复杂,存在兼容性问题。
- 开发、测试、生产环境差异。
1.2 怎么解决
1.2.1 解决兼容性问题
- 将应用的函数库,依赖,配置与应用一起打包。
- 采用沙箱,放到隔离容器运行。
1.2.2 解决环境差异
将用户程序所需要用到的系统函数库一起打包,运行到不同操作系统时,基于打包的函数库,借助Linux内核来运行,不在依赖于环境函数库。
1.3 与虚拟机区别
虚拟机:在操作系统中模拟硬件设备,然后运行另一个操作系统。
Docker:仅仅是封装的函数库。
1.4 Docker架构
1.4.1 镜像
Docker应用程序及其所需要的函数库,依赖,环境,配置等文件一起打包,称为镜像。
1.4.2 容器
镜像中的应用程序运行后形成的进程就是容器。一个镜像可以有多个容器。
1.4.3 架构
CS架构,两部分组成:
- 客户端(Client):通过命令或RestApi向服务的发送命令。
- 服务端(Server):Docker守护进程,处理Docker指令,管理镜像,容器等。
2. Docker基本操作
2.1 镜像操作
镜像名称:名称:版本 | [repository] : [tag]
镜像命令:Docker --help
2.2 容器操作
- docker run:创建并运行一个容器,处于运行状态
- docker pause:让一个运行的容器暂停
- docker unpause:让一个容器从暂停状态恢复运行
- docker stop:停止一个运行的容器
- docker start:让一个停止的容器再次运行
- docker rm:删除一个容器
2.2.1 创建并运行nginx容器的命令:
docker run --name containerName -p 80:80 -d nginx
命令解读:
- docker run :创建并运行一个容器
- --name : 给容器起一个名字,比如叫做mn
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx
2.2.2 进入容器
进入我们刚刚创建的nginx容器的命令为:
docker exec -it mn bash
命令解读:
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- mn :要进入的容器的名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
2.3 数据卷
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
相当于引用,将文件写道宿主机文件中,当容器需要用到时给他一个地址去那儿读。
2.3.1 数据卷命令
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
2.3.2 挂载数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
这里的-v就是挂载数据卷的命令:
- -v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中
3. DockerFile自定义镜像
3.1 镜像结构
分层:
简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。我们要构建镜像,其实就是实现上述打包的过程。
3.2 DockerFile语法
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
3.3 项目构建
用到在学。
4. Docker-Compose
4.1 初识DockerCompose
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"
上面的Compose文件就描述一个项目,其中包含两个容器:
- mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录
- web:一个基于docker build临时构建的镜像容器,映射端口时8090
其实DockerCompose文件可以看做是将多个docker run命令写到一个文件,只是语法稍有差异。