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")
- 后端
- composer
- composer配置国内镜像
- composer安装及设置2
- PHP
- 贝塔SG11加密
- 申请KEY
- 开始加密
- php 中连接tcp服务的三种方式
- php websocket 教程
- editor内容转换数组
- 使用正则判断中文维吾尔文
- PHP常用函数总结
- 常用助手函数
- 通过Imagick把pdf转换图片
- 维吾尔语基本区转换扩展区
- php GD库生成一个由文字和图片生成新的图片
- aes加密
- php数组函数 -- array_column,array_multisort 实现二维数组排序
- PHP操作Excel
- php更新内容
- 辅助查询(*)
- 【时间】操作
- 时间函数例子
- Date/Time 函数(不包含别名函数)
- php网络相关
- HTTP请求的返回值含义说明
- 使用php语言开发一个类似数据库操作的文件表类
- pinyin
- 维吾尔语基本区转换扩展区(2)
- php获取当前环境的信息
- laravel
- laravel 队列的使用
- laravel 自定义助手函数
- laravel seeder的使用
- laravel项目从git下载命令
- laravel 多个数据库配置
- laravel 填充假数据
- laravel 动态路由
- laravel 自定义 validate 响应
- laravel 创建追加字段的模拟访问器
- laravel 线上环境的数据库更改或添加字段
- laravel 模型查询按照whereIn排序
- laravel 使用 workerman 通过TCP 文件传输功能
- laravel api Header添加Accept头
- Laraval IDE 自动补全插件 laravel-ide-helper
- laravel 网站后台
- laravel 设置路由
- laravel-第三方composer包
- laravel 开发技巧
- laravel 昨天,今天时间
- 使用宝塔计划任务启动laravel调度器
- laravel结合workerman第二节
- Laravel - 上传多个文件
- 查询聊天好友列表
- 事件系统 event, listener
- laravel 安装 laravel-modules
- 自定义求看守器-toekn
- laravel限流
- 使用 Laravel api Resource 类时自定义分页信息
- Laravel php artisan命令大全
- 验证器
- workerman 创建wss服务
- 架构师必须知道的26项PHP安全实践
- python
- Python读取文件代码块已经备好,用的时候光拿(建议收藏)
- Python常用库大全
- api 签名验证
- git
- git命令
- 十分钟学会git基础
- Git代码同时上传到GitHub和Gitee(码云)
- Git - 多人协同开发利器,团队协作流程规范与注意事项
- 删除远程仓库的文件
- github查询方法
- 错误
- 解除项目git版本控制
- linux
- sentos安装supervisor
- PHP怎么守护进程运行php脚本
- 600条最强Linux命令总结
- centos开启防火墙、开放指定端口
- 前端
- vue
- vue2发布之前的config简单配置
- vue2安装scss命令
- vue2父子组件之间双向数据绑定
- 国际化双语--安装VueI18n
- vue3-setup 组件传参(defineProps、defineEmits、defineExpose
- Vue3 新写法速览:十分钟内轻松get
- 关于vue的外连接
- watch讲解
- computed
- webpack 打包后生成很多小文件怎么优化?
- vue2 vue.config.js常见配置和打包部署测试
- 小程序
- 小程序长期订阅消息
- 小程序自定义TabBar后如何实现keep-alive
- 收藏的html和css和js
- CSS 省略号(单行省略号、多行省略号)
- UyghurInput_a.js
- font.css
- 漂亮按钮样式
- clock.html
- css
- scroll css样式
- CSS流动布局-页面自适应
- css grid布局
- 禁止wap页面调整字体大小
- CSS @media 和 min-width/max-width
- 网站变灰是怎么实现的
- 瀑布流实现方式
- javascript
- SortableJS拖动排序
- wondow scroll滚动到上边
- 原生js插入HTML元素
- Konva.js —— 像操作DOM一样操作canvas
- 通过canvas合并俩个图片
- js scroll更多加载
- js 实现复制功能
- js判断安卓和苹果或者微信
- 浏览器打开控制台禁止
- 原生js一些dom操作
- js http客户端集合
- fetch
- axios
- canvas 点钟
- layer dialog
- jquery 和 laravel ajax全局配置
- layui 获取select的自定义参数
- konva.js中文开发文档
- js 大文件分片上传
- js监听网络状态实现断网重连后自动刷新页面
- js生成video缩略图
- JS获取当前系统电量情况
- uniapp
- uni-app swiper数量过多时卡顿优化方案
- uniapp 帖子集合
- 微信wap
- wap分享朋友和朋友圈
- wap 手机页面微信支付
- JsSdk微信公众号支付
- 通用各种小知识
- 正则表达式
- JS正则匹配过滤字符串中的html标签及html标签内的内容
- 判断维吾尔文输入
- 正则表达式符号
- 正则表达式练习
- 百度网盘不限速下载助手
- 解决VSCode下载慢或下载失败的问题
- 性能测试 使用Apache的ab测试工具
- nginx从入门到精通
- nginx
- Nginx 是怎么禁止访问php的 ?
- 宝塔面板
- supervisor
- 卸载宝塔
- redis
- redis实用笔记
- redis入门到精通
- phpredis
- redis数据库基础
- PHP对Redis的基本操作
- ffmpeg
- 合并多个音视
- 获取音视时长
- FFmpeg视频处理入门教程(新手必看)
- 外连接
- 安装
- PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法
- Linux安装ffmpeg
- docker
- 服务实现
- docker基本命令
- rewrite笔记
- 别人笔记链接
- 计算机常用知识
- 二进制1-10
- 斐波那契数列
- mysql
- 高性能高可用的MySQL,得从各种规范开始
- 读写分离配置
- 重要外连接,前端/ 后端/数据库等等
- 关于程序必须收藏的文章链接集合
- markdown
- 一篇文章讲清楚markdown