Docker基本概念
什么是Docker?
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。
Docker的几个基本概念
镜像(Image):一个镜像就像是一个可运行的软件
容器(Container):镜像每运行一次形成一个容器,运行的容器代表正在运行的软件服务
仓库(Repository):docker官方维护的一个用来存放镜像的东西,类似于maven中的仓库
为什么会出现Docker?
- 开发和运维两套环境,而环境配置十分麻烦。 如在Windows上开发,要发布到Linux上运行。Docker给以上问题提出了解决方案: Java --- Jar(环境)---打包项目带上环境(镜像)---Docker仓库(应用商店)---下载镜像---直接运行
- Docker的思想来自于集装箱,核心思想:隔离。 即将应用打包装箱,每个箱子是互相隔离的,可以将服务器利用到极致。
| 虚拟机 | Docker |
|---|---|
| linux centos原生镜像(一个电脑) | 隔离镜像(最核心的环境 +jdk +mysql等) |
| 需要开启多个虚拟机 | 运行镜像就可以了 |
| 几GB | 几MB |
Docker基本操作
容器基本操作
查看引擎中正在运行的容器
docker.ps
查看引擎中所有的容器(运行、停止)
docker.ps -a
如何运行tomcat镜像
docker run -d -p 8080:8080 --mytomcat -v 宿主机绝对路径:容器内绝对路径 tomcat:8.0
命令解释
端口映射 -p 8080(宿主机):8080
后台启动 -d
指定容器名称 --name
设置数据卷 -v 宿主机绝对路径:容器内绝对路
停止、启动、重启、暂停、恢复 容器
docker stop|start|restart|pause|unpause
杀死容器
docker kill id|name
删除容器
docker rm 容器id|name 删除已经停止的容器
docker rm -f 容器id|name 强制删除(即使还在运行)
查看容器内部日志
docker logs 容器id|name
docker logs -f 容器id|name 实时监控容器内服务的日志
进入容器内部
docker exec -it(交互模式) 容器id|name bash
exit 退出容器
容器和宿主机之间文件拷贝
容器 ====> 宿主机
docker cp 容器id:容器中文件或者目录 主机目录
宿主机 ====> 容器
docker cp 主机文件和目录 容器id:容器中文件或者目录
查看容器中运行的进程
docker top 容器id|name
查看容器内细节
docker inspect 容器id|name
容器数据卷机制
什么是数据卷
数据卷(Data Volume)是实现容器中数据和宿主机数据进行同步的,必须在容器首次启动时进行设置
使用绝对路径设置数据卷
docker run -v 宿主机绝对路径:容器内绝对路径:ro
ro:read only 如果在设置时指定ro,代表日后容器内路径是只读的
这种方式将容器路径的原始内容全部清空,始终以宿主机路径为主
使用别名的方式设置数据卷
docker run -v aa:/usr/local/tomcat/webapps ...
aa:
1、代表docker数据卷中的别名 (如果这个别名存在docker直接使用)
2、使用别名的方式保存容器路径原始内容,前提别名对应的路径不能存在内容
将容器打包成一个新的镜像
docker commit -m "deploy test project in tomcat" -a "xiaohuang" 容器id|name 镜像名:版本
镜像的备份和回复
备份
docker save 镜像名:Tag -o (镜像名-tag).tar
如 docker save tomcat:8.0 -o tomcat-8.0.tar
恢复
docker load -i tomgcat-8.0.tar
Doker运行MySQL
运行MySQL
1、访问DockerHub 搜索MySQL,确定使用的版本
2、执行
docker pull mysql:5.6
3、运行MySQL
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysqltest --restart=always -v /root/data:/var/lib/mysql mysql:5.6
docker run -p 3306:3306 开放映射端口 -e MYSQL_ROOT_PASSWORD=root 指定用户名密码 -d --name mysqltest 自定义服务名称 --restart=always 开机自启动 -v /root/data:/var/lib/mysql 数据卷持久化到宿主机 mysql:5.6 指定运行的版本
MySQL数据备份
使用MySQL容器时数据库低层文件系统进行的备份不利于数据的迁移和备份 推荐使用sql文件的形式备份文件,
导出sql文件方式:
-
使用MySQL官方命令
-
在Navicat中直接导出
Docker运行Redis
运行Redis
docker run -d -p 6479:6379 -v /root/redisdata:/data --restart=always --name restRedis redis:5.0.12
自定义配置文件启动Redi
-
获取Redis配置文件
方式一:下载对应版本的Redis,找到配置文件进行修改 使用完整配置文件启动
方式二(推荐):创建指定文件名直接写修改属性
-
上传配置文件到宿主机指定目录 /root/redisconf/redis.conf
-
数据卷挂载配置启动
docker run --name redistest -d -p 6379:6379 --restart=always -v /root/redisdata:/data redis:5.0.12 redis-server /data/redis.conf
DockerFile
什么是DockerFile?
dockerFile是镜像的描述文件,可以通过dockerFile构建我们自己的镜像
为什么会有dockerFile
- docker官方提供的镜像非常官方,通用,但不涵盖我们自己项目的操作
- 主要原因:日后希望基于自己公司不同项目定制不同镜像,方便部署维护
dockerFile命令使用
后续补充
容器间的通信(网络的使用)
后续补充
Docker-compose
现有docker在部署项目时存在的问题
-
一个项目需要引入多个容器,容器之间存在依赖关系,某些容器需要其他容器启动后才能正常运行
因此容器编排显得非常重要
解决方式
- 将一组容器划分在一起
什么是Docker-compose
compose是Docker官方开源项目,复负责对Docker容器集群进行快速编排
编排:项目中的容器按照指定顺序启动
如何使用Docker-compose
Docker-compose.yml 就是应用(project)
Project:项目,一组关联的容器组成的一个完整的业务单元,在docker-compose.yml中定义
Service:一个项目中的某一个容器称为一个服务
Docke-compose命令
docker-compose相关:
-
docker-compose up -d(后台启动) [服务名称] // 启动指定服务
-
docker-compose up //启动项目中所有容器
作用:该命令十分强大,尝试自动完成包括构建镜像,(重新)创建服务,启动服务并关联相关容器的一系类操作
-
docker-compose down // 对整个项目操作
-
docker-compose down [服务id]
作用:docker-compose down 关闭所有容器 并移除网络
-
exec
docker-compse exec [服务id] bash
作用:进入某个服务内部
-
ps
docker-compose ps
作用:列出所有运行服务
-
restart -t 20s (指定20s之后重启服务)
docker-compose restart //对整个项目操作
docker-compose restart -t [服务id] //对指定服务操作
- rm
docker-compose rm -f (强制删除) - v (删除容器所挂载的数据卷) [服务id]
作用:删除整个项目或指定id服务
-
top
docker-compose top [服务id]
作用:查看整个项目中所有服务容器内运行进程或查看某个指定id服务的容器的进程
-
pause 和 unpause
docker-compose pause [服务id]
作用:暂停或者回复整个项目或指定id的服务
-
logs
docker-compose logs -f(实时) [服务id]
作用:查看整个项目中所有服务运行的日志或指定服务id的日志
docker-compose.yml模板
==待补充==
Docker可视化工具
Portainer
- 安装
- 登录使用