作者:微信小助手
发布时间:2021-04-13T17:07:10
大家好,我是 Guide哥!
废话也不多说,一篇文章带你上手 Docker!
原创不易,有帮助的话,欢迎点赞分享啊!
说实话关于 Docker 是什么并太好说,下面我通过四点向你说明 Docker 到底是个什么东西。
官网地址:https://www.docker.com/ 。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
传统的开发流程中,我们的项目通常需要使用 MySQL、Redis、FastDFS 等等环境,这些环境都是需要我们手动去进行下载并配置的,安装配置流程极其复杂,而且不同系统下的操作也不一样。
Docker 的出现完美地解决了这一问题,我们可以在容器中安装 MySQL、Redis 等软件环境,使得应用和环境架构分开,它的优势在于:
另外,《Docker 从入门到实践》[1] 这本开源书籍中也已经给出了使用 Docker 的原因。
接下来对 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 的具体用法了。
直接使用 Homebrew 安装即可
brew install --cask docker
下面来看看 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 利用容器独立运行一个或一组应用。它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。可以把容器看作是一个简易的 Linux 环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的
仓库是集中存放镜像文件的场所。仓库和仓库注册服务器是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。仓库分为公开仓库和私有仓库两种形式,最大的公开仓库是 DockerHub,存放了数量庞大的镜像供用户下载,国内的公开仓库有阿里云、网易云等
通俗点说,一个镜像就代表一个软件;而基于某个镜像运行就是生成一个程序实例,这个程序实例就是容器;而仓库是用来存储 Docker 中所有镜像的。
其中仓库又分为远程仓库和本地仓库,和 Maven 类似,倘若每次都从远程下载依赖,则会大大降低效率,为此,Maven 的策略是第一次访问依赖时,将其下载到本地仓库,第二次、第三次使用时直接用本地仓库的依赖即可,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 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 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,则需要对宿主机端口与容器内的端口进行映射: