Docker新手入门详细介绍

Docker新手入门详细介绍

Docker 起源于 dotCloud 公司的内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护,2013 年底公司改名为 Docker。因此,Docker 既是世界领先的软件容器平台(或引擎)名,又是推出这个平台的公司名,通常是指前者。

开发者可以打包自己的应用到容器里面,然后迁移到其他机器的docker应用中,可以实现快速部署。

 

Docker 官网:https://www.docker.com

上图是目前(2020年4月)Docker官网首页显示情况。

 

容器技术是后于虚拟化技术出现的,如果说虚拟化技术的出现主要是为了解决资源调配和隔离的问题,那么容器技术解决的是应用开发、测试和部署等提升效率的问题。Docker是 众多容器解决方案中杰出的代表。

2015年,由Google,Docker、CoreOS、IBM、微软、红帽等厂商联合发起的OCI(Open Container Initiative)组织成立了,并于2016年4月推出了第一个开放容器标准。标准主要包括runtime(运行时)标准和image(镜像)标准。

 

容器(Container)与虚拟机(Virtual Machine)的区别

虚拟机

传统虚拟机如 VMware,VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。

优点:实现虚拟机和宿主机操作系统的异构,如在Linux系统上运行Windows的虚拟机

缺点:依赖于硬件的支持,特别是CPU虚拟化的支持

容器技术

容器技术是和我们的宿主机共享硬件资源及操作系统,容器的本质是一个进程,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。。容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。Docker 属于 Linux 容器的一种封装。

优点:由于没有转换异构指令的虚拟化层,因此运行效率高于虚拟机。

缺点:只能实现与宿主机操作系统相同系统的虚拟化。

在实际使用中,常常将两者相结合,以实现“跨不同操作系统”运行容器的目的。

虚拟机(Virtual Machine)和Docker区别

虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的计算机系统,每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高,对CPU/内存的消耗低,速度快。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代虚拟机。】

 

Docker 架构

 

Docker是一个Client-Server结构的系统,Docker守护进程(Docker daemon)运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

说明

Docker Client 是用户界面,它支持用户与Docker Daemon之间通信。

Docker Daemon运行于主机上,处理服务请求。(Docker daemon有时也被称为“服务端”或者“引擎”)

Docker Container负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。

Docker 把应用程序及其依赖,打包在 image 文件里面。

镜像(Image):Docker 镜像(Image),Docker 镜像是用于创建 Docker 容器的模板。

容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。Docker 容器通过 Docker 镜像来创建。

Docker 仓库(Repository)是集中存放镜像的地方,存放镜像的仓库。目前 Docker 官方维护了一个公共仓库 Docker Hub。负责对Docker镜像进行管理的,是Docker Registry服务——类似仓库管理员。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。【当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。】

通过这些技术的组合,带来的效果(好处)就是,大部分应用,开发者都可以通过docker build创建镜像,通过docker push上传镜像,用户通过docker pull下载镜像,用docker run运行应用。用户不需要再去关心如何搭建环境,如何安装,如何解决不同发行版的库冲突。

特别说明:image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。

 

安装Docker

Docker 可以安装在 Windows、Mac,当然还有 Linux 之上,也可以在云上安装。可以选择不同方式完成 Docker 安装,包括手工安装、通过脚本方式安装和通过向导方式安装。

 

下面仅介绍如何安装 Windows 版 Docker。

Windows10中 Docker 的环境有以下要求:

Windows 10 Pro(专业版) / Enterprise(企业版) / Education(教育版)。

Windows 必须是 64 位的版本。

需要启用 Windows 操作系统中的虚拟机 Hyper-V。

虚拟机Hyper-V功能依赖于系统硬件的虚拟化功能,需要在BIOS里开启。

开机进入BIOS(联想的笔记本,进入BIOS按键是F2),

进入后按左右键选择configuration(配置),选择下面的 Intel Virtual Technology(Intel处理器),看是否是enable(若不是enable,回车选择enable,按F10回车即可)。

