# Docker
## 一、概述
在傳統的開發過程中,以Java后端開發為例,一般都會打成jar包之后傳送到服務器當中,然后在服務器中使用命令`java -jar *.jar`來運行。這種方式會使所有的項目都在宿主機上的操作系統運行,彼此之間沒有隔離,很有可能出現因為一個服務內存泄漏占用大量的內存而導致所有的服務都不可用的情況。
采用容器技術就可以讓服務之間彼此隔離,可以將每個容器都看成單獨的操作系統(甚至可以看成單獨的一臺主機),對于運行在容器中的服務彼此之間是隔離的。
容器技術從本質上說就是一個與主機上其他進程相互隔離的進程,Docker就是容器技術的一種。
### 1.1 歷史
1. 2010年,在美國成立的`dotCloud`公司做一些 pass (移動社交APP)的云計算服務和Linux相關的容器技術,并將自己做的容器化技術命名為Docker。Docker一開始并沒有引起注意,但在2013年Docker開源之后,就引起越來越多人的注意了。開源之后每個月都會更新一個版本,并于2014年4月9日時發布Docker1.0版本。
2. Docker為什么這么火?
Docker的核心是容器技術,容器非常輕巧,在容器技術出來之前使用的是虛擬技術(例如Vmware軟件),但是虛擬機的是非常笨重的,一臺虛擬機就可以看成是完整的一臺電腦了。而容器也是一種虛擬化技術。但是其使用的是鏡像技術,其里面只包括運行所需要的操作系統最核心的環境,然后自己再根據需要安裝其他的環境(在容器中甚至沒有ll命令),這樣要比虛擬機小很多。通常虛擬機是G級別的,容器是M級別的。
~~~
?例如在虛擬機中安裝centos7系統可能需要2個G,但是在docker中安裝centos7鏡像只要200MB左右。
~~~
架構對比:
:-: 
區別:
1. 虛擬機占用的資源非常多、同時啟動也比較慢,分鐘級別的;而容器占用的資源相對較少,啟動也比較快,幾秒就能啟動一個應用。
2. 虛擬機是會模擬一個完整的操作系統的,而容器化技術并不會,只會安裝操作系統最核心的組件。每個項目都可以和自己所需要的環境打包形成一個應用。
3. 容器內的應用直接運行在宿主機,容器是沒有自己的內核的,也沒有虛擬硬件功能。`并且每個容器是相互隔離的,每個容器都有自己的文件系統,互不影響。`
4. Docker能夠充分的利用服務器的資源。
### 1.2 基本組成
架構圖:
:-: 
由三個部分組成:`客戶端,服務器,遠程倉庫docker hub。`
Docker服務的組件:
1. 鏡像:image 好比是一個模板,可以用這個模板來創建容器服務,同時這個鏡像可以創建多個容器,而最終的服務就運行在容器中的。
2. 容器:container 通過鏡像創建,獨立運行一個或一組應用,是一個相互隔離的進程。容器可以啟動,停止,刪除。每個容器都可以看成是簡易的linux系統。在項目中每個組件可以看成一個容器,例如mysql,redis等。
3. 倉庫:repository 存放鏡像的地方。分為公有倉庫和私有倉庫。例如Docker Hub,阿里云等。
~~~
?daemon:守護進程
~~~
### 1.3 Docker是怎么工作的?
Docker是一個C/S結構的系統,Server的守護進程(daemon)運行在主機上。客戶端通過守護進程與容器進行通信。
:-: 
新建一個容器的時候,docker不需要像虛擬機一樣重新加載一個操作系統內核,避免引導,虛擬機加載Guest OS,加載時間為分鐘級別,而docker是利用宿主機的操作系統,省略了復雜的過程,加載時間是秒級別的。
簡單來說,虛擬機技術通過軟件模擬了一整套的操作系統,包括硬件設備;而容器技術仍然用的是宿主機中的硬件設備。
**其他:**
Docker是使用Go語言開發,開源 。
官網:[https://www.docker.com/](https://www.docker.com/),Docker的文檔非常詳細。
倉庫地址:[https://www.docker.com/products/docker-hub](https://www.docker.com/products/docker-hub) 搜索鏡像,查看鏡像版本及其使用方法。
## 二、安裝
以centos為例,其他操作系統的安裝可以前往[官網](https://docs.docker.com/engine/install/centos/)查看。
1. 查看自己Linux的環境,確定當前Linux的發行版
查看發行版本
~~~
?cat /etc/os-release
~~~
輸出:
~~~
?NAME="CentOS Linux"
?VERSION="7 (Core)"
...
~~~
例如這里使用的是阿里云的Centos7的Linux,安裝Docker時要安裝相應的版本。
2. 查看是否有舊的docker版本,有的話卸載舊的版本
~~~
?sudo yum remove docker \
? ? ? ? ? ? ? ? ? docker-client \
? ? ? ? ? ? ? ? ? docker-client-latest \
? ? ? ? ? ? ? ? ? docker-common \
? ? ? ? ? ? ? ? ? docker-latest \
? ? ? ? ? ? ? ? ? docker-latest-logrotate \
? ? ? ? ? ? ? ? ? docker-logrotate \
? ? ? ? ? ? ? ? ? docker-engine
~~~
3. Centos要先安裝yum下載工具,yum類似于Ubuntu中的apt
~~~
?yum install -y yum-utils
~~~
yum是一個基于RPM的包管理工具,能夠從指定的服務器中自動下載RPM包和一次性安裝所有的依賴。
4. 正式安裝Docker前先設置Docker的鏡像倉庫
~~~
?sudo yum-config-manager \
? ? ?--add-repo \
? ? http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
~~~
現在的centos已經不再維護了,直接這樣可能會出錯,根據出錯信息上網查找即可解決。
5. 更新yum軟件包索引
~~~
?yum makecache fast
~~~
6. 安裝docker,其中docker-ce是社區版,docker-ee是企業版,docker-ce-cli是docker的客戶端。
~~~
?sudo yum install docker-ce docker-ce-cli containerd.io
~~~
7. 檢查docker是否安裝成功
~~~
?docker version
~~~
輸出:
~~~
?Client: Docker Engine - Community
? Version: ? ? ? ? ? 20.10.5
...
~~~
8. 啟動docker
~~~
?systemctl start docker
~~~
9. 運行docker中自帶的hello-world鏡像
~~~
?docker run hello-world
~~~
輸出:
~~~
?Unable to find image 'hello-world:latest' locally # 在本地找不到鏡像
?latest: Pulling from library/hello-world # 從遠程倉庫進行拉取
?b8dfde127a29: Pull complete # b8dfde127a29這是鏡像id
?Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
?Status: Downloaded newer image for hello-world:latest
??
?Hello from Docker!
?This message shows that your installation appears to be working correctly.
??...
~~~
10. 查看docker下的所有鏡像
~~~
?docker images
~~~
輸出:
~~~
?REPOSITORY ? TAG ? ? ? IMAGE ID ? ? ? CREATED ? ? ? SIZE
?hello-world ? latest ? d1165f221234 ? 2 weeks ago ? 13.3kB
~~~
`Image ID是鏡像id,可以用來指示唯一這個鏡像,后面中經常用到。`
11. 配置阿里云鏡像
在網址:[https://cr.console.aliyun.com/cn-qingdao/instances/mirrors](https://cr.console.aliyun.com/cn-qingdao/instances/mirrors)找到鏡像加速器。
:-: 
配置鏡像加速器:
~~~
?sudo mkdir -p /etc/docker
?sudo tee /etc/docker/daemon.json <<-'EOF'
?{
? ?"registry-mirrors": ["https://vawx0tcn.mirror.aliyuncs.com"]
?}
?EOF
?sudo systemctl daemon-reload
?sudo systemctl restart docker
~~~
**拉取一個鏡像的執行流程**
:-: 
**安裝圖形化界面**
Docker提供一個通過瀏覽器圖形化界面操作的軟件Portainer給我們使用,安裝方式如下:
~~~
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
~~~
訪問地址為:http://ip:8080
## 三、命令
### 3.1 幫助命令
~~~
docker version # docker版本信息
docker info # docker系統信息,包括鏡像和容器的數量
docker 命令 --help # 幫助命令
~~~
### 3.2鏡像相關命令
~~~
docker images # 查看本地所有鏡像
docker search mysql # 搜索mysql鏡像
docker pull mysql:tag # 拉取Tag標簽的鏡像
docker rmi -f 鏡像id # 刪除鏡像
~~~
### 3.3 容器相關命令
1. 創建一個容器
~~~
docker run -itd --name=容器name -p 主機端口:容器端口 鏡像名
~~~
2. 查看運行中的容器
~~~
docker ps # 查看運行中容器
docker ps -a # 查看歷史容器
~~~
3. 刪除容器
~~~
docker rm [-f] 容器id #-f強制刪除
docker rm -f $(docker ps -aq) # 刪除所有的容器
docker rm -aq|xargs docker rm # 刪除所有容器
~~~
4. 操作創建完成的容器
~~~
docker start 容器id # 啟動容器
docker restart 容器id # 重新啟動容器
docker stop 容器id # 停止容器
docker kill 容器id # 強制關閉容器
~~~
5. 查看容器日志
~~~
docker logs -tf --tail number 容器id
~~~
- -t 顯示時間戳
- -f 格式化顯示
- --tail number 顯示的條數
只有容器在運行的時候才會有日志。
6. 查看容器中的進程信息
~~~
docker top 容器id
~~~
7. 查看容器元數據信息
~~~
docker inspect 容器id
~~~
和網絡相關比較重要的是有個局域網的IPV4地址。
8. 拷貝容器內文件
~~~
docker cp 容器id:容器文件路徑 主機保存文件路徑
~~~
:-: 
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper