Docker的定义
1.什么是Docker
Docker是一个快速交付应用、运行应用的技术:
- 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
- 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
- 启动、移除都可以通过一行命令完成,方便快捷
2.为什么要用Docker
例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。
而Docker·
为了解决依赖的兼容问题的,采用了两个手段:
-
将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
-
将每个应用放到一个隔离容器去运行,避免互相干扰
这样打包好的应用包中,既包含应用本身,也保护应用所需要的Libs、Deps,无需再操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。
Docker如何解决开发、测试、生产环境有差异的问题?
- Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
Docker的基本操作
1 Docker命令
常见的镜像操作命令如图:
举例:
需求:从DockerHub中拉取一个nginx镜像并查看
1)首先去镜像仓库搜索nginx镜像,比如DockerHub:
2)根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx
3)通过命令:docker images 查看拉取到的镜像
保存、导入镜像
命令格式:
docker save -o [保存的目标文件名称] [镜像名称]
1)使用docker save导出镜像到磁盘
运行命令:
docker save -o nginx.tar nginx:latest
结果如图:
2)使用docker load加载镜像
先删除本地的nginx镜像:
docker rmi nginx:latest
然后运行命令,加载本地文件:
docker load -i nginx.tar
结果:
2 容器相关命令
容器操作的命令如图:
容器保护三个状态:
- 运行:进程正常运行
- 暂停:进程暂停,CPU不再运行,并不释放内存
- 停止:进程终止,回收进程占用的内存、CPU等资源
其中:
-
docker run:创建并运行一个容器,处于运行状态
-
docker pause:让一个运行的容器暂停
-
docker unpause:让一个容器从暂停状态恢复运行
-
docker stop:停止一个运行的容器
-
docker start:让一个停止的容器再次运行
-
docker rm:删除一个容器
举例
:
创建并运行nginx容器的命令:
docker run --name containerName -p 80:80 -d nginx
命令解读:
- docker run :创建并运行一个容器
- –name : 给容器起一个名字,比如叫做mn
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx
这里的-p
参数,是将容器端口映射到宿主机端口。
默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。
现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:
我们可以通过docker logs 容器名字 来查看日志
- 先利用镜像产生容器,然后再对容器进行命令执行模式
exit退出容器
docker stop 容器名称:停掉容器名称,直接死掉
docker ps:默认查看运行中的容器
docker ps -a:查看所有容器
docker start 容器名字:开始容器,停掉的容器再开始
总结:
docker exec -it 容器名字 命令:是进入容器后修改文件,因为容器是隔离性的,所以我们不能使用vi命令,非常不方便修改,而且修改时没有日志记录的;
数据卷
出现问题:多个容器修改困难
解决方案:
我们可以利用数据卷(是一个虚拟目录),将容器挂载到数据卷上,而数据卷映射文件系统:
所以我们改动主机的文件系统,那么容器就会改变:因为容器挂载到了数据卷上->映射在主机文件系统上;
主机文件系统位置:在创建数据卷的时候就自动设置了(数据卷相当于代理帮你自动设置位置),实际上跟你你设置的数据卷名字有关;
容器挂载数据卷位置:通过创建容器的-v参数设置
容器删除,数据卷不会被删,这样有利于数据的保存与维护(直接改变数据卷,也就是可以通过主机修改数据——>容器升级),较为安全;
操作数据卷常见命令
作用:
将容器与数据分离,降低耦合,方便操作容器内的数据(->通过主机进行操作),方便数据维护升级——>容器删除,数据卷依然在;
注意:
docker volume prune相当于强制删除卷(未使用)
docker volume rm xx:指定删除
练习数据卷操作:
挂载数据卷
如果此时我将数据卷删除的话,创建容器直接设置数据卷挂载位置,docker非常智能会自动创建没有的数据卷
练习:创建并且运行mysql容器,将宿主机目录挂载到容器(目录挂载)
步骤:
通过mysql镜像启动mysql容器,设置主机挂载目录的位置以及容器挂载的位置(一一对应的感觉,没有代理帮你管理,自己设置两边的位置)
docker run --name mysql -p 3308: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