【Hyper-V是微软的一款虚拟化产品,Hyper-V 让你可以在 Windows 上以虚拟机形式运行多个操作系统。具体来说,Hyper-V 提供硬件虚拟化。 这意味着每个虚拟机都在虚拟硬件上运行。 Hyper-V 允许你创建虚拟硬盘驱动器、虚拟交换机以及许多其他虚拟设备,所有这些都可以添加到虚拟机中。使用多个虚拟机在多个操作系统上测试软件。 通过 Hyper-V,可以在一部台式机或便携式计算机上运行所有内容。 可以将这些虚拟机导出并随后导入到任何其他 Hyper-V 系统中,包括 Azure。关于Hyper-V的深入介绍与使用本文不再介绍,感兴趣的读者可以参见:

https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/about/

 

Windows 10操作系统如何启用Hyper-V功能?参见下图:

或:

 

在 CMD 或PowerShell中,使用DISM命令 启用 Hyper-V

以管理员身份打开 PowerShell 或 CMD 会话。

键入下列命令:

DISM /Online /Enable-Feature /All /FeatureName:Microsoft-Hyper-V

 

启用Hyper-V功能后,要重新启动计算机。

 

下载Docker

Docker 的下载页面:https://www.docker.com/products/docker-desktop,并单击其中的 Download for Windows 按钮,出现新网页,再单击Get Docker,参见下图:

 

安装Docker

双击下载的 Docker Desktop Installer (大小接近1G)安装文件,一路 Next,点击 Finish 完成安装。参见下图:

单击“OK”

安装完成后,Docker 会自动启动。任务栏右边的托盘区上会出现个小鲸鱼的图标 或

这表示 Docker 正在运行(已启动)。

 

Docker的使用

启动Docker后,验证安装是否正确,

在cmd或powershell中,输入docker version回车(按下Enter键),参见下图:

 

获取Docker帮助

输入docker 或docker help 或docker -h,可以查看到 Docker 客户端的所有命令选项,参见下图:

 

 

先给出Docker常见命令

查看信息、版本

docker info # 显示Docker系统信息

docker version # 显示Docker版本信息

容器相关操作

docker create # 创建一个容器但是不启动它

docker run # 创建并启动一个容器

docker stop # 停止容器运行,发送信号SIGTERM

docker start # 启动一个停止状态的容器

docker restart # 重启一个容器

docker rm # 删除一个容器

docker kill # 发送信号给容器,默认SIGKILL

docker attach # 连接(进入)到一个正在运行的容器

docker wait # 阻塞到一个容器,直到容器停止运行

获取容器相关信息

docker ps # 显示状态为运行(Up)的容器

docker ps -a # 显示所有容器,包括运行中(Up)的和退出的(Exited)

docker inspect # 深入容器内部获取容器所有信息

docker logs # 查看容器的日志(stdout/stderr)

docker events # 得到docker服务器的实时的事件

docker port # 显示容器的端口映射

docker top # 显示容器的进程信息

docker diff # 显示容器文件系统的前后变化

导出容器

docker cp # 从容器里向外拷贝文件或目录

docker export # 将容器整个文件系统导出为一个tar包,不带layers、tag等信息

执行

docker exec # 进入正在运行的Docker容器,可以执行bash进入交互式

镜像操作

docker images # 显示本地所有的镜像列表

docker import # 从一个tar包创建一个镜像,往往和export结合使用

docker build # 使用Dockerfile创建镜像(推荐)

docker commit # 从容器创建镜像

docker rmi # 删除一个镜像

docker load # 从一个tar包创建一个镜像,和save配合使用

docker save # 将一个镜像保存为一个tar包,带layers和tag信息

docker history # 显示生成一个镜像的历史命令

docker tag # 为镜像起一个别名

镜像仓库(registry)操作

docker login # 登录到一个registry

docker search # 从registry仓库搜索镜像

docker pull # 从仓库下载镜像到本地

docker push # 将一个镜像push到registry仓库中

先大体了解,下面将挑选其中的一部分解析之。

 

在容器内运行应用程序

使用 docker run 命令在容器内运行一个应用程序,输出Hello world。在cmd中输入

docker run ubuntu:15.10 /bin/echo "Hello world"

参数解析:

docker: Docker 的二进制执行文件。

run: 与前面的 docker 组合来运行一个容器。

ubuntu:15.10 指定要运行的镜像,Ubuntu是一个以桌面应用为主的Linux操作系统,是基于 Debian 的 Linux 操作系统。Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

/bin/echo "Hello world": 在启动的容器里执行的命令

上面命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器;如果你不指定一个镜像的版本的标签(tag),例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。/bin/bash:放在镜像名后的是命令。

参见下图:

 

