0、基础
概念
Docker是一个开源的容器引擎,基于LXC容器技术,使用Go语言开发。源代码托管在Github上,并遵从Apache2.0协议。
Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
简单来说:Docker就是一种快速解决生产问题的一种技术手段。
Docker 官网:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
Docker与虚拟机
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- docker启动快速属于秒级别。虚拟机通常需要几分钟去启动。
- docker需要的资源更少,docker在操作系统级别进行虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor层与内核层的虚拟化。
- docker更轻量,docker的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker运行的镜像数远多于虚拟机数量。对系统的利用率非常高。
- 与虚拟机相比,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离
- 安全性: docker的安全性也更弱。Docker的租户root和宿主机root等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户root权限和宿主机的root虚拟机权限是分离的,并且虚拟机利用如Intel的VT-d和VT-x的ring-1硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击。
- 可管理性:docker的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如VMware vCenter提供完备的虚拟机管理能力。
- 高可用和可恢复性:docker对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制,VMware可承诺虚拟机99.999%高可用,保证业务连续性。
- 快速创建、删除:虚拟化创建是分钟级别的,Docker容器创建是秒级别的,Docker的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间。
- 交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化;Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署;
virtualization 虚拟机结构
docker结构
优缺点
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile
使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB |
一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
缺点:
- 依赖操作系统
- 高度依赖网络
- 银行U盾等场景不能用
docker三大基本组件:镜像、容器、仓库
镜像:镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周 期中的“构建”部分。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像只是一个虚拟的概念,并不是非得由一个一个的文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础,采用分层存储的方式。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
容器:镜像(Image
)和容器(Container
)的关系,就像是面向对象程序设计中的 类
和 实例
一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root
文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在镜像基础上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
仓库:Docker Registry,镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个 仓库(Repository
);每个仓库可以包含多个 标签(Tag
);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest
作为默认标签。
以 Ubuntu 镜像 为例,ubuntu
是仓库的名字,其内包含有不同的版本标签,如,16.04
, 18.04
。我们可以通过 ubuntu:16.04
,或者 ubuntu:18.04
来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu
,那将视为 ubuntu:latest
。
仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy
,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
- Docker Registry 公开服务,是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOS 的 Quay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像使用的就是这个服务。由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(
Registry Mirror
),这些镜像服务被称为加速器。常见的有 阿里云加速器、DaoCloud 加速器 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库 等。
- 私有 Docker Registry,除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持
docker
命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能。除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,Harbor 和 Sonatype Nexus。
一、基础使用
国内软件源配置 https://blog.csdn.net/weixin_32820767/article/details/83820505
cd /etc/apt/ mv sources.list sources.list.bak vim sources.list # sohu shangdong deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse # 163 guangdong deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse # tsinghua.edu deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse # aliyun deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse partner deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse # neu.edu deb http://mirror.neu.edu.cn/ubuntu/ xenial main restricted universe multiverse partner deb http://mirror.neu.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse deb http://mirror.neu.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse deb http://mirror.neu.edu.cn/ubuntu/ xenial-security main restricted universe multiverse 安装依赖软件 apt-get update apt-get install apt-transport-https ca-certificates curl software-properties-common -y 使用官方推荐源 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 使用阿里云的源{推荐1} curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" 使用清华的源{推荐2} curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable" 检查 apt-get update
docker软件安装
apt-cache madison docker-ce # 查看支持的docker版本
apt-get install docker-ce -y # 安装docker
apt-get install docker-ce=<VERSION> -y # 可指定版本安装docker : apt-get install docker=5:18.09.0~3-0~ubuntu-xenial -y
启动docker
systemctl start docker
systemctl status docker
注意:ubuntu安装完毕后,默认就开启服务了
docker version # 测试docker
网卡区别:
安装前:只有ens33和lo网卡
安装后:docker启动后,多出来了docker0网卡,网卡地址172.17.0.1
docker服务命令格式:
systemctl [参数] docker # 参数详解:start 开启服务 stop 关闭 restart 重启 status 状态
删除docker命令:
apt-get autoremove remove docker-ce # 自动删除
# 单个手动删除
rm -rf /var/lib/docker/
rm -rf /etc/docker
基本目录
/etc/docker/ docker的认证目录
/var/lib/docker/ docker的应用目录
docker加速器
加速器简介 在国内使用docker的官方镜像源,会因为网络的原因,造成无法下载,或者一直处于超时。所以我们使用 daocloud 的方法进行加速配置。
访问 daocloud.io 网站,登录 daocloud 账户
终端执行命令 & 修改配置项
二、镜像管理
搜索镜像
命令格式:
docker search [image_name]
命令演示:
docker search ubuntu
获取镜像
命令格式:
docker pull [image_name] 或者 docker image pull [image_name]
命令演示:
docker pull Ubuntu 或者 docker image pull nginx
获取的镜像在 /var/lib/docker 目录下,具体详见docker仓库知识
查看镜像
命令格式:
docker images <image_name> 或者 docker image ls <image_name>
命令演示:
docker images
docker images -a 列出所有的本地的images(包括已删除的镜像记录)
镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息
查看镜像历史
命令格式:
docker history [image_name]
我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker history这条命令来获取我们想要的信息
镜像重命名 : 同一个镜像(id相同),相当于给镜像多添加一个引用
命令格式:
docker tag [old_image]:[old_version] [new_image]:[new_version]
命令演示:
docker tag nginx:latest sswang-nginx:v1.0
删除镜像
命令格式:
docker rmi [image_id/image_name:image_version] 或者 docker image rm [image_id/image_name:image_version]
命令演示:
docker rmi 3fa822599e10
注意:如果一个image_id存在多个名称,那么应该使用 name:tag 的格式删除镜像
docker image prune # 清除状态为dangling的镜像
docker image prune -a # 移除所有未被使用的镜像
docker image prune -a --filter "until=24h" # 删除在24h之前安装的镜像
导出镜像 : 将已经下载好的镜像,导出到本地,以备后用。
命令格式:
docker save -o [新包文件名] [镜像]
docker save [镜像1] ... [镜像n] > [新包文件名]
或者
docker image save –o [新包文件] [镜像1] ... [镜像n]
docker image save [镜像1] ... [镜像n] > [包文件]
注意:docker save 会保存镜像的所有历史记录和元数据信息
导出镜像
docker save -o nginx.tar sswang-nginx
导入镜像
命令格式:
docker load < [image.tar_name]
docker load --input [image.tar_name]
注意: docker load 不能指定镜像的名称
导入镜像文件
docker load < nginx.tar
三、容器管理 依靠一个镜像创建一个容器 ---> 启动容器 ---> 执行命令
查看容器
命令格式:docker ps 或者 docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # docker ps
注意:
管理docker容器可以通过名称,也可以通过ID,同一个镜像可运行成多个容器
ps是显示正在运行的容器, -a是显示所有运行过的容器,包括已经不运行的容器
启动容器
守护进程方式启动容器
命令格式:docker run <参数,可选> [docker_image] [执行的命令] 或者 docker container run <参数,可选> [docker_image] [执行的命令]
docker run -d nginx # 让Docker容器在后台以守护形式运行。此时可以通过添加-d参数来实现
启动已终止的容器 : 在生产过程中,常常会出现运行和不运行的容器,我们使用 start 命令开起一个已关闭的容器
命令格式:docker start [container_id] 或者 docker container start [container_id]
关闭容器 : 在生产中,我们会以为临时情况,要关闭某些容器,我们使用 stop 命令来关闭某个容器
命令格式:docker stop|stop|restart [container_id] 或者 docker container stop|stop|restart [container_id]
关闭容器id docker stop 8005c40a1d16
删除容器
删除容器有两种方法:
正常删除 -- 删除已关闭的
强制删除 -- 删除正在运行的
正常删除容器
命令格式: docker rm [container_id] 或 docker container rm [container_id]
删除所有已停止的容器: docker container prune
删除已关闭的容器,命令演示
docker rm 1a5f6a0c9443
强制删除运行容器
命令格式:docker rm -f [container_id]
删除正在运行的容器
docker rm -f 8005c40a1d16
删除部分容器
docker container prune --filter "until=24h"
批量关闭容器
命令格式: docker rm -f $(docker ps -a -q) # -a : 所有容器 -q : 所有容器的id
创建并进入容器
命令格式:docker run --name [container_name] -it [docker_image] /bin/bash
或 docker container run --name [container_name] -it [docker_image] /bin/bash
命令演示:
docker run -it --name sswang-nginx nginx /bin/bash
root@7c5a24a68f96:/# echo "hello world" # 在docker中的Ubuntu终端输出信息
hello world
root@7c5a24a68f96:/# exit # 退出docker中的Ubuntu终端
exit
docker 容器启动命令参数详解:
--name:给容器定义一个名称
-i : 则让容器的标准输入保持打开。
-t : 让docker分配一个伪终端,并绑定到容器的标准输入上
/bin/bash : 终端即是一个程序,执行一个终端程序
退出容器:
方法一:exit
方法二:Ctrl + D
手工方式进入容器
命令格式:
docker exec -it 容器id /bin/bash 或者 docker container exec -it 容器id /bin/bash
效果演示:
docker exec -it d74fff341687 /bin/bash
基于容器创建镜像
命令格式:
docker commit -m "改动信息" -a "作者信息" [container_id] [new_image:tag]
或者
docker container commit -m "改动信息" -a "作者信息" [container_id] [new_image:tag]
命令演示:
进入一个容器,创建文件后并退出
./docker_in.sh d74fff341687
mkdir /sswang
exit
创建一个镜像
docker commit -m 'mkdir /sswang' -a "sswang" d74fff341687 sswang-nginx:v0.2
查看镜像
docker images
启动一个容器
docker run -itd sswang-nginx:v0.2 /bin/bash
进入容器进行查看
docker container exec -it ae63ab299a84 /bin/bash
ls
查看容器运行日志
命令格式: docker logs [容器id] 或者 docker container logs [容器id]
命令效果: docker logs 7c5a24a68f96
查看容器详细信息
命令格式: docker inspect [容器id] 或者 docker container inspect [容器id]
命令效果: docker inspect 930f29ccdf8a # 查看容器全部信息
查看容器网络信息
docker container inspect -f '{{.NetworkSettings.IPAddress}}' 759942f45646 # {{ }} 模板语言,用此命令得到的是一个json格式数据
dockers image inspect 镜像名:tag # 查看镜像的-m信息
四、仓库管理
Docker的仓库有三大类:
公有仓库:Docker hub、Docker cloud、等
私有仓库:registry、harbor等
本地仓库:在当前主机存储镜像的地方。
相关命令
和仓库相关的命令:
docker login [仓库名称]
docker pull [镜像名称]
docker push [镜像名称]
docker search [镜像名称]
registry私有仓库部署
创建仓库流程
1、根据registry镜像创建容器
2、配置仓库权限
3、提交镜像到私有仓库
4、测试
实施方案
docker pull registry # 下载registry镜像
docker run -d -p 5000:5000 registry # 启动仓库容器, -p 宿主机端口:容器端口 端口映射,访问registry时可以使用 192.168.137.128:5000|127.0.0.1:5000|172.17.0.2:5000
curl 127.0.0.1:5000/v2/_catalog # 检查容器效果
vim /etc/docker/daemon.json # 配置容器权限
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.14:5000"]}
注意:私有仓库的ip地址是宿主机的ip,而且ip两侧有双引号
重启docker服务
systemctl restart docker
systemctl status docker
效果查看
docker start 315b5422c699 # 启动容器
docker tag ubuntu-mini 192.168.8.14:5000/ubuntu-14.04-mini # 标记镜像,需要将push镜像重命名 私有仓库ip/镜像名
docker push 192.168.8.14:5000/ubuntu-14.04-mini # 提交镜像
docker pull 192.168.8.14:5000/ubuntu-14.04-mini # 下载镜像
五、数据管理: 将宿主机目录映射到仓库容器目录中,此时就算删除容器,容器内保存的镜像也不会被删除
数据卷实践 之 目录
命令格式: docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] # 注意宿主机目录&容器目录都是绝对路径
命令演示:
echo "file1" > /tmp/file1.txt # 创建测试文件
docker run -itd --name test1 -v /tmp:/test1 nginx # 启动一个容器,挂载数据卷,宿主机中的目录必须存在
测试效果
~# docker exec -it a53c61c77 /bin/bash
root@a53c61c77bde:/# cat /test1/file1.txt
file1
数据卷实践 之 文件
命令格式: docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称] # 注意宿主机目录&容器目录都是绝对路径
注意:容器里面的文件虽然可以改名,但类型必须和宿主机文件一致
命令演示:
echo "file1" > /tmp/file1.txt # 创建测试文件
docker run -itd --name test2 -v /tmp/file1.txt:/nihao/nihao.sh nginx # 启动一个容器,挂载数据卷
测试效果
~# docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh
file1
数据卷实践 之 删除
docker volume rm
docker volume prune
数据卷容器
将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的
docker 数据卷命令详解
# docker run --help
-v, --volumes-from value Mount volumes from the specified container(s) (default []) # 从指定的容器挂载卷,默认为空
数据卷容器操作流程
1、创建数据卷容器
2、其他容器挂载数据卷容器
注意:数据卷容器不启动
数据卷容器实践
创建一个数据卷容器
命令格式:
docker create -v [宿主机数据卷目录]:[容器数据卷目录] --name [容器名字] [镜像名称]
docker create -v [宿主机数据卷目录]:[容器数据卷目录] -v [宿主机数据卷目录]:[容器数据卷目录] --name [容器名字] [镜像名称]
执行效果:
docker create -v /data --name v-test nginx # 数据卷容器无需启动运行,创建即可不用run
创建两个容器,同时挂载数据卷容器
命令格式:
docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字] [镜像名称]
执行效果:
docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash # 创建 vc-test1 容器
docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash # 创建 vc-test2 容器
确认卷容器共享
进入vc-test1,操作数据卷容器
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt
root@c408f4f14786:/# exit
进入vc-test2,确认数据卷
~# docker exec -it vc-test2 /bin/bash
root@7448eee82ab0:/# ls /data/
v-test1.txt
root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt
root@7448eee82ab0:/# exit
回到vc-test1进行验证
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
v-test1.txt v-test2.txt
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2
回到宿主机查看/data/目录
~# ls /data/
结果证明:容器间可以共享数据卷里容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中
六、网络管理
端口映射 : 默认情况下,容器和宿主机之间网络是隔离的,可以通过端口映射的方式,将容器中的端口映射到宿主机的某个端口上。这样就可以通过宿主机的 ip+port 的方式来访问容器里的内容
端口映射种类
1、随机映射 -P(大写)
2、指定映射 -p 宿主机端口:容器端口
注意:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,因为涉及到映射,不管哪种映射都会影响性能
随机映射实践
命令格式: docker run -d -P [镜像名称]
命令效果: docker run -d -P nginx # 启动一个 nginx 镜像
注意:宿主机的32768端口会被映射到容器的80端口,浏览器输入的格式是: docker容器宿主机的ip:容器映射的端口
-P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1
指定主机随机映射
命令格式 : docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]
命令效果 : docker run -d -p 192.168.8.14::80 --name nginx-2 nginx
指定映射实践
命令格式: docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]
注意:如果不指定宿主机ip的话,默认使用 0.0.0.0,容器端口必须清楚,而且必须写出来
命令实践: docker run -d -p 192.168.8.14:1199:80 --name nginx-1 nginx # 启动容器时,给容器指定一个访问的端口 9999
docker inspect --format='{{.NetworkSettings.IPAddress}}' 03d6893d32d5 # 查看新容器ip
多端口映射方法
命令格式 : docker run -d -p [宿主机端口1]:[容器端口1] -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]
docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx # 开起多端口映射实践
七、Dockerfile
Dockerfile类似于学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实现出来。dockerfile本质是docker的脚本文件
Dockerfile 使用准则
1、大: 首字母必须大写D,创建一个名为 Dockerfile 的文件(固定写法),文件内进行相应配置
2、空: 尽量将Dockerfile放在空目录中。
3、单: 每个容器尽量只有一个功能。
4、少: 执行的命令越少越好。
Dockerfile 基础四指令:
基础镜像信息 从哪来?
维护者信息 我是谁?
镜像操作指令 怎么干?
容器启动时执行指令 嗨!!!
Dockerfile 使用命令:
构建镜像命令格式:
docker build -t [镜像名]:[版本号] [Dockerfile所在目录]
构建样例: docker build -t nginx:v0.2 /opt/dockerfile/nginx/
参数详解: -t 指定构建后的镜像信息, /opt/dockerfile/nginx/ 则代表Dockerfile文件存放位置,如果是当前目录,则用 .(点)表示
准备环境
mkdir /home/python/Desktop/docker # 创建Dockerfile专用目录
cd /home/python/Desktop/docker
ssh-keygen -t rsa #创建秘钥认证
cat ~/.ssh/id_rsa.pub > authorized_keys
cp /etc/apt/sources.list ./ # 准备软件源,略过
定制文件
在 /home/python/Desktop/docker 目录下创建Dockerfile文件
# 构建一个基于ubuntu的ssh定制镜像 FROM ubuntu # 基础镜像 MAINTAINER President.Wei 000000@qq.com # 镜像作者 ADD sources.list /etc/apt/sources.list # 增加软件源 # 安装 ssh 服务 RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove # 复制配置文件到相应位置,并赋予脚本可执行权限 ADD authorized_keys /root/.ssh/authorized_keys EXPOSE 22 # 对外端口 ENTRYPOINT ["/usr/sbin/sshd","-D"] # 启动ssh
构建镜像 : docker build -t ubuntu-ssh .
效果查看 : docker run -d -p 10086:22 ubuntu-ssh # 使用新镜像启动一个容器,查看效果
容器检查
docker ps
docker port c03d146b64d4
ssh查看效果 : ssh 192.168.8.14
注意: 若出现“sign_and_send_pubkey: signing failed: agent refused operation” 报错
执行代码解决:
eval "$(ssh-agent -s)"
ssh-add
Dockerfile 基础指令详解
FROM
格式:
FROM <image>
FROM <image>:<tag>。
解释:FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
MAINTAINER
格式:MAINTAINER <name>
解释:指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用 -a参数 指定的信息
RUN
格式:
RUN <command> (shell模式) RUN apt-get install python3
RUN["executable", "param1", "param2"]。 (exec 模式)
解释:表示当前镜像构建时候运行的命令,exec模式的param是执行命令时的参数
注释:
shell 模式:类似于 /bin/bash -c command 举例: RUN echo hello
exec 模式:类似于 RUN ["/bin/bash", "-c", "command"] 举例: RUN ["echo", "hello"]
EXPOSE
格式: EXPOSE <port> [<port>...]
解释: 设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
ENTRYPOINT
格式:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell模式)
解释: 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
Dockerfile 文件编辑指令详解
ADD和COPY相当于数据卷操作,VOLUME相当于数据卷容器操作
目录文件编辑指令
ADD
格式:
ADD <src>... <dest> ADD 宿主机文件路径 容器文件路径
ADD ["<src>",... "<dest>"]
解释:将指定的 <src> 文件复制到容器文件系统中的 <dest> src 指的是宿主机,dest 指的是容器
如果源文件是个压缩文件,则docker会自动解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
COPY
格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
解释:
单纯复制文件场景,Docker推荐使用COPY
VOLUME
格式: VOLUME ["/data"]
解释:
VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
举例: VOLUME ["/var/lib/tomcat7/webapps/"]
Dockerfile环境设置指令
ENV
格式:
ENV <key> <value>
ENV <key>=<value> ...
解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
WORKDIR
格式: WORKDIR /path/to/workdir (shell 模式)
解释:
切换目录,为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd
可以多次切换(相当于cd命令),也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
举例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。
Dockerfile构建过程
从基础镜像1运行一个容器A
遇到一条Dockerfile指令,都对容器A做一次修改操作
执行完毕一条命令,提交生成一个新镜像2
再基于新的镜像2运行一个容器B
遇到一条Dockerfile指令,都对容器B做一次修改操作
执行完毕一条命令,提交生成一个新镜像3
构建过程镜像
构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用去启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。
通过docker history <镜像名> 可以查看整个构建过程所产生的镜像
构建缓存
我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。即:之后的每一次构建镜像时,如果发现之前曾经构建过,那么就直接使用原本的
构建镜像时禁用缓存:docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存了
构建历史:
docker history # 查看构建详细过程
清理构建缓存:
docker system prune
docker system prune --volumes