本文章内容包含镜像、容器和数据卷的基本操作
1、镜像
镜像的组成:
镜像名称一般分两部分组成:[repository]:[tag]。
在没有指定tag时,默认是latest,代表最新版本的镜像
镜像的操作命令
在本地,可通过
docker images
查看镜像
docker rmi
删除镜像
Dockerfile通过docker build
构建镜像
docker save
保存镜像为一个压缩包
docker load
加载压缩包为镜像
docker push
推送镜像到镜像服务器(Docker Registry)
docker pull
从镜像服务器拉取镜像
镜像仓库有哪些
一、国内仓库
网易: https://c.163yun.com/hub#/m/home/ (需登录)
阿里云:https://cr.console.aliyun.com/cn-beijing/instances/images (需登录)
DaoCloud 道客网络: https://hub.daocloud.io/
二、国外仓库
Docker Hub: https://hub.docker.com/
Quay: https://quay.io/search
最常用的是Docker Hub: https://hub.docker.com/
比如想要拉取一个MySQL的镜像,就可以到https://hub.docker.com/上边搜索,这个网站不需要登录即可搜索
根据给出的命令行直接复制粘贴后即可拉取镜像,想看此镜像如何使用(即如何创建容器等),可查看Description选项
其实命令可以不用去死记硬背,可通过docker --help
查看帮助文档,想要查看某个命令的具体操作,还可以继续加,比如想要保存镜像,虽然知道是docker save
命令,但是不知道它的具体参数和格式,这时可以使用docker save --help
进一步查看此命令的使用。到了这里有些人可能又忘记镜像的组成了,千万要记得镜像都是需要镜像名称:版本的哦
2、容器
基于镜像创建容器
创建容器最常用的命令docker run
,它可以创建容器并且让它运行起来,一般在镜像服务器里查看命令,即上边(上图)所提及的Description选项
docker pause
让容器暂停运行(即挂起)
docker unpause
让容器从暂停(挂起)状态重新运行
docker stop
让容器停止运行(即杀死,并回收内存)
docker start
让容器开始运行(创建一个全新的容器)
docker ps
查看所有运行的容器及状态(默认只显示运行中的容器,想要查看所有容器的话得加上 -a
参数,也可查看帮助文档了解更多参数)
docker logs
查看容器运行日志
docker exec
进入容器执行命令(不建议,第一点:不方便。第二点:操作没有记录,即现在改了东西,随着时间的推移,会忘记之前改过哪些东西)
docker rm
删除指定容器(容器得先停止才能删除),或者加个参数 -f
,即可删除正在运行中的容器
3、数据卷
上边容器所遇到的问题:
1、不便于修改。比如要修改Nginx的html内容时,需要进入容器内部修改,很不方便。
2、数据不可复用。在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的。
3、升级维护困难。数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了
所以数据卷就此诞生了
作用:解决容器与数据耦合的问题
数据卷(volume) 是一个虚拟目录,指向宿主机文件系统中的某个目录。
操作数据卷的基本语法:docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
create
创建一个volume
inspect
显示一个或多个volume的信息(特别是存储在硬盘的目录)
ls
列出所有的volume
prune
删除未使用的volume
rm
删除一个或多个指定的volume
挂载数据卷
1、将数据卷挂载到容器目录
我们在创建容器时,可以通过 -v
参数来挂载一个数据卷到某个容器目录
举例:创建一个nginx容器,修改容器内的html目录内的index.html内容
需求说明:我们已经知道nginx的html目录所在位置/usr/share/nginx/html (可在官网HubDocker里边查),我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
步骤:
- 创建数据卷
# 创建数据卷
create volume html
- 创建容器并挂载数据卷到容器内的HTML目录
docker run \
--name mn \
-v html:/usr/share/nginx/html \
-p 80:80 \
nginx
# docker run :就是创建并运行容器
# -- name mn :给容器起个名字叫mn
# -v html:/usr/share/nginx/html :把html数据卷挂载到容器内的/usr/share/nginx/html这个目录中
# -p 8080:80 :把宿主机的8080端口映射到容器内的80端口
# nginx :镜像名称
- 进入html数据卷所在位置,并修改HTML内容
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
# 直接进入容器的话连vi命令都用不了,现在除了vi还可以直接可视化修改
那数据卷不存在的时候是否可以直接挂载呢?
答案是可以的!
也就是说,挂载时不需要刻意地去创建数据卷,直接挂上去就行,docker内部会自动帮我们创建
2、将宿主机目录直接挂载到容器
提示:目录挂载与数据卷挂载的语法是类似的:
之前的:
-v[数据卷名称]:[容器内目录]
现在的:
-v [宿主机目录]:[容器内目录]
# 宿主机内容会直接覆盖容器内内容,这是数据卷当中没有的功能
-v [宿主机文件]:[容器内文件]
案例:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
实现思路如下:
下载一个MySQL镜像
在操作系统中:
1、创建目录/tmp/mysql/data/
2、创建目录/tmp/mysql/conf,将自己的配置文件**.cnf文件上传到/tmp/mysql/conf
去DockerHub查阅资料,创建并运行MySQL容器,要求:
1、挂载/tmp/mysql/data到mysql容器内数据存储目录
2、挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件
3、设置MySQL密码
# -v 参数 冒号后边的路径在官方文档(HubDocker)可查看
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=self_password \
-p 3306:3306 \
-v /tmp/mysql/conf/**.cnf:/etc/mysql/conf.d/***.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
数据卷挂载方式对比
差别:
1、数据卷挂载耦合度低,有docker来管理目录,但是目录较深,不好找
2、目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看