Docker 基本操作
一、Docker 镜像操作
前言:
Docker 运行容器前需要本地存在对应的镜像,如果不存在本地镜像,Docker 就会尝试从默认镜像仓库【https://hub.docker.com】下载,这是 Docker 官方维护的一个公共仓库,可以满足用户的绝大部分需求
当然了,用户也可以通过配置来使用自定义的镜像仓库
镜像工作流程
1, docker client客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的) restful api典型的c/s架构
2、由docker服务端的守护进程从docker hub上下载了镜像
3、服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
4, docker服务端把这些信息流(传递)返回到客户端并展示出来, (展示在终端上)
①搜索镜像–docker search
'命令格式:'
docker search [对象]
'例:'
docker search nginx
docker search -f stars=1000 nginx
'#可以使用选项"-f"配合"stars=x"显示指定星级以上的镜像'
一般官方项目组维护的镜像使用单个单词,例如【nginx】作为镜像名称,我们称之为基础镜像或根镜像
像【mailu/nginx】这种命名方式的镜像,表示是由 Docker Hub 的用户【mailu】创建并维护的镜像,带有用户名为前缀
是否主动创建表示是否允许用户验证镜像的来源和内容
使用【docker search】命令只能查找镜像,无法获取镜像的标签,若需要查找 docker 的标签,需要从网页上访问镜像仓库【https://hub.docker.com】
②获取镜像–docker pull
搜索到了符合需求的镜像,我们可以使用【docker pull】命令从网络下载镜像到本地使用
'命令格式:'
docker pull [仓库名称][:标签]
'例:'
docker pull nginx
标签【tag】就是用来区分镜像版本的,可以看到没有指定标签,这里会默认下载仓库中最新版本的镜像,即选择【latest】标签
在整个下载的过程中,我们可以看出,整个镜像文件是由若干层【layer】组成,我们将其称之为【AUFS (联合文件系统)】,即联合文件系统,其实现了增量保存与更新的基础,在下载过程中会输出镜像的各层信息
镜像下载到本地后,我们就可以随时使用该镜像了
用户也可以选择从其他注册服务器仓库下载,需要在仓库名称前指定完整的仓库注册服务器地址
③查看镜像信息–docker images/inspect/tag
'命令格式:'
docker images [仓库名称][:标签]
'例:'
docker images
信息 | 说明 |
---|---|
REPOSITORY | 镜像属于的仓库 |
TAG | 镜像的标签信息,标记了同一个仓库中的不同镜像 |
IMAGE ID | 镜像的唯一 ID 号,是镜像的唯一标识 |
CREATED | 镜像的创建时间 |
SIZE | 镜像的大小 |
用户还可以根据镜像的唯一标识 ID 号来获取镜像的详细信息
'命令格式:'
docker inspect [镜像ID号]
'例:'
docker inspect d1a364dc548d
为了更方便在后续的工作中使用下载好的镜像,我们可以使用【docker tag】命令来为本地的镜像添加新的标签
'命令格式:'
docker tag 名称:[标签] 新名称:[新标签]
'例:'
docker tag wodby/nginx nginx123:nginx
docker images|grep nginx
④删除镜像–docker rmi
可以使用【docker rmi】命令删除镜像
删除镜像的方法有两种:使用镜像的标签或 ID
'命令格式:'
docker rmi [仓库名称][:标签]
或
docker rmi [镜像ID号]
'例:'
docker images|grep nginx
docker rmi nginxv1:latest
‘#当一个镜像有多个标签时,该命令只会删除多少标签中的这个指定标签,而不会影响镜像文件’
‘#若该镜像只有一个标签就要注意了,再使用该命令会直接彻底删除该镜像!’
docker rmi 11e8bf67e2d3
‘#选择参数为镜像ID号时要谨慎,必须首先确保该镜像当前没有被容器使用’
‘#如果该镜像已被容器使用,则需先删除所以依赖该镜像的容器,再删除该镜像’
‘#删除时系统会先删除指向该镜像的所有标签,然后删除镜像本身’
⑤存出镜像和载入镜像–docker save/load
如果你需要进行镜像迁移,需要先将镜像保存至本地文件,之后可以拷贝该文件至其他主机
这一过程称之为存出镜像,使用【docker save】命令操作
'命令格式:'
docker save -o [存储文件名] [存储镜像]
'例:'
docker save -o nginx nginx
ls -l nginx
--
scp nginx root@192.168.126.16:nginx
'#传至另一台主机'
如果需要将存出的镜像从主机 A 迁移至主机 B 上使用,可以将该导出文件导入到主机 B 的镜像库中
这一过程称之为载入镜像,使用【docker load】进行载入操作
'命令格式:'
docker load <[存出文件]
'例:'
docker load <nginx
docker images
⑥上传镜像–docker login/push
在本地存出的镜像越来越多,我们可以指定一个仓库来存放这些镜像
目前最方便的就是公共仓库,默认是上传到 Docker Hub 官方仓库,但需要注册使用公共仓库的账号,可以使用【docker login】命令输入用户名、密码和邮箱来登录
'例:'
docker login
'需要先去【https://hub.docker.com】注册一个账号,注册过程很简单'
在上传镜像前需要对本地镜像添加新的标签,然后再使用【docker push】命令进行上传
'命令格式:'
docker tag [名称][:标签] [账号名][/名称][:新标签]
docker push [账号名][/名称][:新标签]
二、Docker 容器操作
容器是 Docker 的另一个核心概念:
容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所必需的运行环境
包括文件系统、系统类库、Shell 环境等等
镜像就像一个只读模板,而容器会给这个只读模板一个额外的可写层
①容器的创建与使用–docker create/ps/start/run
容器的创建就是将镜像加载到容器的过程:
Docker 的容器十分的轻量级,用户可以随机创建或删除
新创建的容器默认处于停止状态,即不会自行开始运行任何程序
需要开启一个进程来启动容器,该进程是容器的唯一进程,即该进程终止时,容器也会被完全终止
停止后的容器可以重启启动并保留原有的修改
'命令格式:'
docker create [选项] [镜像] [运行的环境]
'常用选项:'
-i:让容器的输出保持打开
-t:让Docker分配一个伪终端
-d:后台守护进程
'例:'
docker create -itd nginx /bin/bash
'#创建新容器后,会返回一个唯一的ID'
--
docker ps -a
docker ps -aq
'#可以使用该命令查看索引容器的运行状态'
'#-a"选项表示列出系统最近一次启动的容器'
'#-q"显示容器ID
--
docker start [容器的ID]
'#启动停止状态下的容器'
如果想直接创建并使用容器,可以使用【docker run】命令,等同于先执行【docker create】,再执行【docker start】
需要注意的是,执行该命令,只要后面的命运行结束,容器就会停止
使用【docker run】命令创建容器时,Docker 在后台的标准运行过程:
检查本地是否存在指定镜像,若不存在,则会从公共仓库下载
利用镜像创建并启动一个容器
分配一个文件系统给容器,在只读的镜像层外挂载一层可读写层
从宿主机配置的网桥接口中桥接一个虚拟机至容器中
分配一个地址池中的 IP 给容器
执行用户指定的应用程序
执行完毕后容器被终止运行
'例:创建容器并启动执行一条shell命令'
docker run centos /usr/bin/bash -c ls /
docker ps -a
'#查看容器的状态,会发现在执行完命令后就终止了'
--
docker run -d centos /usr/bin/bash -c "while true;do echo hello world;done"
'#可以添加“-d”选项,可以让docker以守护进程形式在后台运行,即可以在后台持续运行该容器'
'#注:该容器所运行的程序一旦结束,容器也就会被终止'
docker ps -a
②容器的运行与终止–docker stop
'命令格式:'
docker stop [容器的ID]
'例:'
docker stop f807d7da17bb
docker stop f807d7da17bb
docker ps -a
'#Exuted即终止状态'
③容器的进入–docker exec
需要进入容器进行相应操作时,可以使用【docker exec】命令进入运行中的容器
'命令格式:'
docker exec -it [容器ID] /bin/bash
'例:'
docker exec -it ee52b1ff3f87 /bin/bash
'#用户可以通过所创建的终端来输入命令'
④容器的导出与导入–docker export/import
用户可以将任何一个 Docker 从一台主机迁移至任意一台主机:
首选需要将已创建好的容器导出为文件,使用【docker export】命令实现,该容器当前处于运行状态也可以正常导出
导出后将该文件传输至其他主机,通过相应的导入命令以实现容器的迁移
与镜像的迁移基本同理
'命令格式:'
docker export [容器ID] >文件名
'例:'
docker export 4aa9da25318d >nginx01
ls -l nginx01
-
scp centos01 root@192.168.78.22:/root/centos01
前往远程输出至的主机进行下一步操作
使用【docker import】命令导入,成为镜像
'命令格式:'
cat [文件名] |docker import - [生成的镜像名称][:标签]
'例:'
ls -l nginx01
cat nginx01 |docker import - nginx01:xcf
'#导入文件nginx01成为本地镜像'
docker images |grep nginx
⑤容器的删除–docker rm
可以使用【docker rm】命令将一个已处于终止状态的容器删除
‘命令格式:’
docker rm [容器ID/名称]
‘例:’
docker ps -a
docker rm $(docker ps -aq)
docker ps -a
如果要删除一个正在运行的容器,可以添加“-f”选项以强制删除,但是不建议这么做,最好先停止容器再进行删除操作!
Docker 默认的存储目录在 /var/lib/docker,Docker 的镜像、容器、日志等内容全部都存储于此
可以单独使用大容量的分区来存储这些内容,并且一般选择建立 LVM 逻辑卷,从而避免 Docker 在运行的过程中发生存储目录容量不足的问题
面试题:
生产环境配置
{
graph": "/data/docker" //数据目录
"storage-driver": "overlay2", //存储引擎
"insecure-reqistries":"reqistry.access. redhat.com", ","quary.io"] //私有仓库
"registry-mirrors": ["https://加速镜像地址"] //镜像加速
"bip": "172.7.5.1/24", //docker网络
"exec-opts": ["native.cqroupdriver=systemd"] //启动时候的额外参数(驱动)
"live-restore": true //当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
}