Docker的安装请见文章:https://blog.csdn.net/qq_43908235/article/details/124135183
【本文目录】
一、初识docker
二、docker的基本操作
一、初识docker
大型项目存在的问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
- 依赖关系复杂,容易出现兼容性问题
- 开发、测试、生产环境有差异
Docker解决依赖兼容问题
而Docker确巧妙的解决了这些问题,Docker是如何实现的呢?
Docker为了解决依赖的兼容问题的,采用了两个手段:
- 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
- 将每个应用放到一个隔离容器去运行,避免互相干扰
这样打包好的应用包中,既包含应用本身,也保护应用所需要的Libs、Deps,无需再操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。
虽然解决了不同应用的兼容问题,但是开发、测试等环境会存在差异,操作系统版本也会有差异,怎么解决这些问题呢?
Docker解决操作系统环境差异
应用于计算机交互的流程如下:
1)应用调用操作系统应用(函数库),实现各种功能
2)系统函数库是对内核指令集的封装,会调用内核指令
3)内核指令操作计算机硬件
Ubuntu和CentOSpringBoot都是基于Linux内核,无非是系统应用不同,提供的函数库有差异:
Docker如何解决不同系统环境的问题?
- Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
- Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行
docker和虚拟机对比
【Docker的优势】
镜像与容器
Docker中有几个重要的概念:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。
【总结】
DockerHub地址: https://hub.docker.com/
二、docker基本操作
镜像组成
首先来看下镜像的名称组成:
- 镜名称一般分两部分组成:[repository]:[tag]。
- 在没有指定tag时,默认是latest,代表最新版本的镜像
这里的mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的MySQL镜像。
镜像常用命令
可以通过 docker --help
命令查看命令
首先启动docker
systemctl start docker
1、拉取镜像
这里以拉取nginx为例, 其他镜像操作与之相同。
docker pull nginx
2、查看镜像
docker images
3、导出镜像
如果不熟悉save的用法
docker save --help
把我们刚刚拉取的镜像进行导出
docker save -o nginx.tar nginx:latest
解释说明:
nginx.tar为输出的名称
nginx:latest为要输出的镜像名称
4、删除镜像
docker rmi nginx:latest
5、导入镜像
查看如何使用
docker load --help
docker load -i nginx.tar
解释:
-i 打印日志
-q不会打印日志
nginx.tar 为要导入的镜像名称
6、docker命令使用图解
容器相关命令
创建并运行一个nginx容器
可参考dockerhub的文档:https://hub.docker.com/
在dockerhub搜索nginx。
进入。
docker run --name ng -p 80:80 -d nginx
【参数详解】
docker run : 运行一个容器
–name:给容器起一个名称
-p 80:80 : 端口映射, 将宿主机端口与容器端口映射, 左边宿主机,右边容器名称
-d: 后台运行
nginx: 镜像名称
这里的容器名称设置为ng, docker为其生成了一个唯一标识。
查看所有运行的容器以及状态。
docker ps
访问浏览器,可以访问, 说明服务已经启动。
查看日志docker logs 容器名称
docker logs
【参数】
-f 持续更新日志
Docker容器命令图解
进入容器, 修改文件
需求:进入Nginx容器,修改HTML文件内容,添加“hello docker”
提示:进入容器要用到docker exec命令。
进入容器命令:
docker exec -it ng bash
docker exec : 进入到容器内部需要执行的一个命令
-it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
ng:要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令
ls
命令显示目录文件
此时,容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务器一样,我们可以向平时那样按需求修改文件即可。
nginx的环境、配置、运行文件全部都在这个文件系统中,包括我们要修改的html文件。查看DockerHub网站中的nginx页面,可以知道nginx的html目录位置在/usr/share/nginx/html
进入该目录, 使用ls
命令
容器内没有vi命令,无法直接修改,我们用下面的命令来修改:
sed -i -e 's#Welcome to nginx#hello docker#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
再次访问浏览器, 即可查看已经修改的内容
退出容器
exit
停掉容器
docker stop ng(容器名称)
查看运行的容器
docker ps
查看所有容器
docker ps -a
删除容器
docker rm ng(容器名称)
如果该容器正在运行, 则不可以删除,我们通过命令查看, 可通过-f进行强制删除
docker rm -f ng
【总结】
练习
练习1
参考DockerHub:https://hub.docker.com/_/redis
(1)拉取
(2)创建容器
创建时,选择这个持久化存储的。
docker run --name myredis -p 6379:6379 -d redis redis-server --save 60 1 --loglevel warning
(3)查看运行的容器
docker ps
(4)测试
练习2
进入容器
docker exec -it myredis bash
连接到redis, 存入num=666
也可直接进入
docker exec -it mr redis-cli
数据卷
查看数据卷相关命令
Commands:
create 创建一个数据卷
inspect 显示一个或多个数据卷的详细信息
ls 显示所有的数据卷
prune 删除本地所有未使用的数据卷
rm 删除一个或多个数据卷
创建一个名为html的数据卷
docker volume create html
显示html的详细信息
docker volume inspect html
删除html数据卷
docker volume rm html
或者 docker volume prune
挂载数据卷
练习
(1)通过-v参数挂载
-v 数据卷名称:要进行挂载的目录
docker run --name mynginx -v html:/usr/share/nginx/html -p 80:80 -d nginx
(2)使用inspect 命令查看
docker volume inspect html
数据卷如果不存在则自动创建。