文章目录
- 一、Docker简介、应用场景和优点
- 三、Docker核心概念
- 3.1 docker镜像(Images)
- 3.2 docker容器(Container)
- 3.3 docker仓库(Resoisitory)
- 3.4 docker主机(Host)
- 3.5 docker客户端(Client)
- 四、Docker安装及启停
- 4.1 查看centos版本(以centos为例)
- 4.2 升级软件包及内核(可选)
- 4.3 安装docker
- 4.4 启动docker
- 4.5 将docker服务设为开机启动
- 4.6 停止docker
- 五、Docker镜像常用操作命令
- 六、Docker容器常用操作命令
- 6.1 搜索镜像
- 6.2 下载镜像
- 6.3 根据镜像新建并启动容器
- 6.4 查看容器
- 6.5 停止容器
- 6.6 启动容器
- 6.7 重启容器
- 6.8 删除容器
- 6.8 查看容器日志
- 6.9 连接到正在运行容器
- 6.10 在运行的容器中执行命令
- 6.11 查看容器中正在运行进程
- 6.12 查看容器内部细节
- 6.13 容器和宿主机互相拷贝文件
- 6.14 更多操作命令
- 七、Docker端口映射
- 八、总结与瞻望
一、Docker简介、应用场景和优点
1.1 简介
- Docker是开源应用容器引擎,轻量级容器技术。
- 基于Go语言,并遵循Apache2.0协议开源
- Docker可以让开发者打包他们的应用、依赖包及配置文件打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux系统上,也可以实现虚拟化
- 容器完全使用沙箱技术,相互之间不会有任何接口
- 类似于虚拟机技术(vmware、vitural),但docker直接运行在操作系统(Linux)上,而不是运行在虚拟机中,速度快,性能开销极低
白话文,简介就是:
Docker支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像。
运行中的这个镜像称为容器,容器启动是非常快速的。类似windows里面的ghost操 作系统,安装好后什么都有了。
1.2 Docker应用场景
-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
1.3 Docker优点
-
简化程序:
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。 -
避免选择恐惧症:
如果你有选择恐惧症,还是资深患者。Docker帮你打包你的纠结!比如 Docker镜像;Docker镜像中包含了运行环境和配置,所以 Docker可以简化部署多种应用实例工作。比如 Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个镜像部署。 -
节省开支:
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
三、Docker核心概念
3.1 docker镜像(Images)
- 一个只读模板,可以用来创建容器,一个镜像可以创建多个容器
- Docker提供了一个很简单的机制来创建和更新现有的镜像,甚至可以直接从其他人那里获取做好的镜像直接使用
- 可以理解为Java中的类
3.2 docker容器(Container)
- 容器是从镜像创建的运行实例,也就是镜像启动后的一个实例称为容器,是独立运行的一个或一组应用
- docker利用容器来运行应用,他可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台
- 可以把容器看做是一个简易版的Linux(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序
- 可以理解为Java中通过类创建的实例
3.3 docker仓库(Resoisitory)
- 仓库是集中存放镜像文件的场所,类似git代码仓库等
- 仓库(Respository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器一般存放多个仓库,每个仓库又有多个镜像,每个镜像又有不同的标签(tag)
- 仓库分为公开仓库(public)和私有仓库(private)两种形式
- 最大的公开仓库是Docker Hub,国内的公开仓库有阿里云等
- 可以在本地网络创建一个私有仓库
- 当创建好自己的镜像后,可以通过push命令把它上传到公开或私有仓库
- 仓库的概念类似Git,仓库注册服务器可以理解为GitHub这种托管服务
3.4 docker主机(Host)
- 一个物理或虚拟的机器用来执行Docker守护进程和容器
3.5 docker客户端(Client)
- 客户端通过命令行或其他工具使用Docker API(https://docs.docker.com/reference/api/docker_remote_api)与Docker的守护进程进行通信
四、Docker安装及启停
4.1 查看centos版本(以centos为例)
Docker 要求 CentOS 系统的内核版本高于 3.10
通过命令:
uname -r
查看当前centos版本,如版本不符,需升级系统版本
4.2 升级软件包及内核(可选)
yum update
4.3 安装docker
yum install docker
4.4 启动docker
systemctl start docker
4.5 将docker服务设为开机启动
systemtctl enable docker
4.6 停止docker
systemtctl stop docker
五、Docker镜像常用操作命令
通常情况下,Docker的镜像都放在Docker的官网 Docker Hub上,点此前往官网
5.1 镜像检索
除了可以在Docker Hub上搜索镜像外,还可以通过命令docker search xxx进行搜索,下面以mysql为例:
docker search mysql
结果如下:
-
OFFICAL:是否是官方镜像 -
AUTOMATED:是否是自动构建的
另,docker search -参数含义:
-
-s 30:列出收藏数不小于指定值(此处为30)的镜像 -
--no-trunc:显示镜像完整描述信息(eg. DESCRIPTION字段完整展示) -
--automated:只列出automated build类型的镜像(利用dockerhub提供的自动化构建技术在服务端直接构建镜像会被标记为AUTOMATED)
5.2 镜像下载
下载命名为:docker pull 镜像名:tag
其中,
-
tag多为系统的版本,可选的,默认为least
eg.
docker pull mysql
5.3 镜像列表
获取已下载镜像列表命令:docker images
其中,
-
RESPOSITORY为镜像名 -
TAG为镜像版本 -
least代表最新版 -
IMAGE_ID为该镜像唯一ID -
CREATED为该镜像创建时间 -
SIZE为该镜像大小
docker images -参数含义:
-
-a:列出本地所有镜像,含中间镜像层 -
-q:只显示镜像ID -
--digests:显示镜像摘要信息 -
--no-trunc:显示完整的镜像信息(eg. 显示完整的IMAGE_ID信息)
5.4 镜像删除
删除指定镜像:
docker rmi image-id
删除多个镜像:
docker rmi mysql tomcat
删除所有镜像:
docker rmi $(docker images -q)
强制删除镜像:
docker rmi -f image-id:强制删除(当前镜像启动的容器正在运行中,是无法正常删除的,可以通过-f强制删除)
如果删除时不指定TAG,默认为最新版Least.
六、Docker容器常用操作命令
镜像运行起来后,称为容器。
可以理解为软件下载(下载QQ)–>安装(QQ)–>运行(QQ)的过程。
下面以Tomcat为例
6.1 搜索镜像
docker search tomcat
6.2 下载镜像
docker pull tomcat
6.3 根据镜像新建并启动容器
最简单的根据镜像新建并启动容器的命令如下:
docker run --name container-name -d image-name
运行一个容器,使用docker run命令即可。
另,docker run -参数含义:
-
-- name:为容器起一个名称 -
-d:detached,执行完这句命令后,控制台将不会阻塞,可以继续输入命令操作,不会阻塞,也就是启动守护式容器,如果执行docker run --name mycentos -it centos会进入启动容器的命令控制台,也就是启动交互式容器 -
-i:以交互方式运行容器,通常与-t搭配使用 -
-t:为容器重新分配一个伪输入终端,通常与-i搭配使用 -
-P:随机端口映射 -
-p:指定端口映射,后面会有端口映射详细讲解 -
image-name:要运行的镜像名称
如果以守护式方式启动centos容器,执行如下命令:docker run --name mycentos -d centos,会正常返回container-id,但是通过docker ps查看,却发现没有在运行,通过docker ps -a发现,原来已经停止了,这是为什么呢?
原因及解决方案详见:点我直达
6.4 查看容器
可通过如下命令,查看运行中的容器列表:
docker ps
-
CONTAINER ID:启动时生成的ID -
IMAGE:该容器使用的镜像 -
COMMAND:容器启动时执行的命令 -
CREATED:容器创建时间 -
STATUS:当前容器状态 -
PORTS:当前容器所使用的默认端口号 -
NAMES:启动时给容器设置的名称
另,docker ps -参数含义:
-a:查看所有容器,包括已停止运行的-q:静默模式,只显示容器编号-l:显示最近创建的容器-n 3:显示最近创建的num(此处为3)个容器--no-trunc:不截断输出,显示完整信息
6.5 停止容器
通过以下命令来停止运行中的容器:
docker stop container-name/container-id
强制停止容器(类似强制关机):
docker kill container-name/container-id
6.6 启动容器
通过以下命令启动容器:
docker start container-name/container-id
6.7 重启容器
通过以下命令启动容器:
docker restart container-name/container-id
6.8 删除容器
删除单个容器:
docker rm container-id
删除多个容器:
docker rm container-id container-id
删除所有容器:
docker rm $(docker ps -a -q )
另,docker rm -参数含义:
-f:强制删除,如果在运行中,先停止,再删除
6.8 查看容器日志
查看当前容器日志,可通过如下命令:
docker logs container-id/container-name
另,docker logs -参数含义:
-
-t:加入时间戳 -
-f:跟随最新的日志打印 -
--tail:显示最后多少条
6.9 连接到正在运行容器
docker attach container-id:连接到正在运行的容器
要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。
官方文档中说attach后可以通过CTRL-C来detach,但实际上经过我的测试,如果container当前在运行bash,CTRL-C自然是当前行的输入,没有退出;如果container当前正在前台运行进程,如输出nginx的access.log日志,CTRL-C不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。好在attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。
eg.
docker attach --sig-proxy=false 7f237caad43b
6.10 在运行的容器中执行命令
运行中的容器其实是一个功能完备的简易版Linux操作系统,所以我们可以像常规系统一样进行登陆及退出操作。
命令为:
docker exec -it container-id/container-name bash
退出命令为:
exit
exec和attach区别:
-
attach:直接进入容器启动命令的终端,不会启动新的进程 -
exec:在容器中打开新的终端,并且可以启动新的进程,可在宿主机中直接执行操作容器的命令,eg.docker exec -it 7f237caad43b ls /tmp
6.11 查看容器中正在运行进程
可用通过如下命令查看容器中正在运行进程:
docker top container-id/container-top
6.12 查看容器内部细节
可用通过如下命令查看容器内部细节,返回为json:
docker insepct container-id
6.13 容器和宿主机互相拷贝文件
宿主机拷贝文件到容器:
docker cp 文件 container-id:目标文件/文件夹
eg.
docker cp /tmp/suzhuji.txt 7f237caad43b:/tmp
将宿主机tem文件夹下suzhujia.txt文件拷贝到容器7f237caad43b中tmp目录中
从容器拷贝文件到宿主机:
docker cp container-id:目标文件/文件夹 宿主机目标文件/文件夹
eg.
docker cp 7f237caad43b:/tmp/yum.log /tmp
将容器7f237caad43b中tmp目录下yum.log拷贝到宿主机/tmp目录下
6.14 更多操作命令
更多命令可以参考https://docs.docker.com/engine/reference/commandline/docker/
七、Docker端口映射
7.1 启动做端口映射的容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P(大写) 或-p (小写) 参数来指定端口映射。启动容器的时候如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
Docker的端口映射通过-p或-P参数实现,命令如下:
docker run --name tomcat1 -d tomcat
docker run --name tomcat2 -d -p 8888:8080 tomcat
如上,就把主机端口8888请求映射到Docker容器内部端口8080了。
-p和-P区别为:
-P : 随机映射一个49000~49900的端口到内部容器开放的网络端口
-p : 可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器
执行完这两条命令后,通过docker ps查看:
通过PORTS可以看出,tomcat2是做了端口映射的,tomcat1是没进行映射过的。
分别通过浏览器访问:http://*.*.*.*:8080/ // tomcat1默认端口http://*.*.*.*:8888/ // 做过端口映射的Tomcat2,8888会转发请求到tomcat2的8080
结果如下:
第一个请求是无法请求到的,原因开篇处说过了。
第二个请求是可以正常进行请求的,会由tomcat2容器进行处理
7.2 端口映射格式
ip:hostport:containerport #指定ip、指定主机port、指定容器port
eg. docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
指定映射使用一个特定地址,比如 localhost地址 127.0.0.1
ip::containerport #指定ip、未指定主机port、指定容器port
eg. docker run -d -p 127.0.0.1::5000 training/webapp python app.py
绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口
还可以使用 udp 标记来指定 udp 端口
eg. docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
hostport:container #未指定ip port、指定主机port、指定容器port
eg. docker run -d -p 5000:5000 training/webapp python app.py
将本地的 5000 端口映射到容器的 5000 端口,默认会绑定本地所有接口上的所有地址
7.3 查看端口映射
可以通过如下命令查看容器映射了哪些端口及协议:
docker port container-id
示例:
[[email protected] ~]#docker port 46114af6b44e
8080/tcp -> 0.0.0.0:8888
[[email protected] ~]#docker port cea668ee4db0
如果返回空,则代表没进行端口映射。
7.4 小结
- 容器有自己的内部网络和 ip 地址,可以使用
docker inspect container-id可以获取所有的变量 - Docker 还可以有一个可变的网络配置
- -p 标记可以多次使用来绑定多个端口
eg.docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
八、总结与瞻望
8.1 总结
通过本篇,希望你可以清楚的了解
- Docker是什么,具有什么样的优势和应用场景
- Docker的安装及核心概念
- Docker容器及镜像常用命令
- Docker端口映射的原因及操作
在准备好这些枯燥的理论基础和基本命令后,就可以进行对Docker的进阶与实战篇了。