目录
目标
- 了解镜像、容器、虚拟机之间的区别。
- 通过Docker官方文档学习并掌握Docker基础命令。
概述
Docker
官方定义
Docker overview
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker's methodologies for shipping, testing, and deploying code, you can significantly reduce the delay between writing code and running it in production.
翻译
Docker 概述
Docker是一个用于开发、发布和运行应用程序的开放平台。Docker可让您将应用程序与基础架构分离,以便快速交付软件。借助Docker,您可以像管理应用程序一样管理基础架构。通过利用Docker 的发布、测试和部署代码方法,您可以显著减少编写代码和在生产中运行代码之间的延迟。
镜像(Image)
官方定义
An image is a read-only template with instructions for creating a Docker container.
翻译
镜像是一个只读模板,其中包含创建Docker容器的说明。
备注
镜像包含了应用程序、库、环境变量、配置文件等内容,它是静态不可变的。
容器(Container)
官方定义
A container is a runnable instance of an image.
翻译
容器是镜像的可运行实例。
镜像VS容器
大家可以站在Java的角度,将镜像和容器的区别与类和实例化对象的区别做类比:
- 镜像定义了容器的文件系统和配置,就像Java类定义了对象的属性和方法。
- 容器是镜像的运行实例,具有独立的生命周期。就像Java类的实例一样,也具备独立的生命周期。
- 一个镜像可以创建多个容器,一个类也可以实例化多个对象。
我们学习知识一定要学会类比和联想,举一反三才能事半功倍。
容器VS虚拟机
虚拟机 | 容器 | |
架构 | 虚拥有自己的虚拟化硬件和操作系统,运行时资源开销较大。 | 容器共享主机操作系统的内核,拥有独立的用户空间。因此启动容器资源开销小。 |
隔离性 | 硬件级别的隔离,更高的安全性和兼容性,但也带来了较高的资源开销。 | 进程级别的隔离,隔离程度不如虚拟机高,但足以满足大多数应用场景的需求。 |
启动速度 | 慢 | 快 |
官方文档
指南 | Docker 文档https://docs.docker.com/guides/
Docker 镜像仓库 | Docker Hubhttps://hub.docker.com/
Docker 源代码仓库https://github.com/docker
基础命令
镜像
搜索镜像
docker search 镜像名称
下载镜像
#默认下载最新版本
docker pull 镜像名称
#下载指定版本,建议先去Docker仓库去找版本号。Docker可能会提示不支持下载过时的版本。
docker pull 镜像名称:版本号
查看已安装的镜像
docker images
docker image ls
删除镜像
#删除版本为latest版本的镜像
docker rmi 镜像名称
#删除指定的镜像
docker rmi 镜像名称:版本号
docker rmi 镜像ID
查看镜像详细信息
docker inspect 镜像名称:版本号
docker inspect 镜像ID
#不加版本号表示默认查询latest版本的镜像信息
docker inspect 镜像
删除镜像
#不加版本号默认删除latest版本的镜像
docker rmi 镜像名称
docker rmi 镜像名称:版本号
docker rmi 镜像ID
容器
查看所有容器
#运行中的容器
docker ps
#所有容器
docker ps -a
创建并启动容器
#前台运行,不能关闭窗口,默认运行latest版本,如果没有这个版本就会去下载最新版本的镜像然后创建并启动一个容器
docker run 镜像名称
#前台运行,指定启动的版本号,如果没有这个版本就会去下载最新版本的镜像然后创建并启动一个容器。
docker run 镜像名称:版本号
docker run 镜像ID
#后台启动
docker run -d 镜像名称:版本号
docker run -d 镜像ID
#后台启动并映射端口
docker run -d -p 宿主机端口:容器端口 镜像名称:版本号
docker run -d -p 宿主机端口:容器端口 镜像ID
#后台启动并随机映射端口
docker run -d -p 容器端口 镜像名称:版本号
docker run -d -p 容器端口 镜像ID
#定义别名
docker run -d --name 容器名称 -p 容器端口 镜像名称:版本号
docker run -d --name 容器名称 -p 容器端口 镜像ID
#随即分配宿主机的端口,注意:这里的-P是大写。
docker run -d -P 镜像名称:版本号
docker run -d -P 镜像ID
启动容器(容器已经存在)
docker start 容器ID
docker start 容器名称
修改容器名称
docker rename 当前容器名称 新容器名称
停止容器运行
docker stop 容器ID
#这里要注意是容器名称,不是镜像名称。
docker stop 容器名称
删除容器
docker rm 容器ID
docker rm 容器名称
#强制删除运行中的容器
docker rm -f 容器ID
docker rm -f 容器名称
重启容器
docker restart 容器ID
docker restart 容器名称
查看容器详情
docker inspect 容器ID
docker inspect 容器名称
查看容器日志
docker logs 容器ID
docker logs 容器名称
查看容器实时输出
注意:这里并非查看容器的实时日志,只能查看到Docker的标准输出和标准错误。比如用这个命令去查看tomcat容器,虽然不停地访问tomcat,但是这个命令下却没有打印任何信息。这是因为tomcat的控制台信息往往写入到了catalina.out文件中。
docker attach 容器ID
docker attach 容器名称
进入容器交互式终端
docker exec -it 容器名称 /bin/bash
docker exec -it 容器ID /bin/bash
案例(以修改Tomcat默认启动端口为例)
第一步:创建容器。
第二步:进入容器内部,查看目录结构。
第二步:打开并修改配置文件。有些镜像是非常精简,缺失了很多命令。大家可以将容器中的文件复制到宿主机,在宿主机上修改完成以后再复制回去。
注意:很多同学复制完以后会马上查看容器中的server.xml,实际上还没有刷新。只有再次重启容器后才可以看到文件内容被改变。
第三步:重启容器。注意,重启之后再进入
docker restart tomcat8
第四步:访问tomcat容器。
http://8.142.137.51:8099/