type
status
date
slug
summary
tags
category
icon
password
零、为什么使用docker?
软件开发最大的麻烦事之一,就是环境配置。
It works on my machine.
环境配置麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。
虚拟机
虚拟机(virtual machine)就是带环境安装的一种解决方案。但是,这个方案有几个缺点。
- 资源占用多 虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
- 冗余步骤多 虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
- 启动慢 启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
Docker
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker用途:
- 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
- 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
- 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
一、Docker 的三个基本概念
镜像(Image)
Docker的镜像概念类似于虚拟机里的镜像(比如.ISO文件),是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
image是二进制文件。image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了MySQL或用户需要的其它应用程序。
这里的镜像就如下方虚拟机创建时候使用的镜像类似。这个镜像便于移动,并且这个镜像我们可以交给任何人使用,其他人使用的时候也很方便,只需要将其实例化即可。
容器(Container)
Docker容器是由Docker镜像创建的运行实例,类似VM虚拟机,支持启动,停止,删除等。
每个容器间是相互隔离的,容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。
容器就类似与虚拟机中我们创建好的虚拟机系统,之后我们所有的操作都是在容器中进行的,我们的程序也是运行在容器中。
仓库(Repository)
镜像便于传播,而仓库就是专门用来传播这些镜像的地方,他有点类似与Github,或者你可以把他看成一个存放各种镜像的镜像商店
Docker官方的仓库: 他的服务器处于国外,所以下载速度较慢,不过我们可以通过换源解决。
daocloud国内仓库: 国内也有一些优秀的商店,他和Docker官方的仓库的区别类似与Github和Gitee的区别。
网易云镜像中心镜像的基础操作
二、安装(非C盘)
1、用管理员身份打开 Powershell 窗口,然后运行如下命令:
cmd /c mklink /j "C:\Program Files\Docker" "D:\Program Files\Docker"
以上代码输出如下:
为 C:\Program Files\Docker <<===>> D:\Program Files\Docker 创建的联接
注意需要保证D:\Program Files\Docker存在(如无,自己创建对映名字文件夹,否则在安装Docker时会报错)。
2.官网下载安装包
在安装包所在路径下:
start /w "" "Docker Desktop Installer.exe" install --installation-dir=D:\Program Files\Docker
三、对镜像的基础操作
获取当时所有镜像(docker images)
标签 | 含义 |
REPOSITORY | 镜像所在的仓库名称 |
TAG | 镜像标签 |
IMAGEID | 镜像ID |
CREATED | 镜像的创建日期(不是获取该镜像的日期) |
SIZE | 镜像大小 |
拉取镜像(docker pull)
除了使用官方的镜像外,我们还可以在仓库中申请一个自己的账号,保存自己制作的进行,或者拉去使用他人的镜像。
示例:docker image pull library/hello-world
由于 Docker 官方提供的 image 文件,都放在library
组里面,所以它的是默认组,可以省略。
删除镜像(docker rmi)
删除镜像的前提是没有使用这个镜像的容器,如果有需要先删除容器(报错:
Error response from daemon: conflict: unable to delete 镜像ID (must be forced) - image is being used by stopped container 容器ID
则代表有容器使用了此镜像。)可以尝试先执行 docker rm 容器ID
删除容器
几条删除命令的区别docker rm
: 删除一个或多个 容器
docker rmi
: 删除一个或多个 镜像
docker prune
: 用来删除不再使用的 docker 对象
加载镜像(docker run)
上面我们说过,镜像只是一个只读类型的文件,而我们的环境不可能只是一个这样的文件,所以我们需要把这个镜像加载成我们的环境,也就是让他变成容器。
常用可选参数 | 作用 |
-i | 表示以《交互模式》运行容器。 |
-d | 会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。 |
-t | 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 |
–name | 为创建的容器命名。(默认会随机给名字,不支持中文字符!!!) |
-v | 表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 |
-p | 表示端口映射,即宿主机端口:容器中端口。 比如:-p 8080:80 就是将容器中的80端口,映射到主机中的8080端口 |
–network=host | 表示将主机的网络环境映射到容器中,使容器的网络与主机相同。每个 Docker 容器都有自己的网络连接空间连接到虚拟 LAN。使用此命令则会让容器和主机共享一个网络空间。 |
可以启动一个系统
docker run -i -d -t --name=kali-test kalilinux/kali-rolling
(这里我使用linux的一个发行版kali作为介绍)或可以简写为
PS: 如果加载一个我们没有的镜像,docker会自动从官方仓库中进行拉去。
docker container run hello-world
会从 image 文件,生成一个正在运行的容器实例。
查看容器(docker ps)
查看容器主要会用到ps命令
标签 | 含义 |
CONTAINER ID | 镜像ID |
IMAGE | 创建容器的镜像名称 |
COMMAND | 默认启动命令(启动时会自动执行) |
CREATED | 创建容器的日期 |
STATUS | 当前的状态(启动了多久,多久之前退出等) |
PORTS | 映射的端口 |
NAMES | 容器的名称 |
SIZE | 容器大小(使用-s命令参数时才能看到) |
启动和关闭容器
- 如果我们成功启动或者关闭一个容器的话,会返回容器名或者容器id
- stop和kill的区别:
- stop是比较优雅的关掉一个容器,类似我们正常退出一个软件
- kill是当一个进程出现意外无法正常关闭的时候,我们强行进行关闭,有点像我们使用任务管理器进行结束进程操作
删除容器(docker rm)
如我我们需要删除一个容器,首先需要确保这个容器已经停止了,因为正在运行的容器是无法直接删除。
我们可以运行一下
docker ps -a
,如果发现没有停止,可以使用docker stop
停止(STATUS下已Exited开头则是停止的)如果报错
Error response from daemon: You cannot remove a running container 容器ID. Stop the container before attempting removal or force remove
则代表这个容器已经启动,需要执行 docker stop 容器id
,停止此容器。将容器重命名
容器制作成镜像
我们将打包备份的镜像可以通过网络发送到其他设备上,使用docker镜像解压即可直接使用你的环境。
四、Docker Dashboard(Docker 仪表板)
Docker 仪表板的主要作用为:快速访问容器日志,启动容器的 shell,并轻松管理容器生命周期(停止、删除等)。
五、实战
…
mysql
redis
rabbitmq
…
参考文章
- 作者:Rainnn
- 链接:https://tangly1024.com/article/2847ff06-b7c8-4524-9ec2-1a907783e6ed
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。