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/),存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括阿里云 、網易云 等

| 概念 | 說明 |
| --- | --- |
| 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
~~~

## 3.2 啟動
~~~
systemctl?start?docker
~~~
# 4、配置阿里云鏡像
## 4.1 阿里云賬號
登錄自己的阿里云賬號

## 4.2 配置鏡像
可以通過修改daemon配置文件`/etc/docker/daemon.json`來使用加速器。如果沒有該文件,創建。使用?`touch daemon.json`創建。

使配置的文件生效
~~~
//重新加載sudo?systemctl?daemon-reloadsudo?systemctl?restart?docker
~~~
# 5、Docker常用命令
## 5.1 鏡像命令
### 5.1.1列出本地主機上的鏡像
~~~
docker?images
~~~

參數說明
* ? REPOSITORY:表示鏡像的倉庫源;
* ? TAG:鏡像的標簽;
* ? IMAGE ID:鏡像ID;
* ? CREATED:鏡像創建時間;
* ? SIZE:鏡像大小;
提示:同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,我們使用 REPOSITORY:TAG 來定義不同的鏡像。如果你不指定一個鏡像的版本標簽,例如你只使用 ubuntu,docker 將默認使用 ubuntu:latest 鏡像
* * *
### 5.1.2查詢某個鏡像
~~~
docker?search?某個XXX鏡像名字
~~~
例如:查詢redis

* * *
### 5.1.3下載某個鏡像
~~~
docker?pull?某個XXX鏡像名字
~~~
例如下載redis、默認下載最新版本
~~~
//默認下載最新的redisdocker?pull?redis//下載指定的redis版本docker?pull?redis:4.0.1
~~~

* * *
### 5.1.4刪除某個下載的鏡像
~~~
docker?rmi?某個XXX鏡像名字ID
~~~
例如刪除 redis鏡像
~~~
docker?rmi?redis
~~~

## 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
~~~

**列出當前所有正在運行的容器**
~~~
docker?ps
~~~

在以centos鏡像創建一個centostest006 容器,同時查看運行的容器

### 5.2.2 停止容器
~~~
docker?stop?容器ID或者容器名
~~~
這里的容器ID可以通過docker ps 查看

### 5.2.3 刪除停止容器
~~~
docker?rm?容器ID
~~~

### 5.2.4 啟動容器
前提是已經根據鏡像創建過容器,只不過創建的容器暫時未啟動
~~~
docker?start?容器ID或者容器名
~~~

### 5.3.5 進入已運行的容器
**方式一:**?exec 是在容器中打開新的終端,并且可以啟動新的進程,因為是新終端,用exit退出,不會導致容器的停止。
~~~
docker?exec?-it?容器ID?/bin/bash
~~~

**方式二**
~~~
?docker?attach?容器ID
~~~
attach 直接進入容器啟動命令的終端,不會啟動新的進程。如果進入前臺交互式啟動容器,,**用exit退出,會導致容器的停止**。**用ctrl+p+q,不會導致容器停止**。如果進入后臺守護式啟動容器,不僅無法進行交互,并且ctrl+c會導致守護式進程停止。

> 提示:工作中我們一般使用 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退出,容器不停止

**測試 ctrl+p+q**

**測試exit**

- 后端
- 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