合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
https://mp.weixin.qq.com/s/5cF3xx5WFozPABsmpXGOyQ # 1、Docker是什么? **Docker 是一个开源的应用容器引擎**,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个**轻量级、可移植的容器中**,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 **docker能干嘛** 一次构建、随处运行 * • 更快速的应用交付和部署; * • 更便捷的升级和扩缩容; * • 更简单的系统运维;更高效的计算资源利用 # 2、Docker架构 Docker 包括三个基本概念: * • 镜像(image):Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,**一个镜像可以创建很多容器**。 * • 容器(container):Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。 * • 仓库(repository):仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等 ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjg0wm2JXodkB7A1kAFia1icUDMVqNd13LmSKqmvfRpUmS9bLhxf75Wdw7g/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") | 概念 | 说明 | | --- | --- | | Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 | | Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 | | Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 : 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 | | Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 | | Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信 | | Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 | **提示:** > 需要正确的理解仓储/镜像/容器这几个概念: Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。\* image 文件生成的容器实例,本身也是一个文件,称为镜像文件。\* 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器 \* 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。 # 3、Docker安装 ## 3.1 安装 Docker 支持以下的 64 位 CentOS 版本:CentOS 7 CentOS 8 更高版本... 以安装centos7为例 **使用官方安装脚本自动安装,安装命令如下:** ~~~ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun ~~~ 查看安装的docker ~~~ docker version ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgoZFvlQrqIO9rRr2lC1J08KUTyt1w6mjAvyWwCDVrRwe0shdBWhgw6A/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") ## 3.2 启动 ~~~ systemctl start docker ~~~ # 4、配置阿里云镜像 ## 4.1 阿里云账号 登录自己的阿里云账号 ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgicia7QvdUXia7v1bkGS6pB55ukMzFPpFldEkjOG17FIzXAZ05cibM9RHYA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") ## 4.2 配置镜像 可以通过修改daemon配置文件`/etc/docker/daemon.json`来使用加速器。如果没有该文件,创建。使用 `touch daemon.json`创建。 ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjg8aMHoibiaQSgPBIk0IAU6tQic0fBoUicFVfQK4reWx7KcaVQiaJibYtjNsJQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") 使配置的文件生效 ~~~ //重新加载sudo systemctl daemon-reloadsudo systemctl restart docker ~~~ # 5、Docker常用命令 ## 5.1 镜像命令 ### 5.1.1列出本地主机上的镜像 ~~~ docker images ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgCS2TrljF9R3D5aO8Iw7knVAZo7wKtwtBqLGJabdqoYVTEQbkmNc11Q/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") 参数说明 * • REPOSITORY:表示镜像的仓库源; * • TAG:镜像的标签; * • IMAGE ID:镜像ID; * • CREATED:镜像创建时间; * • SIZE:镜像大小; 提示:同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像 * * * ### 5.1.2查询某个镜像 ~~~ docker search 某个XXX镜像名字 ~~~ 例如:查询redis ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgmUnvDfrskrMnWibbddOZfCtEibvQzAWvjormoS9cp5GuoUQvhEwn1urw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") * * * ### 5.1.3下载某个镜像 ~~~ docker pull 某个XXX镜像名字 ~~~ 例如下载redis、默认下载最新版本 ~~~ //默认下载最新的redisdocker pull redis//下载指定的redis版本docker pull redis:4.0.1 ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjg6Knkk7bddyHib1WeAyljtVibkO84Rvxiap2ubQMnAYKNhn2VSIx2wdicpA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") * * * ### 5.1.4删除某个下载的镜像 ~~~ docker rmi 某个XXX镜像名字ID ~~~ 例如删除 redis镜像 ~~~ docker rmi redis ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgePq5GrkZbn1AAXT5AoMUcIzUibBG8WSYUALBQGl8xAj8YgiaxwIiaKIzw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") ## 5.2 容器命令 ### 5.2.1 新建并且启动容器 **新建并且启动一个容器、前提是由对应的镜像。一个镜像可以创建多个容器。** ~~~ docker run [OPTIONS] IMAGE [COMMAND] [ARG...] ~~~ > OPTIONS说明(常用):有些是一个减号,有些是两个减号 --name="容器新名字": 为容器指定一个名称;-d: 后台运行容器,并返回容器ID,也即启动守护式容器;-i:以交互模式运行容器,通常与 -t 同时使用;-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;-P: 随机端口映射;-p: 指定端口映射,有以下四种格式 ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort 例如以centos镜像创建一个centostest005的容器,在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。 ~~~ docker run -itd --name centostest005 centos /bin/bash ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgk6icm1Rv10PMhTpKgSl6nXZBD6CeickzWRLYicnnk4f6ibpTBzJeGia4ePA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") **列出当前所有正在运行的容器** ~~~ docker ps ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgvibfwAbhxsZVRAHXNDgS0s1umuKIaoRicaiajvibFiaf2gEcO3VHRkOsSlQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") 在以centos镜像创建一个centostest006 容器,同时查看运行的容器 ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgzwSoPuiczqGcC7icDCP21VaRbrZuOt75SR2uxvuicfXDvFUCSpIK4PKWw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") ### 5.2.2 停止容器 ~~~ docker stop 容器ID或者容器名 ~~~ 这里的容器ID可以通过docker ps 查看 ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgrRzNajsWPSZGZnGLfVIVlUtXgYxWpw2ltGQuk1oAv5EWeN1yo102TQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") ### 5.2.3 删除停止容器 ~~~ docker rm 容器ID ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgu4O52wXtRCtAnqZbSHT2zJQCXnj78qNicIiapZwia2ibynrDcnyPjuy0Gw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") ### 5.2.4 启动容器 前提是已经根据镜像创建过容器,只不过创建的容器暂时未启动 ~~~ docker start 容器ID或者容器名 ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgFXFj0PyVeHiccUW2BMibSAaVjxcGKdaZ87cUGGZ9R2lYF2tzLkxicarjQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") ### 5.3.5 进入已运行的容器 **方式一:** exec 是在容器中打开新的终端,并且可以启动新的进程,因为是新终端,用exit退出,不会导致容器的停止。 ~~~ docker exec -it 容器ID /bin/bash ~~~ ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgFV7neCMk3PGS0xLyicK4ibibkPo1IiaW6rvUwoHUEeNQLNRPm4avfyqRqQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") **方式二** ~~~  docker attach 容器ID ~~~ attach 直接进入容器启动命令的终端,不会启动新的进程。如果进入前台交互式启动容器,,**用exit退出,会导致容器的停止**。**用ctrl+p+q,不会导致容器停止**。如果进入后台守护式启动容器,不仅无法进行交互,并且ctrl+c会导致守护式进程停止。 ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgGtaDiauTgmmUu7KBqI90zSZNRfMpshqVsU1Kq6XtQHS44YCibNyl4ngQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") > 提示:工作中我们一般使用 docker run -d image:tag /bin/bash启动容器,再通过docker exec -it 容器ID /bin/bash,最为安全可靠。 ### 5.2.6 退出容器的方法 1. 1\. exit:run进去容器,exit退出,容器停止 2. 2\. ctrl+p+q:run进去容器,ctrl+p+q退出,容器不停止 ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjg9ciaZYcCHX7nlhg3IjrBQwCUzGjfCnpia5D0jFUsphB9EM9yXHUZiaNicg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") **测试 ctrl+p+q** ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgWLFE6B5IwGS6CFn0hiaDYOTribUG0GKrcI9rEGpBCH17A64zDq4NS32w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null") **测试exit** ![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/AuPzxadzKEGuvAp8pjuCTQjSsYgibgHjgduBOnwZdzkJLmhC2zaf8KQctzCvribcNGuGFMicLKiaI7orNnVSAXBiajw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1 "null")