Docker 从入门到上手干事!看这篇就够了!

作者:微信小助手

发布时间:2021-04-13T17:07:10

大家好,我是 Guide哥!

废话也不多说,一篇文章带你上手 Docker!

原创不易,有帮助的话,欢迎点赞分享啊!

Docker 介绍

什么是 Docker?

说实话关于 Docker 是什么并太好说,下面我通过四点向你说明 Docker 到底是个什么东西。

  • Docker 是世界领先的软件容器平台,基于  Go 语言  进行开发实现。
  • Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放开发人员。
  • 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
  • Docker可以 对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

官网地址:https://www.docker.com/

什么是Docker

为什么要用 Docker?

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

传统的开发流程中,我们的项目通常需要使用 MySQL、Redis、FastDFS 等等环境,这些环境都是需要我们手动去进行下载并配置的,安装配置流程极其复杂,而且不同系统下的操作也不一样。

Docker 的出现完美地解决了这一问题,我们可以在容器中安装 MySQL、Redis 等软件环境,使得应用和环境架构分开,它的优势在于:

  1. 一致的运行环境,能够更轻松地迁移
  2. 对进程进行封装隔离,容器与容器之间互不影响,更高效地利用系统资源
  3. 可以通过镜像复制多个一致的容器

另外,《Docker 从入门到实践》[1] 这本开源书籍中也已经给出了使用 Docker 的原因。

Docker 的安装

Windows

接下来对 Docker 进行安装,以 Windows 系统为例,访问 Docker 的官网:

然后点击Get Started

在此处点击Download for Windows即可进行下载。

如果你的电脑是Windows 10 64位专业版的操作系统,则在安装 Docker 之前需要开启一下Hyper-V,开启方式如下。打开控制面板,选择程序:

点击启用或关闭Windows功能

勾选上Hyper-V,点击确定即可:

完成更改后需要重启一下计算机。

开启了Hyper-V后,我们就可以对 Docker 进行安装了,打开安装程序后,等待片刻点击Ok即可:

安装完成后,我们仍然需要重启计算机,重启后,若提示如下内容:

它的意思是询问我们是否使用 WSL2,这是基于 Windows 的一个 Linux 子系统,这里我们取消即可,它就会使用我们之前勾选的Hyper-V虚拟机。

因为是图形界面的操作,这里就不介绍 Docker Desktop 的具体用法了。

Mac

直接使用 Homebrew 安装即可

brew install --cask docker

Linux

下面来看看 Linux 中如何安装 Docker,这里以 CentOS7 为例。

在测试或开发环境中,Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,执行这个脚本后就会自动地将一切准备工作做好,并且把 Docker 的稳定版本安装在系统中。

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

安装完成后直接启动服务:

systemctl start docker

推荐设置开机自启,执行指令:

systemctl enable docker

Docker 中的几个概念

在正式学习 Docker 之前,我们需要了解 Docker 中的几个核心概念:

镜像

镜像就是一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建多个容器

容器

容器是用镜像创建的运行实例,Docker 利用容器独立运行一个或一组应用。它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。可以把容器看作是一个简易的 Linux 环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的

仓库

仓库是集中存放镜像文件的场所。仓库和仓库注册服务器是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。仓库分为公开仓库和私有仓库两种形式,最大的公开仓库是 DockerHub,存放了数量庞大的镜像供用户下载,国内的公开仓库有阿里云、网易云等

总结

通俗点说,一个镜像就代表一个软件;而基于某个镜像运行就是生成一个程序实例,这个程序实例就是容器;而仓库是用来存储 Docker 中所有镜像的。

其中仓库又分为远程仓库和本地仓库,和 Maven 类似,倘若每次都从远程下载依赖,则会大大降低效率,为此,Maven 的策略是第一次访问依赖时,将其下载到本地仓库,第二次、第三次使用时直接用本地仓库的依赖即可,Docker 的远程仓库和本地仓库的作用也是类似的。

Docker 初体验

下面我们来对 Docker 进行一个初步的使用,这里以下载一个 MySQL 的镜像为例(在CentOS7下进行)

和 GitHub 一样,Docker 也提供了一个 DockerHub 用于查询各种镜像的地址和安装教程,为此,我们先访问 DockerHub:https://hub.docker.com/[2]

在左上角的搜索框中输入MySQL并回车:

可以看到相关 MySQL 的镜像非常多,若右上角有OFFICIAL IMAGE标识,则说明是官方镜像,所以我们点击第一个 MySQL 镜像:

右边提供了下载 MySQL 镜像的指令为docker pull MySQL,但该指令始终会下载 MySQL 镜像的最新版本。

若是想下载指定版本的镜像,则点击下面的View Available Tags

