第二章:Docker核心技术
目录Docker的核心技术内容很多,我们学习则从以下四个方面来介绍Docker的核心技术镜像、容器、数据、网络。
一、Docker镜像管理
1 镜像简介
Docker镜像是什么?镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。通过镜像可以创建一个或多个容器。
2 搜索、查看、获取
-
搜索镜像
#作用 搜索Docker Hub(镜像仓库)上的镜像 #命令格式: docker search [镜像名称] # 简单的搜索命令 #命令演示: $ docker search ubuntu #NAME:名称 #DESCRIPTION:基本功能描述 #STARS:下载次数 #OFFICIAL:官方 #AUTOMATED:自动的运行
-
获取镜像
#作用: 下载远程仓库(如Docker Hub)中的镜像 #命令格式: docker pull [镜像名称] #命令演示: $ docker pull ubuntu $ docker pull nginx #注释: #获取的镜像在哪里? 在/var/lib/docker 目录下 #由于权限的原因我们需要切换root用户,那我们首先要重设置root用户的密码: $ sudo passwd root #这样就可以设置root用户的密码了。 #之后就可以自由的切换到root用户了 :~$ su #输入root用户的密码即可。 #当然,如果想从root用户切换回一般用户,则可使用 su val(一般用户名) 或者直接输入exit退出,返回普通用户 su yangyi #操作下面的文件可以查看相关的镜像信息 :~$ sudo cat /var/lib/docker/image/overlay2/repositories.json
查看镜像:
docker images
,与/var/lib/docker/image/overlay2/repositories.json
相对应。 -
查看镜像
#作用: 列出本地镜像 #命令格式: docker images [镜像名称] # 查看指定名字的镜像内容 docker image ls [镜像名称] # []代表可选 #命令演示: $ docker images # 查看本机所有的镜像 $ docker images ls # 查看本机所有的镜像 #镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息 #docker images -a 列出所有的本地的images(包括已删除的镜像记录) #REPOSITORY:镜像的名称 #TAG :镜像的版本标签 #IMAGE ID:镜像id #CREATED:镜像是什么时候创建的【别人传到仓库的时间】 #SIZE:大小
3 重命名、删除
-
镜像重命名
#作用: 对本地镜像的NAME、TAG进行重命名,并新产生一个命名后镜像【并不会生成一个新的镜像】 #命令格式: docker tag [老镜像名称]:[老镜像版本][新镜像名称]:[新镜像版本] #命令演示: $ docker tag nginx:latest panda-nginx:v1.0
-
删除镜像
#作用: 将本地的一个或多个镜像删除 #命令格式: docker rmi [命令参数][镜像ID] docker rmi [命令参数][镜像名称]:[镜像版本] docker image rm [命令参数][镜像] #命令演示: $docker rmi 3fa822599e10 # 可通过 docker rmi 3fa822599e10 123456789删除多个镜像 $docker rmi mysql:latest #注意: 如果一个image_id存在多个名称,那么应该使用 名称:版本 的格式删除镜像 #命令参数(OPTIONS): -f, --force # 强制删除
如果名称不同,ID不同,则不能根据ID进行删除,需要根据名称删除。
4 镜像导入、导出
-
导出镜像
将已经下载好的镜像,导出到本地,以备后用。
#作用: 将本地的一个或多个镜像打包保存成本地tar文件 #命令格式: docker save [命令参数][导出镜像名称][本地镜像镜像] #命令参数(OPTIONS): -o, --output string 指定写入的文件名和路径 #导出镜像【打包到本地目录】 :~$ docker save -o ubuntu_test.tar ubuntu
-
导入镜像
#作用: 将save命令打包的镜像导入本地镜像库中 #导入镜像命令格式: $ docker load [命令参数][被导入镜像压缩文件的名称] $ docker load < [被导入镜像压缩文件的名称] $ docker load --input [被导入镜像压缩文件的名称] #命令参数(OPTIONS): -i, --input string 指定要打入的文件,如没有指定,默认是STDIN #为了更好的演示效果,我们先将nginx的镜像删除掉 docker rmi ubuntu:latest #导入镜像文件: $ docker load < ubuntu_test.tar # 或者 $ docker load --input ubuntu_test.tar #注意: 如果发现导入的时候没有权限需要使用chmod命令修改镜像文件的权限
虽然导出的时候进行了重命名,但是镜像原来叫什么名字,现在还叫什么名字。
5 镜像历史、详细信息、创建
-
查看镜像历史
#作用: 查看本地一个镜像的历史(历史分层)信息 #查看镜像命令格式: docker history [镜像名称]:[镜像版本] docker history [镜像ID] #我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker history这条命令来获取我们想要的信息 $ docker history sswang-nginx:v1.0 #IMAGE:编号 #CREATED:创建的 #CREATED BY :基于那些命令创建的 #SIZE:大小 #COMMENT:评论
-
镜像详细信息
#作用: 查看本地一个或多个镜像的详细信息 #命令格式: $ docker image inspect [命令参数] [镜像名称]:[镜像版本] # 或者省略image $ docker inspect [命令参数] [镜像ID] #查看镜像详细信息: $ docker inspect ubuntu
-
根据模板创建镜像
#登录系统模板镜像网站: #https://download.openvz.org/template/precreated/ #找到一个镜像模板进行下载,比如说ubuntu-16.04-x86_64.tar.gz,地址为: #https://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz #命令格式: cat 模板文件名.tar | docker import - [自定义镜像名] # 读取内容,通过管道符,导入docker自定义镜像中 #演示效果: $ cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu-mini # ubuntu-mini自定义的镜像名称
6 小结
二、Docker容器管理
docker容器技术指Docker是一个由GO语言写的程序运行的“容器”(Linux containers,LXCs)
containers的中文解释是集装箱。
Docker则实现了一种应用程序级别的隔离,它改变我们基本的开发、操作单元,由直接操作虚拟主机(VM),转换到操作程序运行的“容器"上来。
1 容器简介
-
容器是什么?
容器(Container):容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何地方以相同的方式运行。
Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例,容器具备一定的生命周期。
另外,可以借助
docker ps
命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。我们就可以理解容器就是被封装起来的进程操作;只不过现在的进程可以简单也可以复杂,复杂的话可以运行1个操作系统,简单的话可以运行1个回显字符串。
-
容器和虚拟机的相同点
-
容器和虚拟机一样,都会对物理硬件资源进行共享使用。
-
容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
-
容器中或虚拟机中都可以安装各种应用,如redis、mysql、nginx等。也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样。
-
同虚拟机一样,容器创建后,会存储在宿主机上: linux上于
/var/lib/docker/containers
下
-
-
容器与虚拟机的不同点?
注意:容器并不是虚拟机,但它们有很多相似的地方
- 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合。
- 容器是轻量级的,虚拟机是重量级的。
- 首先容器不需要额外的资源来管理,虚拟机额外更多的性能消耗;
- 其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。
- 也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。
虚拟机的生命周期:
Docker容器的生命周期:
2 容器查看、创建、启动
-
查看容器
#作用 显示docker容器列表 #命令格式: docker ps # 查看正在运行的容器 #命令演示: $ docker ps #CONTAINER ID 容器ID #IMAGE 基于那个镜像 #COMMAND 运行镜像使用了哪些命令? #CREATED多久前创建时间 #STATUS 开启还是关闭 #PORTS端口号 #NAMES容器名称默认是随机的,【需要自己指定容器名称】 #注意: 管理docker容器可以通过名称,也可以通过ID ps是显示正在运行的容器, -a是显示所有运行过的容器,包括已经不运行的容器
-
创建待启动容器
#作用: 利用镜像创建出一个Created 状态的待启动容器 #命令格式: docker create [OPTIONS] IMAGE [COMMAND] [ARG...] docker create [参数命令] 依赖镜像 [容器内命令] [命令参数] #命令参数(OPTIONS):查看更多 -t, --tty 分配一个伪TTY,也就是分配虚拟终端 -i, --interactive 即使没有连接,也要保持STDIN打开 --name 为容器起名,如果没有指定将会随机产生一个名称 #命令参数(COMMAND\ARG): COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令 ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等 #创建容器(附上ls命令和a参数) docker create -it --name ubuntu-1 ubuntu ls -a # 这里直接将容器启动的命令都写了?
-
启动容器
启动容器的三种方式:
- 启动待启动或已关闭容器
- 基于镜像新建一个容器并启动
- 守护进程方式启动docker
#作用: 将一个或多个处于创建状态或关闭状态的容器启动起来 #命令格式: docker start [容器名称]或[容器ID] #命令参数(OPTIONS): -a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上【标准输出和标准错误】 -i, --interactive 将当前shell的 STDIN连接到容器上【标准输入】 #启动上面创建的容器 docker start -a ubuntu-panda
启动完docker,执行完一大堆命令,就推出了,那么如何让它不退出呢?
-
创建新容器并启动
#作用: 利用镜像创建并启动一个容器 #命令格式: docker run [命令参数] [镜像名称][执行的命令] 命令参数(OPTIONS): -t, --tty 分配一个伪TTY,也就是分配虚拟终端 -i, --interactive 即使没有连接,也要保持STDIN打开 --name 为容器起名,如果没有指定将会随机产生一个名称 -d, --detach 在后台运行容器并打印出容器ID --rm 当容器退出运行后,自动删除容器 #启动一个镜像输出内容并删除容器【将是创建一个镜像对象,执行完一步操作,就把容器退出了】 $ docker run --rm --name nginx1 nginx /bin/echo "hello docker" #注意: docker run 其实 是两个命令的集合体 docker create + docker start
-
守护进程方式启动容器【常用的方式】
更多的时候,需要让Docker容器在后台以守护形式运行。此时可以通过添加
-d
参数来实现。#命令格式: docker run -d [image_name] command ... # -d让容器在后台运行,并且打印出容器ID #守护进程方式启动容器: $ docker run -d --name nginx01 nginx
问题:这里以守护进程方式启动,但还是容器退出了?
Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行top,ping),就是会自动退出的。
此处,使用nginx即可创建正常运行的容器。
3 暂停、取消暂停、重启
-
容器暂停
#作用: 暂停一个或多个处于运行状态的容器 #命令格式: docker pause [容器名称]或[容器ID] #暂停容器 docker pause b8837790abb6
-
重启
#作用: 重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器 该命令相当于stop和start命令的结合 #命令格式: docker restart [容器名称]或[容器ID] #命令参数(OPTIONS): -t, --time int 重启前,等待的时间,单位秒(默认 10s) #恢复容器 docker restart -t 20 b8837790abb6
4 容器关闭、终止、删除
-
关闭容器
在生产中,我们会以为临时情况,要关闭某些容器,我们使用stop命令来关闭某个容器。
#作用: 延迟关闭一个或多个处于暂停状态或者运行状态的容器【不是立即执行的,如果处理完,会立即完,如果没有处理完,会处理完之后删除】 #命令格式: docker stop [容器名称]或[容器ID] #关闭容器: $ docker stop b8837790abb6
-
终止容器
#作用: 强制并立即关闭一个或多个处于暂停状态或者运行状态的容器 #命令格式: docker kill [容器名称]或[容器ID] #终止容器 $ docker kill 8005c40a1d16
-
删除容器
删除容器有三种方法:
- 正常删除--删除已关闭的;
- 强制删除--删除正在运行的;
- 强制批量删除--删除全部的容器
-
正常删除容器
#作用: 删除一个或者多个容器 #命令格式: $ docker rm [容器名称]或[容器ID] #删除已关闭的容器: $ docker rm nginx01
Error response from daemon: You cannot remove a running container c7f5e7fe5aca00e0cb987d486dab3502ac93d7180016cfae9ddcc64e56149fc9. Stop the container before attempting removal or force remove
错误响应守护进程:你不能删除一个容器 c7f5e7fe5aca00e0cb987d486dab3502ac93d7180016cfae9ddcc64e56149fc9运行。在尝试拆卸或强制拆卸之前,先停止容器。
-
强制删除正在运行的容器
#作用: 强制删除一个或者多个容器 #命令格式: docker rm -f [容器名称]或[容器ID] #删除正在运行的容器 $ docker rm -f nginx01
-
批量关闭容器【不建议使用】
标签:02,容器,nginx,核心技术,宿主机,--,镜像,Docker,docker From: https://www.cnblogs.com/yangyi215/p/17367395.html