目录
Docker官方网址:Docker Documentation | Docker Documentation 英文地址
Docker中文网址:docker中文社区,docker帮助,docker手册,docker教程,docker安装手册 - docker中文社区 中文地址
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端 - 服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。Docker 容器通过 Docker 镜像来创建。
一、Docker 的安装(CentOS版)
Docker 的安装非常简单,执行以下两行命令即可:
# 更新yum软件管理器命令(非必须):
yum -y update
# 安装docker命令:
yum install -y docker
启动 Docker 命令:
# 启动docker
systemctl start docker
# 加入开机启动
systemctl enable docker
# 重启docker
systemctl restart docker
查看镜像命令:
docker images
查看容器命令:
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
二、Docker 镜像
什么是 Docker 仓库?
Docker 仓库类似于代码仓库,设计理念和 Git 非常相似,是 Docker 集中存放 Docker 镜像文件的场所。Docker 的仓库分为公开仓库和私有仓库,Docker Hub 是默认的仓库,由 Docker 公司自己维护,上面有数以万计的镜像,用户可以自由下载和使用。除了 Docker Hub,国内也有很多公开仓库,像阿里云,网易云等。Docker 也支持在本地网络内创建一个只能由自己访问的私有仓库。
1、为镜像配置阿里云加速器
配置阿里云镜像加速器,需要先登录阿里云官网,进入控制台,在左上角[三]打开菜单栏,在搜索框输入容器进行搜索,选择镜像服务,对应的地址下是各个操作系统的操作步骤,如图:
阿里文档中有针对不同服务器的操作步骤,下边摘录 CentOS 的操作步骤:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uu2wrqb2.mirror.aliyuncs.com"]
}
EOF
# 加载配置,并重启docker(如果不是root用户,前边需要加sudo获取权限)
sudo systemctl daemon-reload
sudo systemctl restart docker
tee指令:会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
2、镜像的相关操作
(1)获取 Docker 镜像
从公开仓库拉取镜像命令:
格式:docker pull [OPTIONS] NAME [:TAG]
[OPTIONS]:
-a, –all-tags: 从镜像仓库中下载所有被标记的镜像,默认否
–disable-content-trust:跳过验证,默认为真
NAME: 镜像的名字
TAG: 镜像的标签
例如:下载 JDK7 的镜像:
docker pull java:7
如果不指定 TAG 信息,则默认下载仓库最新版本的镜像,例如:
docker pull java
(2)查看 Docker 镜像
相关命令:
- 列出镜像: docker images 或 docker image ls
- 添加镜像标签: docker tag 镜像id或标签 新的标签名
- 查看详细信息: docker inspect 镜像 id 或标签 (可以查看资源绑定情况)
- 查看镜像历史: docker history 镜像id或标签
Docker tag 镜像 id 或标签、新的标签名
标识一个唯一的镜像有两种方式,一种是使用 IMAGE_ID,另一种是使用 REPOSITORY + TAG,如果不加 TAG,那么默认选择最新的镜像( TAG 为 latest )
(3)搜索 Docker 镜像
搜索官方仓库镜像命令:
格式:docker search [option] keyword
[OPTION]:
-f,--filer filer: 过滤输出内容
--format string: 格式化输出内容
--limit int: 限制输出结果个数,默认为 25个
--no-trunc: 不截断输出结果
例如:搜索带 nginx 关键字的镜像:
docker search nginx
例如:搜索官方提供的带 nginx 关键字的镜像,如下所示:
docker search --filter=is-official=true nginx
例如:搜索所有星级评价数超过 4 的关键词包括 elasticsearch 的镜像:
docker search --filter=stars=4 elasticsearch
# 限制只展示4条
docker search --filter=stars=4 --limit 4 elasticsearch
(4)删除和清理 Docker 镜像
使用 docker rmi 或 docker image rm 命令可以删除镜像,命令格式为:
docker rmi IMAGE [IMAGE] //其中IMAGE可以是标签或ID
例如,通过标签删除镜像:
docker rmi java:7
例如,通过 ID 删除镜像:
docker rmi 60f01f8052f5
可以通过 docker image prune 命令来进行清理,命令格式为:
格式:docker image prune [OPTIONS]
[OPTIONS]:
-a,-all: 删除所有无用镜像, 不光是临时镜像
-filter filter: 只清理符合给定过滤器的镜像
-f,-force: 强制删除镜像,而不进行提示确认
例如,自动清理临时的遗留镜像文件层:
docker image prune -f
3、创建 Docker 镜像
创建镜像主要有两种方式,分别是基于已有容器创建,基于 dockerFile 创建
(1)通过容器创建 Docker 镜像
基于已有容器创建,命令格式:
docker commit [OPTIONS] CONTAINER(容器ID) [REPOSITORY[:TAG]] (镜像名称和tag)
(2)基于 DockerFile 创建镜像
// TODO
4、存出和载入 Docker 镜像
存出镜像
可以使用 docker [image] save 命令操作:
# nginx-image.tar - 存出文件名; nginx:1 镜像名称和版本号
docker save -o nginx-image.tar nginx:1
或 (-o 可以替换成 >)
docker save > nginx-image.tar nginx:1
载入镜像
可以使用 docker [image] load 将存出的tar文件再载入到本地镜像库:
docker load -i nginx-image.tar
或
docker load < nginx-image.tar
5、导出和导入 Docker 镜像
导出镜像
可以使用docker export 命令操作:
docker export CONTAINER > java-image.tar
导入镜像
可以使用docker import 将存出的tar文件再导入到本地镜像库:
docker import < java-image.tar
导出 export 与 保存 save 的区别
- save 操作的镜像,exprot 操作的容器
- export 导出的镜像文件大小要小于 save 保存的镜像
- export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作,而save保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层
三、Docker 容器
1、创建、启动、停止、删除容器
#创建容器:
docker create [options] 镜像id或标签
#启动容器:
docker start 容器ID或名称
#停止容器:
docker stop 容器ID或名称
#删除容器:
docker rm 容器ID或名称
2、run命令
创建并启动一个容器,同时进行端口映射:
docker run -d -p 81:80 --name nginx d1a364dc548d
创建并启动容器:
docker run [options] 镜像id或标签
例如,创建并启动一个容器:
docker run --name n1 nginx:2
例如,直接进入容器伪终端进行操作:
docker run -it --name n2 nginx:2 /bin/bash
例如,进接进入容器伪终端进行操作: -d 为后台启动
docker run -d --name n3 nginx:2
3、进入 Docker 容器
在使用 -d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作,这个时候如果需要进入容器进行操作的话,可使用 exec 命令:
docker exec -it 容器id或名称 /bin/bash
4、暂停、恢复和查看 Docker 容器
暂停和恢复容器
# 暂停容器:
docker pause 容器ID或名称
# 恢复容器:
docker unpause 容器ID或名称
查看容器:
# 查看容器详情:
docker inspect 容器ID和名称
# 查看容器内进程
docker top 容器ID和名称
# 查看统计信息
docker stats 容器ID和名称
5、文件复制和映射端口查看
(1)从宿主机拷文件到容器里面
格式:docker cp [options] 宿主机文件 容器ID或名称:容器路径
[options]:
-a:打包模式,复制文件会带有原始的uid/gid信息
-L:跟随软链接,当原路径为软链接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
(1)从容器里面拷文件到宿主机
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
查看变更:
docker diff 容器ID或名称
查看端口映射:
docker port 容器ID或名称
四、Docker 的数据管理
容器中的管理数据主要方式:使用数据卷( Volume ),容器内数据直接映射到本地主机环境。
数据卷的特点:
- 数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 linux 系统中的挂载(mount)行为
- 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
- 对数据卷的更新不会影响镜像,解耦容器和容器产生的数据
- 卷会一直存在,直到没有容器使用,才可以安全地卸载它
volume(数据卷)有两种类型:
一种是由用户自行维护的挂载目录,这种卷就必须由用户手动去处理所有权限问题,如果没有处理好权限可能会经常碰到 Permission Denied 等问题,这就需要用户对 linux 的权限设置要有一定的了解。
另一种卷是由 docker 进行管理维护的,因此使用该卷,你可以不必处理各种权限的问题,docker引擎在建立卷时会自动添加安全规则,以及根据挂载点调整权限。并且可以对多个卷进行统一的管理。
1、nginx 挂载示例 - 自行维护挂载目录
(1)nginx 配置信息在容器中的位置
- 日志位置:/var/log/nginx/
- 配置文件位置:/etc/nginx/
- 项目位置:/usr/share/nginx/html
(2)创建将要挂载的目录和文件
mkdir -p /usr/nginx/{conf,html,logs}
注意,如果要挂载成功,宿主机必须要先具备对应的文件或相同的文件夹结构,可以使用先复制后挂载来实现,如:
# 复制对应的日志文件到相关文件夹下
docker cp mynginx:/var/log/nginx/access.log /usr/nginx/logs
docker cp mynginx:/var/log/nginx/error.log /usr/nginx/logs
(3)启动容器,并进行挂载
docker run -v /宿主机绝对路径目录:/容器内目录 镜像名
将配置文件(nginx 端口映射已提前修改为 8081),html 目录,logs 目录进行挂载,最后的 nginx 为镜像名称(也可替换成镜像 ID ):
// 注意分行
docker run -d -p 8082:8081 --name mynginx
-v /usr/nginx/conf/conf.d:/etc/nginx/conf.d
-v /usr/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /usr/nginx/html:/usr/share/nginx/html
-v /usr/nginx/logs:/var/log/nginx/
nginx
注:如果提示有权限问题,可以加入下列参数:
--privileged=true
在宿主机 html 文件夹下添加新的网页,test.html,用来验证是否挂载成功:
页面内容如下:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>hello docker!</h1>
<h2>This is a test docker !</h2>
</body>
</html>
访问结果:
2、nginx 挂载示例 - 创建数据卷
(1)先创建数据卷:
docker volume create --name 数据卷名称
(2)查看数据卷信息:
docker inspect 数据卷名字
(3)删除数据卷:
docker volume rm 数据卷名字
这里我根据日志、html 页面、以及配置目录,分别创建了三个数据卷。
创建数据卷的好处就是不用把文件一个一个去跟容器里边的文件一一对应,不用去复制,挂载后,容器中的文件会自动在宿主机的挂载文件夹下同步
(4)启动容器并挂载:
docker run -d -p 8083:8081 --name mynginx3
-v nginxconf:/etc/nginx/
-v nginxhtml:/usr/share/nginx/html
-v nginxlogs:/var/log/nginx/
nginx
注意:如果是原生 nginx 镜像默认端口号是 80,像我如上启动后,并不能正常访问,因此,我们需要先停掉容器,然后更改配置的端口号为 8081,再重新启动就可以了。
(5)测试
容器启动后查看容器详情:
docker inspect mynginx3
其中我们可以看到我们刚才的挂载目录:
进入此目录,如第一种方法,我们同样在此目录中加入测试的网页 test.html
访问结果如下:
至此,Docker 的基本操作介绍完毕。