镜像与容器
当我们使用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境,配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)
总结来说:docker的镜像做到了忽略操作系统环境,忽略系统本身的差异去直接部署,Docker会在运行镜像时创建一个隔离环境,docker类似于Windows系统,就相当于在电脑中有下了一个小系统,里面独立运行程序。
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:DockerHub
主要流程:下载镜像运行,形成容器。
如何找到想要的镜像?
在docker服务端执行一个命令即可。
主要执行流程:
在docker客户端输入命令,docker daemon的守护进程会监听该命令,再去对应的镜像仓库去拉去镜像,下载到本地运行,运行时会为镜像区创建一个隔离的环境称之为容器,多个容器之间相互隔离,可以进行多实例部署,形成集群,相互之间没有干扰,也可以在一个服务上去部署多个不同应用的实例,不需要担心相互干扰的问题,搭建集群部署整个复杂的微服务应用非常方便。
总结:有了docker的镜像和容器,运维在部署时就忽略了系统的差异以及应用之间的干扰,节省了非常多的时间。
命令解读
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \mysql
第一行 docker run
是命令的起始,所有的docker命令都是以docker为前缀,后面的run是一个子命令,docker命令下有很多很多的子命令,
-
docker run :创建并运行一个容器,-d 是让容器在后台运行,命令结束后,MySQL的进程以及它的容器会持续保持一个运行状态,就不会用影响正常工作,因此
docker run -d
可以认为成一套配套的指令。 -
--name MySQL:给容器起个名字,必须唯一
-
-p 3306:3306:设置端口映射 宿主机端口:容器内端口。容器内端口取决于进程,不需要改动,宿主机的端口可以改变,如果要布置集群的话,就需要改变宿主机端口,防止端口冲突
举例说明:
例如配置一台虚拟机的IP地址为192.168.88.130,我们可以访问到该IP地址,是可以ping通的。
而配置在这台虚拟机上的容器是一个隔离的环境。
比如部署MySQL容器,MySQL启动端口为3306,但是容器是隔离环境,有自己独立的内存空间,有自己独立的文件系统,也有自己独立的网络空间。因此这个MySQL容器中的京城一旦启动,会有自己的IP地址,这个网络空间对外是不可访问的。
因此MySQL客户端无法直连该容器的端口,但是可以连接容器外的虚拟机,即宿主机,为了连接该容器,需要去做一个端口的映射,可以将宿主机的3306端口跟容器的3306端口做一个映射。
因为容器是由docker来控制的,内部完全可以做好这个映射,这样,当客户端访问外部宿主机的3306端口时,docker就会将请求转到容器的3306端口,这样就间接的访问到了容器。即MySQL客户端连接jdbc:mysql://192.168.88.130就能连接到宿主机的3306端口,请求就会转到容器内,这样就实现间接访问了。
这就是端口映射的作用。
-
-e KEY = VALUE:设置环境变量,环境变量是由镜像内部去执行容器时用到的,因此是由镜像来决定的,比如现在是MySQL的容器,MySQL官方规定将来需要怎样的环境变量,这是由镜像制作者去规定的。需要去镜像文档中查看。
-
mysql:指定运行的镜像的名字 docker run 一执行,docker的守护进程会帮助我们搜索和下载并且部署应用,而这些都需要靠容器名来指定。
镜像命名规范
-
镜像名称一般分为两部分组成:[repository]:[tag]
-
其中repository就是镜像名
-
tag是镜像的版本
-
-
在没有指定tag时,默认是latest,代表最新版本的镜像
Docker基础
常见命令
Docker最常见的命令就是操作镜像、容器的命令,详情可见官方文档:Docker 文档
-
docker pull:拉去镜像,从镜像仓库中下载镜像到本地镜像中
-
docker images :查看所有本地镜像
-
docker rmi :删除指定本地镜像
-
docker build:自定义镜像:需要定义一个docker file 基于docker file文件使用 docker build来完成构建
-
docker save:将打包好的镜像通过save命令保存到本地变成压缩文件,和docker load配合可以将镜像传递,但是使用较少
-
docker load:将压缩好的镜像解压
-
docker push:将本地镜像推到镜像仓库,镜像仓库可以是公用,也可以私用,
以上都是镜像的相关操作
镜像最终要去创建对应的容器还要运行
-
docker run:创建容器并运行,该命令为自动化,如果发现镜像不存在,会先去拉取镜像,之后再自动创建容器,再去运行
-
docker stop:停止容器运行(停止的是容器内部的那个进程),容器还在。
-
docker start:启动容器,将容器内部的停止的进程再次启动
注意事项:docker run每执行一次就会创建一个容器并运行,而docker start只是启动已有容器中停止的进程,不会创建容器。
-
docker ps:查看容器的运行状态 ps(进程状态)
-
docker rm: 删除容器
-
docker logs:查看容器日志
-
docker exec:执行一些命令进入容器的内部,有时需要对容器做修改,可以通过该命令进入容器,进行一些处理
以上就是docker的常用命令了
案例演示:查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器
需求:
-
在DockerHub中搜索Nginx镜像,查看镜像的名称
-
拉取Nginx镜像
-
查看本地镜像列表
-
创建并运行Nginx容器
-
查看容器
-
停止容器
-
再次启动容器
-
进入Nginx容器
-
删除容器
实现步骤:
首先去浏览器查看https://hub.docker.com/,寻找Nginx镜像
执行命令
测试压缩功能
解压功能
创建并运行容器,并查看运行状态
停止容器运行
注意事项:默认情况下 docker ps 查看的是运行中的容器,如果想要查看所有容器状态,就需要去添加 -a 参数
再次启动
以上就是容器的一些基本操作
除此之外还可以查看日志
如果想要一直查看该容器日志,就需要加上参数 - f
主要用在调试场景。
还可以进入容器的内部来操作:
-it 指添加一个可输入的终端 后面跟容器名 进入容器内部后,使用bash命令来进行交互
在容器内部,docker容器模拟了一个计算机,有独立网络,内存,文件系统。
就是独立的Linux系统。
注意事项:不能删除一个正在运行中的容器,可以选择停止运行容器后删除,或者加上 - f 强制删除。
以上就是在docker中常用的命令。
希望对大家有所帮助