WHCSRL 技术网

Docker基本操作_Miraitowa

本文章内容包含镜像、容器和数据卷的基本操作

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这个数据卷上,方便操作其中的内容。
步骤:

  1. 创建数据卷
# 创建数据卷
create volume html
  • 1
  • 2
  1. 创建容器并挂载数据卷到容器内的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 :镜像名称
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 进入html数据卷所在位置,并修改HTML内容
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
# 直接进入容器的话连vi命令都用不了,现在除了vi还可以直接可视化修改
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

那数据卷不存在的时候是否可以直接挂载呢?
答案是可以的!也就是说,挂载时不需要刻意地去创建数据卷,直接挂上去就行,docker内部会自动帮我们创建

2、将宿主机目录直接挂载到容器

提示:目录挂载与数据卷挂载的语法是类似的:
之前的:

-v[数据卷名称]:[容器内目录]
  • 1

现在的:

-v [宿主机目录]:[容器内目录]
# 宿主机内容会直接覆盖容器内内容,这是数据卷当中没有的功能
-v [宿主机文件]:[容器内文件]
  • 1
  • 2
  • 3

案例:创建并运行一个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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

数据卷挂载方式对比

数据卷挂载方式对比
差别:
1、数据卷挂载耦合度低,有docker来管理目录,但是目录较深,不好找
2、目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

推荐阅读