docker
Docker 官网:https://www.docker.com/
Github Docker 源码:https://github.com/docker/docker-ce
专项学习docker建议菜鸟教程网:https://www.runoob.com/docker/docker-tutorial.html
简介
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 是将程序隔离打包的一种容器技术,也被称为“轻量级”虚拟化技术。
一个完整的Docker有以下几个部分组成:
1.DockerClient客户端
2.Docker Daemon守护进程
3.Docker Image镜像
4.DockerContainer容器
产生背景
开发和运维之间因为环境不同和导致的矛盾(不同的操作系统、软件环境、应用配置等)DevOps
代码、系统、环境、配置等封装成镜像Image--->运维;
集群的环境下每台服务器都要配置相同的环境;
解决“在我的机器是哪个可以正常工作”的问题;
应用场景
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
主要用途
Docker 的主要用途,目前有三大类。
1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
虚拟机与容器的区别
优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI/CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
架构
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):其实是一种特殊的进程而已。Docker 为该进程划分一个独立空间。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
Dockerfile:可以通过构建文件创建自定义镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类:
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
Docker主机(Host)安装了Docker程序的主机,运行Docker守护进程;
Docker镜像(Image)将软件环境打包好的模板,用来创建容器的,一个镜像可以创建多个容器;
Docker容器(Container)运行镜像后生成的实例称为容器,每运行一次镜像就会产生一个容器,容器可以启动、停止或删除容器使用的是沙箱机制,相互隔离,是独立是安全的;可以把容器看作是一个简易版的Linux环境,包括用户权限、文件系统和运行的应用等;
Docker仓库(Repository)用来保存镜像的,仓库中包含许多镜像,每个镜像都有不同的标签Tag;
我们这里来做个比较形象的比喻,来给大家讲解几个术语的意思:
docker:汽车的引擎
dockerfile:制造汽车的图纸
images:类似于放在4S店里展示厅的样板汽车
container:把一些汽车的零件拼接在一起
compose:老司机(什么品牌的汽车,不管是自动挡还是手动挡的都会开)
docker volume:汽车的油箱(汽车坏掉后,油箱里的油可以迁移出来重复利用。比如说mysql数据库挂掉了,数据是没有丢的,我们需要把数据迁移出来。)
docker swarm:交通枢纽(交通信号灯系统出现故障了,交通就会出现故障混乱。管理docker容器的管理机制来规范化)
docker registry:4S店(4S店里的样板汽车可以随便拉开走使用。就是免费的镜像文件可以拉取到本地使用)
docker镜像层
所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。该镜像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker 在 Windows 上仅支持
windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW。
使用Docker的步骤
1、安装Docker
2、从镜像仓库服务中拉取镜像。常见的镜像仓库服务是 Docker Hub,但是也存在其他镜像仓库服务。
3、拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。
4、对容器的启动/停止就是对软件的启动/停止;
安装
2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。
Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。
社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。
社区版按照stable和edge两种方式发布,每个季度更新stable版本,如17.06,17.09;每个月份更新edge版本,如17.09,17.10。
可以直接去 https://hub.docker.com/ 下载安装包进行下载安装,前提是需要注册一个账号。也可以直接参考菜鸟的安装教程:
官方各种操作系统安装教程:https://docs.docker.com/get-docker/
如果暂时不想在本地安装,却要学习docker的使用,可以在线免费练习4个小时,推荐Play with Docker网站 :https://labs.play-with-docker.com/
Window上安装
windows 安装教程:https://www.runoob.com/docker/windows-docker-install.html或者官网安装教程:https://docs.docker.com/docker-for-windows/
Win7/8系统
win7,win8等需要利用docker toolbox来安装,国内可以使用阿里云的串口来下载,下载地址:
http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
安装比较简单,双击运行,点接下来即可,可以重置自己需要的组件:
docker toolbox是一个工具集,它主要包含以下一些内容:
Docker CLI-客户端,用于运行docker引擎创建内置和容器。
Docker Machine-可以让你在Windows的命令行中运行docker引擎命令。
Docker Compose-使用运行docker-compose命令。
Kitematic-这是Docker的GUI版本。
Docker QuickStart shell-这是一个已经配置好Docker的命令行环境。
Oracle VM Virtualbox-虚拟机。
下载完成之后直接点击安装,安装成功后,桌边会出现三个图标,入下图所示:
单击Docker QuickStart图标来启动Docker Toolbox终端。
如果系统显示用户帐户控制窗口,请运行VirtualBox修改您的电脑,选择“是”。
$ docker run hello-world
Win10系统
现在Docker有专门的Win10专业版系统的安装包,需要开启Hyper-V。
开启Hyper-V
程序和功能
启用或关闭Windows功能
揭示Hyper-V
安装工具箱
最新版工具箱下载地址:https://www.docker.com/get-docker
点击下载桌面并学习指南,并下载Windows的版本,如果你还没有登录,会要求注册登录:
运行安装文件
双击下载的Docker for Windows Installer安装文件,一路Next,单击Finish完成安装。
安装完成后,Docker会自动启动。通知栏上会出现一个小鲸鱼的图标 ,这表示Docker正在运行。
桌边也会出现三个图标,入下图所示:
我们可以在命令行执行docker version来查看版本号,docker run hello-world来加载测试并测试。
如果没启动,你可以在Windows搜索Docker来启动:
启动后,也可以在通知栏上看到小鲸鱼图标:
MacOS上安装
MacOS Docker 安装:https://www.runoob.com/docker/macos-docker-install.html
需要注意的是 菜鸟教程 Mac 安装教程提供了2个安装包连接分别为:edge 和 stable,这2个安装包区别如下:edge:尝鲜版每个月发布一次可能存在一定问题;stable:稳定版每个季度更新一次相对稳定的版本初学者建议下载stable进行安装。
使用 Homebrew 安装
macOS 我们可以使用 Homebrew 来安装 Docker。
Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:
$ brew cask install docker
==> Creating Caskroom at /usr/local/Caskroom
==> We'll set permissions properly so we won't need sudo in the future
Password: # 输入 macOS 密码
==> Satisfying dependencies
==> Downloading https://download.docker.com/mac/stable/21090/Docker.dmg
######################################################################## 100.0%
==> Verifying checksum for Cask docker
==> Installing Cask docker
==> Moving App 'Docker.app' to '/Applications/Docker.app'.
🍺 docker was successfully installed!
在载入 Docker app 后,点击 Next,可能会询问你的 macOS 登陆密码,你输入即可。之后会弹出一个 Docker 运行的提示窗口,状态栏上也有有个小鲸鱼的图标( )。
手动下载安装
如果需要手动下载,请点击以下链接下载:
Stable(https://download.docker.com/mac/stable/Docker.dmg)或
Edge(https://download.docker.com/mac/edge/Docker.dmg)版本的 Docker for Mac。
如同 macOS 其它软件一样,安装也非常简单,双击下载的 .dmg 文件,然后将鲸鱼图标拖拽到 Application 文件夹即可。
从应用中找到 Docker 图标并点击运行。可能会询问 macOS 的登陆密码,输入即可。
点击顶部状态栏中的鲸鱼图标会弹出操作菜单。
第一次点击图标,可能会看到这个安装成功的界面,点击 "Got it!" 可以关闭这个窗口。
启动终端后,通过命令可以检查安装后的 Docker 版本。
$ docker --version
Docker version 17.09.1-ce, build 19e2cf6
CentOS上安装
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
# uname -r
Docker 支持以下的 64 位 CentOS 版本:CentOS 7、CentOS 8更高版本...
该 centos-extras 库必须启用。默认情况下,此仓库是启用的,但是如果已禁用它,则需要重新启用它(https://wiki.centos.org/AdditionalResources/Repositories)。建议使用 overlay2 存储驱动程序。
使用root权限登录 centos。确保 yum 包更新到最新。
$ sudo yum update
卸载旧版本
查询当前的Docker版本
$ docker -v
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
$sudo yum remove docker docker-client docker-client-latest docker-common docker-latest \
docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
使用 Docker 仓库方式安装docker
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
使用以下命令来设置稳定的仓库。
$sudo
yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker Engine-Community
安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
$ sudo yum install docker-ce docker-ce-cli containerd.io
如果提示您接受 GPG 密钥,请选是。
有多个 Docker 仓库吗?
如果启用了多个 Docker 仓库,则在未在 yum install 或 yum update 命令中指定版本的情况下,进行的安装或更新将始终安装最高版本,这可能不适合您的稳定性需求。
Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。
# more /etc/group
要安装特定版本的 Docker Engine-Community,请在仓库中列出可用版本,然后选择并安装:
1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
$ yum
list docker-ce --showduplicates | sort -r
2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-19.03.8。
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
#由于repo中默认只开启stable仓库,故这里安装的是最新稳定版19.03.8
$ sudo yum install docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
启动 Docker
$ sudo systemctl start docker
$ sudo systemctl enable docker #开机启动docker
$ sudo systemctl status docker #查看docker状态
验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
$ docker version
通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。
$ sudo docker run hello-world
使用yum方安装docker
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker-ce:
sudo yum -y install docker-ce
启动 Docker 后台服务
sudo systemctl start docker
systemctl enable docker #开机启动docker
systemctl status docker #查看docker状态
systemctl stop docker #停止
systemctl restart docker #重启
/查看装好的镜像
docker images
//查看容器
docker ps -a
查看docker版本
docker version
测试运行 hello-world
[root@runoob ~]# docker run hello-world
镜像加速器
鉴于国内网络问题,后续拉取Docker镜像十分缓慢,我们可以需要配置加速器来解决。
可选的镜像加速地址如下:
Docker官方提供的中国镜像库地址:https://registry.docker-cn.com
七牛云加速器地址:https://reg-mirror.qiniu.com
网易的镜像地址:http://hub-mirror.c.163.com
阿里云镜像地址:每个阿里云账号提供一个唯一的地址
注:也可以使用阿里云的加速地址:https://br10hqrl.mirror.aliyuncs.com
DaoCloud 加速器是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的CDN服务与协议层优化,成倍的提升了下载速度。
注:使用前请先确保您的 Docker 版本在 1.8 或更高版本,否则无法使用加速。
官方网址:http://guide.daocloud.io/dcs/daocloud-9153151.html
当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。
Linux下配置
自动配置Docker加速器(推荐)
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。登陆后运行配置命令:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
此命令会帮助您配置 registry-mirror 。
在配置完成后,请根据终端中的提示重启 docker,以使配置生效。
手动配置 Docker 加速器
适用于各种 Linux 发行版
Docker 版本在 1.12 或更高
创建或修改 /etc/docker/daemon.json 文件,修改为如下形式(请将加速地址替换为在加速器页面获取的专属地址,比如:http://f1361db2.m.daocloud.io)
{
"registry-mirrors": [
"加速地址"
],
"insecure-registries": []
}
之后重新启动服务:
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
Docker 版本在 1.8 与 1.11 之间
您可以找到 Docker 配置文件,不同的 Linux 发行版的配置路径不同,具体路径请参考Docker官方文档:https://docs.docker.com/config/daemon/,在配置文件中的DOCKER_OPTS加入:
--registry-mirror=加速地址
重启Docker,不同的 Linux 发行版的重启命令不一定相同,一般为:service docker restart
注意:
以上对应于两个不同 docker 版本的配置方式不能同时配置,否则在 docker 启动的时候将报错无法启动,解决方式是将后者配置文件里面的 registry-mirror 参数去掉并保存,只留前面的 daemon.json 的配置方式(这也是官方推荐的配置方式)。之后再重启 docker 即可解决。
MacOS下配置
右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中加入加速地址(在加速器页面获取)。点击 Apply & Restart 按钮使设置生效。
Registry mirrors 列表中加入下面的镜像地址: http://f1361db2.m.daocloud.io
点击 Apply & Restart 按钮使设置生效。
Docker 17.03 之前版本为 Advanced 标签,请参考下图:
Registry mirrors 列表中加入下面的镜像地址: http://f1361db2.m.daocloud.io
点击 Apply & Restart 按钮使设置生效。
之后我们可以通过docker info来查看是否配置成功。
$ docker info
...
Registry Mirrors:
http://hub-mirror.c.163.com
Live Restore Enabled: false
Windows下配置
对于使用Windows 10的系统,在系统右下角托盘Docker图标内部快捷菜单选择设置,打开配置窗口后导航菜单选择Daemon。在Registrymirrors中添加一个加速器地址之后点击Apply保存后Docker就会重启并应用配置的多个地址了。
在桌面右下角状态栏中右键 docker 图标,修改在 Docker Daemon 标签页中的 json ,把 加速地址(在加速器页面获取)加到"registry-mirrors"的数组里。点击 Apply 使设置生效。
Registry mirrors 列表中加入下面的镜像地址: http://f1361db2.m.daocloud.io
点击 Apply按钮使设置生效。
注:上方的文本为 json 语法,请确定您的修改符合语法规则,否则将无法配置成功。
以非root用户管理docker
Docker守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字由用户拥有root,其他用户只能使用来访问它sudo。Docker守护程序始终以root用户身份运行。
如果你不想在使用docker命令前面带上sudo,创建一个名为UNIX组docker和用户添加到它。当Docker守护程序启动时,它将创建一个可由该docker组成员访问的Unix套接字。该docker组授予与root用户等效的特权。
1)要创建docker组并添加用户,请执行以下操作:
创建docker组。
$ sudo groupadd docker
将您的用户添加到该docker组。
$ sudo usermod -aG docker $USER ($USER就是你自己用来管理docker的非root用户)
注销并重新登录,以便重新评估您的组成员身份。如果在虚拟机上进行测试,则可能需要重新启动虚拟机以使更改生效。在台式机Linux环境(例如X Windows)上,完全注销会话,然后重新登录。
在Linux上,您还可以运行以下命令来激活对组的更改:
$ newgrp docker
验证您是否可以运行docker不带命令的命令sudo。
$ docker run hello-world
此命令下载测试图像并在容器中运行它。容器运行时,它会打印参考消息并退出。
如果sudo在将用户添加到docker组之前最初使用运行Docker CLI命令,则可能会看到以下错误,这表明~/.docker/由于sudo命令的原因,您的目录创建时使用了不正确的权限。
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied
要解决此问题,请删除~/.docker/目录(会自动重新创建目录,但是所有自定义设置都会丢失),或者使用以下命令更改其所有权和权限:
$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "$HOME/.docker" -R
image镜像文件
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
列出本机的所有 image 文件。
$ docker image ls
删除 image 文件
$ docker image rm [imageName]
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。
为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。
Linux Docker 主机本地镜像仓库通常位于 /var/lib/docker/<storage-driver>
Windows Docker 主机则是 C:\ProgramData\docker\windowsfilter。
容器文件
image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
docker命令
输入docker可以查看Docker的命令用法,输入docker COMMAND --help查看指定命令的详细用法;
docker version查看docker版本号
查看docker的版本号
语法:docker version [OPTIONS]
OPTIONS说明:
-f :指定返回值的模板文件。
docker info显示docker系统信息
显示 Docker 系统信息,包括镜像和容器数。
docker image镜像
docker container容器
docker system df查看镜像容器数据卷所占空间
镜像、容器、数据卷所占间
注:因为需要统计的镜像的大小,所以执行会有些慢。
docker service create创建一个新的服务
本地镜像管理
docker images查看所有本地镜像
列出本地镜像
语法:docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
docker image ls 查看所有本地镜像
和docker images 命令等价。默认的docker image ls列表中,只会显示顶层镜像
显示包括中间层镜像在内的所有镜像
$ docker image ls -a
注:
这样会看到很多无标签的镜像,和之后的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,这些无标签镜像,不能删除,否则会导致上层镜像因为依赖丢失而出错。
只显示本机的所有镜像的镜像ID
$ docker image ls -q
列出部分镜像,模糊搜索
// 根据仓库名列出镜像
$ docker image ls ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB
ubuntu 15.10 9b9cb95443b5 17 months ago 137MB
// 列出指定镜像
$ docker image ls ubuntu:16.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB
// 显示指定镜像之后的镜像列表(可比对之前的列表)
$ docker image ls -f since=redis
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB
laradock_redis latest 19a977a11685 3 months ago 107MB
<none> <none> a03f07cc3324 3 months ago 15.5MB
laradock_php-fpm latest f4ad9b641995 3 months ago 400MB
laradock_workspace latest 318c7dc4d367 3 months ago 696MB
laradock_mysql latest 59affc42159e 3 months ago 343MB
// 查看之前也可以,把 since 换成 before即可
docker目前支持的过滤器
dangling:可以指定 true 或者 false,仅返回悬虚镜像(true),或者非悬虚镜像(false)。
before:需要镜像名称或者 ID 作为参数,返回在之前被创建的全部镜像。
since:与 before 类似,不过返回的是指定镜像之后创建的全部镜像。
label:根据标注(label)的名称或者值,对镜像进行过滤。docker image ls命令输出中不显示标注内容。
其他的过滤方式可以使用 reference。
悬虚(dangling)镜像
没有标签的镜像被称为悬虚镜像,在列表中展示为<none>:<none>。通常出现这种情况,是因为构建了一个新镜像,然后为该镜像打了一个已经存在的标签。当此情况出现,Docker 会构建新的镜像,然后发现已经有镜像包含相同的标签,接着 Docker 会移除旧镜像上面的标签,将该标签标在新的镜像之上。
docker rmi删除镜像
docker rmi -f 镜像id或镜像名:tag
删除指定的本地镜像,f表示强制删除
注:
上面命令的运行输出信息
Untagged :表示满足删除条件的镜像标签,都取消,因为一个镜像可以有多个标签,只有当这个镜像的所有标签都取消了,才对触发删除操作,也就是 Deleted 表示的意思。考虑到Docker的多层存储结构,就算是删除操作,也只会删除没有任何镜像的依赖的层。
docker tag为本地的 image 标注用户名和版本
$ docker image tag [imageName] [username]/[repository]:[tag]
docker tag 旧镜像名称和端口 redis-ali:0.0.1 修改镜像的名称
例如:docker tag id号 docker.io/tomcat:7 修改镜像的标签
docker image build构建一个新的镜像
通过Dockerfile文件创建image镜像,命令可以简写成docker build
OPTIONS说明:
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;如果不指定,默认的标签就是latest可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式
PATH | URL | -说明
给出命令执行的上下文。
上下文可以是构建执行所在的本地路径PATH,也可以是远程URL,如Git库、tarball或文本文件等,还可以是-。
构建镜像的进程中,可以通过ADD命令将上下文中的任何文件(注意文件必须在上下文中)加入到镜像中。
可以是PATH,如本地当前PATH为.
如果是Git库,如https://github.com/docker/rootfs.git#container:docker,则隐含先执行git clone --depth 1 --recursive,到本地临时目录;然后再将该临时目录发送给构建进程。
docker image history查看本地镜像的构建历史记录
查询本地image镜像的历史信息,等价于:docker history命令
OPTIONS说明:
-H :以可读的格式打印镜像大小和日期,默认为true;
--no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。
docker save 将指定镜像保存成 tar 归档文件
OPTIONS 说明:
-
-o :输出到的文件。
docker save a2a69ca5184a > jt-centOS6.tar 根据镜像id导出镜像
docker save -o redis-3.2.8.tar redis:3.2.8 根据镜像名称导出镜像
docker load导入使用 docker save 命令导出的镜像。
OPTIONS 说明:
-
--input , -i : 指定导入的文件,代替 STDIN。
-
--quiet , -q : 精简输出信息。
docker load -i docker-centos-6.5.tar 指定jar包导入镜像文件
docker import从归档文件中创建镜像。
OPTIONS说明:
-c :应用docker 指令创建镜像;
-m :提交时的说明文字;
从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为runoob/ubuntu:v4
$ docker import my_ubuntu_v3.tar runoob/ubuntu:v4
docker image prune移除全部的悬虚镜像
如果添加了 -a 参数,Docker 会额外移除没有被使用的镜像(那些没有被任何容器使用的镜像)。
docker image prune删除悬虚镜像
镜像仓库
docker login
首先,去hub.docker.com或cloud.docker.com注册一个账户。然后,用此命令登录。
docker pull拉取镜像
镜像从远程镜像仓库服务的仓库中下载。默认从docker hub镜像仓库中拉取或更新指定镜像。
docker pull [选项] [Docker Registry 地址 [:端口号] / ] 仓库名 [:标签]
OPTIONS说明:
-a :拉取所有 tagged 镜像
--disable-content-trust :忽略镜像的校验,默认开启
docker pull 镜像名:tag #:tag表示软件的版本,如果不指定默认是latest
docker image pull拉取镜像
命令的格式如下:docker image pull <repository>:<tag>
OPTIONS说明:
-a :拉取所选仓库中的所有镜像
--disable-content-trust :忽略镜像的校验,默认开启
docker pull 镜像名:tag #:tag表示软件的版本,如果不指定默认是latest
默认情况下,镜像会从 Docker Hub 的仓库中拉取。docker image pull ubuntu:latest 命令会从 Docker Hub 的 ubuntu仓库中拉取标签为 latest 的镜像。
docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。
由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。
$ docker image pull hello-world等价于$ docker pull hello-world
注:如果没有在仓库名称后指定具体的镜像标签,Docker会假设用户希望拉取标签为 latest 的镜像。
$ docker image pull mongo:3.3.11 该命令会从官方Mongo库拉取标签为3.3.11的镜像
docker push发布镜像文件
$ docker image push [username]/[repository]:[tag]
docker search 从docker hub中查找镜像
从docker hub查找镜像:查看可用应用软件及对应的版本
语法:docker search [OPTIONS] TERM
OPTIONS说明:
-f, --filter filter:过滤输出内容
--format string:格式化输出内容
--limit int:限制输出结果个数,默认为25个
--automated :只列出 automated build类型的镜像;
--no-trunc :显示完整的镜像描述;
-s :列出收藏数不小于指定值的镜像。
# docker search mysql
参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 是否为自动化构建的镜像。
容器生命周期管理
docker run 新建一个容器
该命令等价于:docker container run
命令格式:docker run name 容器 i t p 主机端口:容器端口 d v主机目录:容器目录:ro 镜像id或镜像名称:tag bash
name:指定容器名,名称自定义,如果不指定会自动命名;
i:以交互模式运行,即以交互模式运行容器;
t:分配一个伪终端,即命令行,通常组合使用it;
p:指定端口映射,将主机端口映射到容器内的端口;
d:表示后台运行,即守护式运行容器;
v:指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读
--rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm可以避免浪费空间。
bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。
命令会从 image 文件,生成一个正在运行的容器实例。
注:
docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从docker hub仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。
docker run --name nginx-test -p 8083:80 -d nginx
docker start启动一个或多个已经被停止的容器
docker start 容器Id号 启动创建好的容器
docker restart重启容器
docker stop 停止一个运行中的容器
docker stop $(docker ps -q)关闭所有的容器
docker kill手动杀掉一个运行中的容器
语法:docker kill [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-s :向容器发送一个信号
doker pause暂停容器中所有的进程
docker unpause恢复容器中所有的进程
docker rm删除容器
删除一个或多个容器。
OPTIONS说明:
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
删除所有已经停止的容器:docker rm $(docker ps -a -q)
docker image rm删除容器
删除一个或多个容器。
注:现在都不用这个了,都用docker rm来删除容器。
删除操作会在当前主机上删除该镜像以及相关的镜像层。这意味着无法通过 docker image ls 命令看到删除后的镜像,并且对应的包含镜像层数据的目录会被删除。但是,如果某个镜像层被多个镜像共享,那只有当全部依赖该镜像层的镜像都被删除后,该镜像层才会被删除。
docker create创建一个新的容器但不启动它
docker exec在运行的容器中执行命令
如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。
docker exec -it 容器id bash 进入指定的容器
容器操作
docker container ls列出本机正在运行的容器
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
docker ps 查看当前活动的容器进程
查看正在运行的实例,即当前活动的docker容器进程
OPTIONS说明:
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
注:上图显示了hello-world容器至今开启了6个同样的实例。
docker image inspect查看镜像分层的方式
docker image inspect nginx
输出显示该镜像包含3个镜像层。只不过这次的输出内容中使用了镜像的 SHA256 散列值来标识镜像层。
docker inspect 镜像id #获取镜像的元信息,详细信息
docker attach 连接到正在运行中的容器。
docker events 从服务器获取实时事件
docker logs 获取容器的日志
docker wait阻塞运行直到容器停止,然后打印出它的退出代码。
docker export将文件系统作为一个tar归档文件导出到STDOUT。
docker port列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。
容器rootfs命令
docker commit从容器创建一个新的镜像
docker diff检查容器里文件结构的更改
docker cp用于容器与主机之间的数据拷贝
用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。
$ docker container cp [containID]:[/path/to/file] .
docker cp ROOT.war tomcat8:/usr/local/tomcat/webapps/ 拷贝文件到tomcat8的容器的路径中
docker实例
tomcat
docker run -d -p 8093:8080 --name tomcat03 tomcat:7.0
参数说明:
-d,则containter将会运行在后台模式(Detached mode)
--name 实例名称
-p 对外程序访问端口8093,宿主机映射的tomcat端口8080
最后的tomcat为镜像的名称
访问过程:
mysql
docker run --name=mysql-5.7 -it -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --character-set-server=utf8