文章目录
1.什么是Docker
介绍
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离,从而实现快速交付软件。借助Docker,您可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker快速交付,测试和部署代码的方法,可以显着减少你从编写代码到在生产环境中运行这些代码之间的时差。在学习Docker中以下4个概念需要知道
-
镜像(Image)
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、依赖库、资源、配置文件、运行时的配置参数(如:匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 -
容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义容器只读模板,容器是镜像运行时的具体实体。容器可以被创建、启动、停止、删除、暂停、重、重启等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间(namespace),具有隔离性。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间等。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全,从此再也不用担心本地多个应用需要不同版本的依赖导致的冲突问题了。
- 仓库(Repository)
镜像构建完成后,一般会在当前宿主机上,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样一个服务,用来保存镜像。它与我们常用的maven reopsitory是一个类似的东西,只是装的东西不同而已。
每个Docker Registry可以包含多个仓库(Repository),一个仓库可以内可以有同一个软件不同版本的镜像。为了对同一镜像不同版本进行区分,每个镜像都有一个对应的标签(tag)用于标记其版本。我们可以通过
<仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
- Docker 架构
Docker使用客户端-服务器架构。主要包含通过Docker客户端(client)和Docker守护进程(daemon)两部分。Docker客户端客户端是许多Docker用户与Docker交互的主要方式,负责与守护进程进行对话。Docker 守护进程则侦听Docker API请求并管理Docker对象(镜像、容器、卷等)。Docker客户端和守护程序可以在同一系统上运行,您也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。
特点
1、更快速的交付和部署
开发者可以使用一个标准的Docker镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器以及快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器轻,且启动速度快,可以大量地节约开发、测试和部署的时间。
2、更高效的虚拟化
Docker 容器在运行时,不需要额外的虚拟机程序的支持。由于它是内核级的虚拟化,所以可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人计算机和服务器等。这种良好的兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个平台,十分有利于应用的迁移和扩展。
4、更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
除上述几个特点外,Docker还具有实现逻辑分离、适合与面向服务的架构配合使用等特点。
2.基本使用
系统命令
systemctl [option] docker
系统命令选项值
启动:start
关闭:stop
重启: restart
开机自启: enable
查看运行状态:status
查看docker版本号信息
docker version
docker info
帮助命令
如果忘记了部分docker命令可使用帮助命令进行查看
docker --help
查看某一个命令具体的参数
docker images --help
查看镜像、容器、数据卷所占空间
docker system df
获取容器或镜像的详细信息(元数据)
docker inspect [镜像名]
镜像命令
查看镜像列表
docker images
输出参数 | 说明 |
---|---|
REPOSITORY | 表示镜像的仓库源 |
TAG | 镜像的标签版本号 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
搜索镜像
docker search --limit 5 [名称] #查询[名称]前5个的镜像信息
输出参数 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 描述 |
STARS | 点赞数 |
OFFICIAL | 是否是官方的 |
AUTOMATED | 是否是自动构建的 |
拉取镜像
docker pull [镜像名字] #默认拉取最新版本
docker pull [镜像名字]:[TAG] #拉取指定版本的镜像
版本号相关信息可以前往docker仓库中搜索查看:https://hub.docker.com/
删除镜像
docker rmi 镜像ID #删除单个
docker rmi 镜像ID:镜像ID #删除多个
容器命令
启动容器
docker run [option] [NAME:TAG或IMAGE ID]
启动容器常用选择值
选项 | 描述 |
---|---|
–name | 指定名称 |
-v | 挂载文件 |
-p | 端口映射 |
-d | 后台运行 |
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
以启动nginx镜像为例
1.启动一个用于复制文件的 nginx 容器
docker run --name test-nginx -p 80:80 -d nginx
2.在虚拟机中创建目录
mkdir -p /dataFile/nginx/7015/html /dataFile/nginx/7015/conf.d /dataFile/nginx/7015/logs
3.将 nginx 容器内数据复制到存放数据的文件目录
#复制全局配置文件
docker cp test-nginx:/etc/nginx/nginx.conf /dataFile/nginx/7015
#复制默认server配置文件
docker cp test-nginx:/etc/nginx/conf.d /dataFile/nginx/7015/conf.d
4.关闭并删除测试容器
docker stop test-nginx
docker rm test-nginx
5.重新创建并启动nginx容器,并设置挂载目录
docker run --privileged=true -e TZ="Asia/Shanghai" -it -d --name my-nginx -p 7015:7015 -v /dataFile/nginx/html:/usr/share/nginx/html -v /dataFile/nginx/nginx.conf:/etc/nginx/nginx.conf -v /dataFile/nginx/conf.d:/etc/nginx/conf.d -v /dataFile/nginx/logs:/var/log/nginx 904b8cb13b93
命令 | 描述 |
---|---|
-p 7015:7015 | 将宿主机7015端口映射到容器7015端口 |
–name my-nginx | 容器的名字 |
-v /dataFile/nginx/7015/nginx.conf:/etc/nginx/nginx.conf | 挂载nginx.conf配置文件 |
-v /dataFile/nginx/7015/conf.d:/etc/nginx/conf.d | 挂载nginx配置文件 |
-v /usr/local/docker/nginx/log:/var/log/nginx | 挂载nginx日志文件 |
-v /dataFile/nginx/7015/html:/usr/share/nginx/html | 挂载nginx内容 |
904b8cb13b93 | nginx镜像的Id |
–privileged=true | container内的root拥有真正的root权限 |
-e TZ=“Asia/Shanghai” | 设置时区 |
-it | i:即使没有连接也要保持标准输入保持打开状态 t:分配一个伪tty |
-d | 在后台运行容器,并且打印容器id |
nginx拓展:当已启动的nginx容器需要额外绑定宿主机端口时可通过修改配置文件实现
1、查看容器ID
# 获取容器/镜像的元数据
docker inspect 0ac8324a9b95
2、修改前先停掉容器,否则自动还原
docker stop 0ac8324a9b95
3、根据得到的容器id进入到容器目录,修改配置文件 hostconfig.json、 config.v2.json
cd /var/lib/docker/containers/[containerId]
hostconfig.json 文件需要修改的地方
#省略
"PortBindings":{
"7015/tcp":[
{
"HostIp":"",
"HostPort":"7015"
}
],
#复制一个配置项修改为7016
"7016/tcp":[
{
"HostIp":"",
"HostPort":"7016"
}
]
}
#省略
config.v2.json 文件需要修改的地方
#省略
"Ports":{
"7015/tcp":[
{
"HostIp":"0.0.0.0",
"HostPort":"7015"
}
],
#复制一个配置项修改为7016
"7016/tcp":[
{
"HostIp":"0.0.0.0",
"HostPort":"7016"
}
]
}
#省略
4、保存、退出、重启容器
# 重启docker服务
sudo systemctl restart docker.service
# 启动容器
docker start 0ac8324a9b95
完成以上4个步骤,已重新为nginx容器添加新的端口映射了。
进入运行的容器
在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止
docker exec -it [容器ID] /bin/bash
直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止
docker attach [容器ID]
退出容器
方式 | 说明 |
---|---|
输入exit | 快捷键ctrl+d | exit退出,容器停止 |
先按 ctrl + p,再按 q | ctrl+p+q退出,容器不停止 |
启动|重启|停止容器
docker [option] [容器ID或者容器名]
选项 | 说明 |
---|---|
start | 启动容器 |
restart | 重启容器 |
stop | 停止容器 |
kill | 强制停止容器 |
删除已停止的容器
docker rm [容器ID]
查看容器日志
docker logs [容器ID]
查看容器内运行的进程
docker top [容器ID]
获取容器/镜像的元数据
docker inspect [NAME|ID]
容器内拷贝文件到宿主机
docker cp [容器ID]:[容器内路径] [目的宿主机路径]
导入|导出镜像
save: 导出镜像
docker save -o [镜像名].tar [镜像名|ID]
load:导入镜像
docker load -i [镜像名].tar
导入|导出容器
export:导出容器内容并生成tar文件
docker export [容器ID] > [文件名].tar
import :从tar包中的内容创建一个新的文件系统再导入为镜像
cat [文件名].tar | docker import - [镜像用户|镜像名]:[镜像版本号]
容器内拷贝文件到宿主机
docker cp [容器ID]:[容器内路径] [目的宿主机路径]
导入|导出镜像
save: 导出镜像
docker save -o [镜像名].tar [镜像名|ID]
load:导入镜像
docker load -i [镜像名].tar
导入|导出容器
export:导出容器内容并生成tar文件
docker export [容器ID] > [文件名].tar
import :从tar包中的内容创建一个新的文件系统再导入为镜像
cat [文件名].tar | docker import - [镜像用户|镜像名]:[镜像版本号]