1.1. 什么是Docker(转自维基百科)
| 原作者 | Solomon Hykes |
| 开发者 | Docker, Inc. |
| 初始版本 | 2013年3月13日 |
| 稳定版本 | 18.09.2
(2019年2月11日,43天前)
|
| 预览版本 | 18.09.1-rc1
(2018年12月7日,3个月前 )
|
| 源代码库 |
| 编程语言 | Go |
| 操作系统 | Linux、Windows、macOS |
| 系统平台 | x86-64、ARM、s390x、ppc64le |
| 类型 | 操作系统层虚拟化 |
| 许可协议 | 可执行档:免费增值软件即服务
源代码:Apache许可证 2.0 |
| 网站 | www<wbr style="box-sizing: content-box; outline: 0px; display: inline-block;">.docker<wbr style="box-sizing: content-box; outline: 0px; display: inline-block;">.com |
Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制[1]。
Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担[2]。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,
依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。” [3]。
参考文献[编辑]
^ <cite class="citation web" style="box-sizing: border-box; outline: 0px; font-style: normal;">O'Gara, Maureen. Ben Golub, Who Sold Gluster to Red Hat, Now Running dotCloud. SYS-CON Media. 26 July 2013[2013-08-09].</cite>
^ <cite class="citation web" style="box-sizing: border-box; outline: 0px; font-style: normal;">Docker Documentation</cite><cite class="citation web" style="box-sizing: border-box; outline: 0px; font-style: normal;">. docker.readthedocs.org. 2014-01-04 [2014-08-20]. </cite>
^ <cite class="citation web" style="box-sizing: border-box; outline: 0px; font-style: normal;">Docker Documentation</cite><cite class="citation web" style="box-sizing: border-box; outline: 0px; font-style: normal;">. docker.readthedocs.org. 2014-01-04 [2014-08-20]. </cite>
外部链接[编辑]
Windows 容器 - 在 Windows 10 部署 Docker
1.2. 为什么要用docker
本文转自:http://wiki.jikexueyuan.com/project/docker-technology-and-combat/why.html
为什么要使用 Docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动耗时 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
1.3. Docker官方文档
官方文档:
https://docs.docker.com/
1.4. Docker入门读物
Docker —— 从入门到实践
https://yeasy.gitbooks.io/docker_practice/introduction/
阮一峰的网络日志-Docker 入门教程
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
1.5. CentOS 7系统安装Docker CE
1. 概要
本文适用于 CentOS 7操作系统全新安装最新版本DockerCE
更新版本期间需要停止服务!!!
旧版本的Docker 并没有区别EE(企业版)与CE(社区版),而新的Docker都有区分。
官方文档:https://docs.docker.com/install/linux/docker-ce/centos/
2. 卸载旧版本Docker
首先卸载可能已经安装的任何旧版本的 Docker
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
卸载后请保留/var/lib/docker/
目录,其中包含了镜像、容器、卷、与网络配置。
3. 安装 Docker CE
方法主要有三种,分别如下:
- 方法一:使用 Docker 的 repository进行安装,绝大多数用户都选择这样进行安装,因为这样安装比较方便,以及便于之后的升级。这是目前推荐的安装方法。
- 方法二:使用 RPM 包进行安装,后续需要手动升级。这个主要是用于离线场景,无法接入互联网的情况下。
- 方法三:在测试和开发环境下,有些用户会选择一键脚本进行安装。
3.1. 方法一:使用 repository 安装
3.1.1. 安装必要的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3.1.2. 添加稳定版本的Docker yum源:
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.1.3. 安装 Docker CE:
sudo yum install docker-ce docker-ce-cli containerd.io
此时提示 Is this OK? 输入 y 后回车。
之后会再次提示确认指纹信息,看一下是否符合 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
(不区分大小写),如果无误,再次输入 y 后回车。
3.1.4. 【可选】安装指定版本的 Docker CE
列出所有的 Docker CE 版本:
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
然后在安装的时候指定版本号(比如 docker-ce-18.03.0.ce 这样,下面的 VERSION STRING 替换成需要安装的版本号):
sudo yum install docker-ce-<VERSION STRING>
3.1.5. 启动Docker
sudo systemctl start docker
sudo systemctl enable docker
3.1.6. run一下hello-world
镜像,验证Docker CE安装是否正确
sudo docker run hello-world
这句命令会下载一个测试镜像并在容器中启动。当容器启动后会打印一句文本然后退出。
如果一切都没问题,就能看到下面的欢迎信息了:
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
3.1.7. 更新Docker CE版本
更新Docker CE很简单,只需要回到 步骤 3.1.3. 安装需要的版本即可。
3.2. 方法二:通过.rpm
包安装
如果你无法使用Docker的yum源时,可以尝试使用.rpm
包手动安装.
每次升级Docker CE版本的时候都需要手动下载新的.rpm
包
3.2.1. 下载安装包
在这个地址下载安装包:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
3.2.2. 用rpm安装
sudo yum install /path/to/package.rpm
此时docker已安装但是还没启动。
3.2.3. 启动Docker
`sudo systemctl start docker`
`sudo systemctl enable docker`
3.2.3. 验证可用
sudo docker run hello-world
3.2.4. 更新Docker CE版本
下载新版本的rpm包,然后使用命令:
sudo yum upgrade /path/to/package.rpm
3.3. 方法三:使用一键脚本安装
通过一键脚本安装没法指定 Docker 版本,也没有任何可配置的东西,一切都是按照默认配置来安装。如果觉得没问题,可以通过这个方法安装:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
4. 卸载Docker
4.1. 卸载软件包
sudo yum remove docker-ce
4.2. 删除文件
镜像、容器、卷、用户定义配置文件等不会自动删除,所以需要手动删除
sudo rm -rf /var/lib/docker
您必须手动删除任何已编辑的配置文件。
1.6. Docker命令行入门大全:这18条,你不得不知
Docker有成千上百万的命令行。因此Docker文档内容十分丰富,同时又让刚入门的新手感到不知所措。在本文中,我将重点介绍运行Docker的关键命令。
前 言
Docker镜像是由Dockerfile和一些必要的依赖项组成的,Docker容器是动态的Docker镜像。要使用Docker命令,首先需要知道您是在处理镜像还是容器。一旦你知道你所处理的是镜像还是容器之后,你才可以找到正确的命令。
命令的共性
你需要知道一些关于Docker命令的规律:
Docker CLI管理命令以docker开头,然后是空格,接着是管理类别,然后是空格最后是命令。例如,docker container stop这一命令可以停止容器。
引用特定容器或镜像的命令需要该容器或镜像的名称或ID。
举个例子,docker container run my_app 是用于构建和运行名为my_app的容器的命令。在本文示例中,我将使用名称my_container来引用通用容器。同理,my_image、my_tag也是如此。
我将单独提供命令和通用标志。前面有两个破折号的标志是标志的全名。带有一个破折号的标志是完整标志名称的缩写。例如,-p是--port标志的缩写。
本文的目标是让您牢牢记住这些命令和标记,并希望您可以在创建容器或构建镜像的时候可以将本指南作为参考。本指南适用于Linux和Docker Engine版本18.09.1以及API版本1.39。
我们先了解容器命令然后再看镜像命令。
容器命令
使用 docker container my_command
create — 从镜像中创建一个容器
start — 启动一个已有的容器
run — 创建一个新的容器并且启动它
ls — 列出正在运行的容器
inspect — 查看关于容器的信息
logs — 打印日志
stop — 优雅停止正在运行的容器
kill — 立即停止容器中的主要进程
rm — 删除已经停止的容器
镜像命令
使用 docker image my_command
build — 构建一个镜像
push — 将镜像推送到远程镜像仓库中
ls — 列出镜像
history — 查看中间镜像信息
inspect — 查看关于镜像的信息,包括层
rm — 删除镜像
容器&镜像
docker version — 列出关于Docker客户端以及服务器版本的信息
docker login — 登录到Docker镜像仓库
docker system prune — 删除所有未使用的容器、网络以及无名称的镜像(虚悬镜像)
容器命令详解
启动容器
术语“创建”,“开始”和“运行”在日常生活中都具有相似的语义,但每个都是一个独立的Docker命令,用于创建并/或启动容器。让我们先看看创建容器的命令。
docker container create my_repo/my_image:my_tag — 从一个镜像中创建容器
我将在下文中把my_repo/my_image:my_tag缩写为 my_image。
你可以通过传递许多标志来create。
docker container create -a STDIN my_image
-a是—attach的缩写,指将容器连接到STDIN,STDOUT或STDERR。
既然我们已经创建了一个容器,那么让我们来启动它。
docker container start my_container — 启动一个已有的容器
请注意,容器可以通过容器的ID或容器的名称来引用。
docker container start my_container
既然你知道如何创建和启动一个容器,让我们来看看最常见的Docker命令。它将create和start结合到一个命令中:run。
docker container run my_image — 创建一个新容器并且启动它。这一命令同样也有许多选项。让我们看看其中几个。
docker container run -i -t -p 1000:8000 --rm my_image
-i是—interactive的缩写,即使未连接,也要保持STDIN打开;-t是—tty的缩写,它会分配一个伪终端,将终端与容器的STDIN和STDOUT连接起来。
你需要指定-i和-t 通过终端shell与容器交互。
-p是 –port的缩写。端口是与外部世界的接口。1000:8000将Docker端口8000映射到计算机上的端口1000。如果你有一个app输出了一些内容到浏览器,你可以将浏览器导航到localhost:1000并且查看它。
--rm自动删除停止运行的容器。
让我们再来看看run的几个例子。
docker container run -it my_image my_command
sh是你可在运行时指定的命令,它将在容器内部启动shell会话,你可以通过终端与其交互。对于Alpine镜像,sh优于bash,因为Alpine镜像不随bash一起安装。键入exit以结束交互式shell会话。
请注意,我们将-i和-t结合为-it。
docker container run -d my_image
-d是—detach的缩写,指在后台运行容器,允许您在容器运行时将终端用于其他命令。
检查容器状态
如果你有许多运行中的Docker容器并且想要找到与哪一个互动,那么你需要列出它们。
docker container ls — 列出运行中的容器,同时提供关于容器有用的信息。
docker container ls -a -s
-a是--all的缩写,列出所有容器(不仅仅是正在运行中的容器)
-s是—size的缩写,列出每个容器的大小。
docker container inspect my_container — 查看有关容器的信息
docker container logs my_container — 列出容器日志
终止容器
有时你需要停止一个正在运行中的容器,你需要用到以下命令:
docker container stop my_container — 优雅地停止一个或多个正在运行的容器。在容器关闭之前提供默认10秒以完成任何进程。
如果你觉得10秒太长的话,可以使用以下命令:
docker container kill my_container — 立即停止一个或多个正在运行的容器。这就像拔掉电视上的插头一样。但是在大多数情况下,建议使用stop命令。
docker container kill $(docker ps -q)— 终止所有运行中的容器
你需要删除容器可以使用以下命令:
docker container rm my_container — 删除一个或多个容器
docker container rm $(docker ps -a -q) — 删除所有不在运行中的容器
以上就是Docker容器的关键命令。接下来,我们来看看关于镜像的命令。
镜像命令详解
以下是Docker镜像使用的7条命令
构建镜像
docker image build -t my_repo/my_image:my_tag . 在指定路径或url的Dockerfile中构建一个名为my_image的Docker镜像。
-t是tag的缩写,是告诉docker用提供的标签来标记镜像,在本例中,是my_tag。
在命令末尾的句号(.)是告诉Docker根据当前工作目录中的Dockerfile构建镜像。
当你构建好镜像之后,你想要推送它到远程仓库中以便它可以共享并且在有需要的时候被拉取。那么下一个命令十分有用,尽管并非是镜像命令。
docker login — 登录到Docker镜像仓库,根据提示键入你的用户名和密码
docker image push my_repo/my_image:my_tag — 推送一个镜像到仓库。
你拥有了这些镜像之后,你可能想要检查他们。
检查镜像
docker image ls — 列出你的镜像以及每个镜像的大小
docker image history my_image — 显示镜像的中间镜像,包括大小及其创建方式
docker image inspect my_image — 显示关于镜像的细节,包括组成镜像的层
有时候你还需要清理你的镜像。
清理镜像
docker image rm my_image — 删除指定镜像。如果镜像被保存在镜像仓库中,那么该镜像在那依旧可用。
docker image rm $(docker images -a -q) — 删除所有镜像。必须小心使用这一命令。请注意已经被推送到远程仓库的镜像依然能够保存,这是镜像仓库的一个优势。
以上就是大部分与Docker镜像相关的重要命令。
要在使用Docker时查看CLI引用,只需在命令行中输入命令docker即可。Docker文档请参阅:
https://docs.docker.com/engine/reference/commandline/cli/
现在你已经掌握了运行Docker的关键命令,可以用Docker构建东西了!赶紧上手操作吧!
推荐阅读