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或用户需要的其它应用程序。 这里的镜像就如下方虚拟机创建时候使用的镜像类似。这个镜像便于移动,并且这个镜像我们可以交给任何人使用,其他人使用的时候也很方便,只需要将其实例化即可。
notion image

容器(Container)

Docker容器是由Docker镜像创建的运行实例,类似VM虚拟机,支持启动,停止,删除等。 每个容器间是相互隔离的,容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。 容器就类似与虚拟机中我们创建好的虚拟机系统,之后我们所有的操作都是在容器中进行的,我们的程序也是运行在容器中。
notion image

仓库(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 文件,生成一个正在运行的容器实例。
notion 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

 
 

参考文章

 
Git使用指南已解决| mysql无法彻底卸载
Loading...