现在,通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力,参数解析:

-t: 在新容器内指定一个伪终端或终端。

-i: 允许你对容器内的标准输入 (STDIN) 进行交互。参见下图:

注意第二行,此时我们已进入一个 ubuntu15.10 系统的容器,在容器中运行命令 cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表。参见下图:

 

可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。参见下图:

注意第三行中表明我们已经退出了当期的容器,返回到当前的主机中。

 

查看所有的容器命令 docker ps -a,参见下图:

 

查看正在运行的容器使用 docker ps 命令,参见下图:

上图中没有显示具体的容器,表示没有正在运行的容器。

停止容器的命令 docker stop <容器ID或者名字>

docker stop 85bd3fabcacb,参见下图:

 

使用 docker start <容器ID或者名字>启动一个已停止的容器:

docker start 85bd3fabcacb,参见下图:

 

删除容器,使用 docker rm <容器ID或者名字>命令

注意使用此命令,要删除的容器状态应为Exited,没有提示确认,直接删除。

 

要清理掉所有处于终止状态的容器,使用 docker container prune 命令

使用此命令,将如下提示,让你确认

WARNING! This will remove all stopped containers.

Are you sure you want to continue? [y/N]。参见下图:

 

可以使用docker top <ID或者名字> 命令,查看容器内部运行的进程。参见下图:

【提示:上图两条docker top 命令做的是同一件事,前者使用的是名字,后者使用的是ID号。】

可以使用docker logs <ID或者名字>  命令, 可以查看容器内部的标准输出。参见下图:

 

可以使用docker inspect <ID或者名字>  命令,查看 Docker 的底层信息——它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。参见下图:

 

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

 

使用docker image pull library/hello-world命令,将 image 文件从仓库抓取到本地,参见下图:

上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。

由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。

docker image pull hello-world

 

使用docker image ls或 docker images命令,可以列出本机的所有 image 文件,参见下图:

显示项的说明:

REPOSITORY:表示镜像的仓库源;TAG:镜像的标签(同一仓库源可以有多个 TAG,代表这个仓库源的不同的版本);IMAGE ID:镜像ID;CREATED:镜像创建时间; SIZE:镜像大小。

 

现在,可以使用docker container run hello-world运行hello-world这个 image 文件,参见下图:

 

输出这段提示以后,hello world就会停止运行,容器自动终止(有些容器可能不会自动终止,需要手动终止)。

 

可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web服务。我们可以通过 docker search httpd 命令搜索 httpd 来寻找适合我们的镜像。参见下图:

其中,NAME: 镜像仓库源的名称;DESCRIPTION: 镜像的描述;OFFICIAL: 是否 docker 官方发布;AUTOMATED: 自动构建。

 

删除 image 文件

使用 docker image rm [imageName]命令

有时删除镜像报错,一般是因有依赖的容器(container)。

需要先删除依赖的容器才能够删除其中的镜像,在此先使用docker container rm 2eb5c73e63e2,再使用docker rmi hello-world, 参见下图:

 

 

如何生成 image 文件/制作自己的 Docker 容器

学会使用 image 文件以后,接下来的问题就是,如何可以生成 image 文件?

这就需要用到 Dockerfile 文件。它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。换句话说,DockerFile包含了一条条构建镜像所需的指令和说明。

本部分参见阮一峰的的《Docker 入门教程》的“十、实例:制作自己的 Docker 容器”部分

http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

下面以 koa-demos 项目为例,介绍怎么写 Dockerfile 文件,实现让用户在 Docker 容器里面运行 Koa 框架。koa是一种简单好用的基于Node(node.js)的web开发框架。

作为准备工作,请先下载源码https://github.com/ruanyf/koa-demos/archive/master.zip

放在d盘解压,参见下图:

 

注意

其中,两个文本文件(可用记事本打开):

文本文件.dockerignore包含不要打包进入 image 文件中的路径。

 

文本文件 Dockerfile中含有五行,参见下图:

含义如下:

FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。

COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。

WORKDIR /app:指定接下来的工作路径为/app。

RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。--registry=https://registry.npm.taobao.org。

EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。

现在可以创建 image 文件了,先【用cmd的cd命令】切换路径 cd /d D:\koa-demos-master

使用docker image build命令创建 image 文件了,具体用下列命令之一:

docker image build -t koa-demo .