这里就可以看到各种版本的镜像,右边有下载的指令,所以若是想下载 5.7.32 版本的 MySQL 镜像,则执行:

docker pull MySQL:5.7.32

然而下载镜像的过程是非常慢的,所以我们需要配置一下镜像源加速下载,访问阿里云官网:

点击控制台:

然后点击左上角的菜单,在弹窗的窗口中,将鼠标悬停在产品与服务上,并在右侧搜索容器镜像服务,最后点击容器镜像服务:

点击左侧的镜像加速器,并依次执行右侧的配置指令即可。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://679xpnpz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker 镜像指令

Docker 需要频繁地操作相关的镜像,所以我们先来了解一下 Docker 中的镜像指令。

若想查看 Docker 中当前拥有哪些镜像,则可以使用 docker images 命令。

[root@izrcf5u3j3q8xaz ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
MySQL         5.7.32    f07dfa83b528   11 days ago     448MB
tomcat        latest    feba8d001e3f   2 weeks ago     649MB
nginx         latest    ae2feff98a0c   2 weeks ago     133MB
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB

其中REPOSITORY为镜像名,TAG为版本标志,IMAGE ID为镜像 id(唯一的),CREATED为创建时间,注意这个时间并不是我们将镜像下载到 Docker 中的时间,而是镜像创建者创建的时间,SIZE为镜像大小。

该指令能够查询指定镜像名:

docker image MySQL

若如此做,则会查询出 Docker 中的所有 MySQL 镜像:

[root@izrcf5u3j3q8xaz ~]# docker images MySQL
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
MySQL        5.6       0ebb5600241d   11 days ago     302MB
MySQL        5.7.32    f07dfa83b528   11 days ago     448MB
MySQL        5.5       d404d78aa797   20 months ago   205MB

该指令还能够携带-p参数:docker images -q-q表示仅显示镜像的 id:

[root@izrcf5u3j3q8xaz ~]# docker images -q
0ebb5600241d
f07dfa83b528
feba8d001e3f
d404d78aa797

若是要下载镜像,则使用:

docker pull MySQL:5.7

docker pull是固定的,后面写上需要下载的镜像名及版本标志;若是不写版本标志,而是直接执行docker pull MySQL,则会下载镜像的最新版本。

一般在下载镜像前我们需要搜索一下镜像有哪些版本才能对指定版本进行下载,使用指令:

docker search MySQL

不过该指令只能查看 MySQL 相关的镜像信息,而不能知道有哪些版本,若想知道版本,则只能这样查询:

docker search MySQL:5.5

若是查询的版本不存在,则结果为空:

删除镜像使用指令:

docker image rm MySQL:5.5

若是不指定版本,则默认删除的也是最新版本。

还可以通过指定镜像 id 进行删除:

docker image rm bf756fb1ae65

然而此时报错了:

[root@izrcf5u3j3q8xaz ~]# docker image rm bf756fb1ae65
Error response from daemon: conflict: unable to delete bf756fb1ae65 (must be forced) - image is being used by stopped container d5b6c177c151

这是因为要删除的hello-world镜像正在运行中,所以无法删除镜像,此时需要强制执行删除:

docker image rm -f bf756fb1ae65

该指令会将镜像和通过该镜像执行的容器全部删除,谨慎使用。

Docker 还提供了删除镜像的简化版本:docker rmi 镜像名:版本标志

此时我们即可借助rmi-p进行一些联合操作,比如现在想删除所有的 MySQL 镜像,那么你需要查询出 MySQL 镜像的 id,并根据这些 id 一个一个地执行docker rmi进行删除,但是现在,我们可以这样:

docker rmi -f $(docker images MySQL -q)

首先通过docker images MySQL -q查询出 MySQL 的所有镜像 id,-q表示仅查询 id,并将这些 id 作为参数传递给docker rmi -f指令,这样所有的 MySQL 镜像就都被删除了。

Docker 容器指令

掌握了镜像的相关指令之后,我们需要了解一下容器的指令,容器是基于镜像的。

若需要通过镜像运行一个容器,则使用:

docker run tomcat:8.0-jre8

当然了,运行的前提是你拥有这个镜像,所以先下载镜像:

docker pull tomcat:8.0-jre8

下载完成后就可以运行了,运行后查看一下当前运行的容器:docker ps

其中CONTAINER_ID为容器的 id,IMAGE为镜像名,COMMAND为容器内执行的命令,CREATED为容器的创建时间,STATUS为容器的状态,PORTS为容器内服务监听的端口,NAMES为容器的名称。

通过该方式运行的 tomcat 是不能直接被外部访问的,因为容器具有隔离性,若是想直接通过 8080 端口访问容器内部的 tomcat,则需要对宿主机端口与容器内的端口进行映射: