11-Docker镜像和容器操作
镜像操作
镜像ID分为两部分,一部分是软件名一部分是版本,不写版本则选择最新版本:
Docker镜像操作就是增删改查而已:
制作本地镜像就是build,从远端拉取镜像就是pull,查看已有镜像就是images,删除已有镜像就是rmi;
进行镜像分享的时候,可以将镜像通过push指令上传到公共服务或者私服中,让别人pull下来用,也可以使用save将镜像做成压缩包,别人用load指令对镜像进行读取解析然后使用。
如果想查看Docker所有的指令,可以使用 docker --help进行查看,当想查看一个镜像的具体信息,可以使用 docker 指令 --help进行查看。
拉取镜像
安装一个镜像的时候,现在DockerHub官网上搜索镜像资源,OFFCIAL IMAGE表示镜像是官方镜像。
进入镜像之后,可以看到给出的镜像拉取指令,默认是最新版本:
查看拉取到的镜像:
其中可以看到镜像的名称/tag是版本,默认是最新版本/ID是镜像唯一编号/创建镜像的时间,这个时间是官方发布此镜像的时间/镜像大小。
镜像打包并导入
由图可见,save指令需要两个参数,第一个参数表示导出文件的名称,第二个参数表示具体导出哪个镜像。
如果把上文拉取的镜像进行导出,就要写:docker save -o nginx.tar nginx:latest 表示将nginx最新版本镜像导出到nginx.tar压缩包中。导出到命令行所在目录中。
在将nginx导入的时候,先将原来的镜像删除掉,要使用rmi指令:docker rmi nginx:latest 表示删除nginx最新版本镜像。rmi后面可以写镜像ID,或者写镜像名和版本。
接着查看load指令的使用方式:
由图可见,load最少需要一个参数,-i表示加载哪个镜像,-q表示是否静默导入,也就是没有控制台输出的导入。
指令:docker load -i nginx.tar,表示加载nginx.tar,并且打印日志:
打印的日志类似如下:
容器操作
通过run指令将镜像运行到容器中,容器还可以进行暂停和重启操作。
暂停将把运行过程中出现的数据进行缓存,等待下次执行,而重启则会清空数据重新启动:
容器指令:
- docker exec 进入容器执行指令
- docker logs 查看容器日志
- docker ps 查看正在run运行的容器和状态
- docker rm 删除容器
运行一个容器
运行一个容器的时候,指令如上所示。
其中,上面指令中镜像名称叫containerName,-d表示后台运行,如果不加-d将把日志打到控制台中,一旦停止控制台容器也将停止。
容器启动之后将给出一个唯一ID生成,一个容器只有一个。
ps可以看到Docker的ID的前部分,镜像名称,内部运行指令,创建容器的时间,容器的状态,容器端口映射,名称。
docker logs 容器名称,就可查看容器的日志。
如果要持续的输出日志,可以使用:docker logs -f 容器名称,表示持续的输出日志到控制台。
进入容器执行指令
输入指令之后,控制台的地址会改变:
表示已经进入了容器的内部,并且默认在系统根目录中。
如果想添加静态文件到nginx中,DockerHub的nginx首页上提供了对静态内容修改的详细描述:
并且静态文件主要放到哪里,配置文件怎么放等等,都可以在nginx首页中看到。
容器由镜像创建的,一般镜像中都只会有当前软件需要的依赖,不会安装类似vim等其他的软件。所以要修改文件内容,不能使用vi指令,下文使用了替换指令:
在容器内修改文件非常麻烦,并且容器的修改是没有记录的,新的容器还要重新设置。
当使用stop将容器关闭之后,ps只能查看运行中的容器,要想查看所有的容器就要用 docker ps -a 指令。
删除容器要先停止容器,然后再删除。如果强制删除就要用 docker rm -f 容器名称。
容器数据管理(数据卷)
在容器内修改文件非常麻烦,并且容器的修改是没有记录的,新的容器还要重新设置。
数据卷也就是让容器中的文件夹与宿主机系统的文件系统建立映射,对宿主机内容的修改就会映射到容器中。
- 对宿主机内容的修改可以直接映射到容器中,不必进入容器中
- 多个容器可以使用同一个数据卷映射,进行数据共享。
- 如果容器删除,数据卷不会消失,新的容器还可以使用原来的数据卷。
数据卷操作是个二级指令,用docker volume开头:
docker volume create 数据卷名称,就可以创建一个数据卷,通过docker volume ls可以查看已经存在的数据卷,对数据卷进行详细查看的时候,可以使用docker volume inspect 数据卷名称进行查看:
docker volume prune指令将删除所有没有使用的数据卷。
docker volume rm 数据卷名称,将删除所有指定的数据卷。
数据卷映射
通过-v进行目录映射,冒号前是volume名称,后面是容器内的目录地址:
以下将替换nginx文件内容:
- 首先先创建好一个volume,起名为html。
- 第一步先创建好nginx容器:docker run --name mn 80:80 -v html:/usr/nginx/html -d nginx
- 上边的指令表示启动一个容器叫mn,端口映射和目录映射,再就是后台运行,使用nginx镜像。
这样nginx中目录下的内容就会在文件系统中显示文件结构。
在没有数据卷的时候创建容器并启动容器,将会自动的创建数据卷。可以使用docker volume ls进行查看。
文件系统挂载
除了可以使用数据卷的方式,还可以将宿主机目录直接进行挂载。
数据卷是不能进行文件挂载的。
运行MySQL容器:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql -d msyql:tag
指令介绍:启动容器叫做mysql,参数为MYSQL_ROOT_PASSWORD=123,也就是设定初始密码,端口映射和一个文件映射和一个文件夹映射,后台运行,采用mysql的tag版本,这个应该是个具体的版本。
具体关于Docker MySQL的配置可以在DockerHub上查看,介绍中说到/etc/mysql/my.cnf文件将包含两个文件夹中的所有配置文件,也就是说可以将配置文件放到两个文件夹的任意一个就可以生效:
数据卷方式比较好的是会在容器创建的时候自动创建宿主机的文件系统,坏处是具体目录结构和深度需要二次学习。
目录挂载的方式就是直接去创建然后自己映射,细节都要自己实现,没有自动化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人