docker image build -t koa-demo:0.0.1 .

其中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。此命令运行可能需要较长的时间。参见下图:

请耐心等候提示运行成功(Successfully)。【还有一条警告信息,无关紧要不管它】

如果运行成功,就可以使用docker image ls命令看到新生成的 image 文件koa-demo了。参见下图:

 

使用docker container run命令会从 image 文件生成容器,具体用下列命令之一:

docker container run -p 8000:3000 -it koa-demo /bin/bash

docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash

其中,-p参数:容器的 3000 端口映射到本机的 8000 端口。 -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。 koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。 /bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。

参见下图:

如果一切正常,运行上面的命令以后,就会返回一个命令行提示符app#参见上图第二行。这表示你已经在容器里面了,返回的提示符就是容器内部的 Shell 提示符。执行node demos/01.js命令。参见下图:

这时,Koa 框架已经运行起来了。打开本机的浏览器,访问 http://127.0.0.1:8000,网页显示"Not Found"。

 

在容器的命令行,按下 Ctrl + c 停止 Node 进程,然后按下 Ctrl + d (或者输入 exit)退出容器。参见下图:

 

进入Docker容器

使用docker exec命令,可以进入正在运行的Docker容器  

【对于docker exec命令使用docker exec --help,可以得它的使用帮助】

使用进入一个正在运行的Docker容器命令,docker exec -it 33db0f67bf82 /bin/bash,参见下图:

 

容器运行成功后,就确认了 image 文件的有效性。这时,就可以考虑把 image 文件分享到网上——发布 image 文件,让其他人使用。

 

发布 image 文件的步骤如下

因为需要使用Docker ID登录,若没有,需要先去https://hub.docker.com  注册(若有可略过此步)。参见下图:

然后,用下面的命令登录。参见下图:

docker login

 

接着,为本地的 image 标注用户名和版本:

docker image tag [imageName] [username]/[repository]:[tag]

例如:

docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

 

也可以不标注用户名,重新构建一下 image 文件:

docker image build -t [username]/[repository]:[tag] .

 

最后,发布 image 文件:

docker image push [username]/[repository]:[tag]

发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。

 

Docker安装 Python

可以用 docker search python 命令来查看可用版本,参见下图:

 

这里我们拉取官方的镜像,标签为3.5,使用docker pull python:3.5命令,参见下图:

 

等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为python, 标签为 3.5 的镜像,使用docker images python:3.5命令,参见下图:

 

【查看python:3.5镜像的信息

使用docker image inspect python:3.5命令】

 

使用 python 镜像

在win10中用docekr创建python容器去执行本地.py文件,

在D:盘中新建目录pyfile,在pyfile目录中新建文件 pyth.py,内容如下:

print("Hello, World! My test");

print("呵呵");

参见下图:

win10中用docker容器运行本地python文件的命令:

docker run -v d:/pyfile:/usr/src/pyfile -w /usr/src/pyfile python:3.5 python pyth.py

其中:-v d:/pyfile:/usr/src/pyfile是将本机上要运行的代码文件(.py文件)的目录d:/pyfile挂载到容器中的执行路径/usr/src/pyfile。

-w /usr/src/pyfile指定容器的工作目录,就是执行py文件的路径。

python:3.5:镜像的名称和标签(版本号),这里就是指python3.5这个版本镜像。

python pyth.py表示用容器中的python命令执行pyth.py代码文件。

参见下图:

 

镜像加速

国内访问 Docker 的官方仓库很慢,还经常断线,所以要把仓库网址改成国内的镜像站。官方镜像之一: https://rregistry.docker-cn.com 。

对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Daemon。在 Registrymirrors 一栏中填写加速器地址 https://registry.docker-cn.com ,之后点击 Apply&Resart后 Docker 就会重启并应用配置的镜像地址了。参见下图:

 

将网址https://registry.docker-cn.com加入

然后,重启(Restart) Docker 。

 

有了上面的基础,再深入下去,就容易些。Docker涉及范围很广,本文就此打住,若想深入学习,可以参考:

Docker教程:Docker入门实践(精讲版)

http://c.biancheng.net/docker/

Docker之 runoob.com教程

https://www.runoob.com/docker/docker-tutorial.html

Docker中文网站:

http://www.docker.org.cn

Docker中文指南:

http://www.widuu.com/chinese_docker/index.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章