Docker
docker為什么出現?
一款產品:開發–上線 兩套環境, 兩套配置
開發 和 運維 問題:在我的電腦上可以運行,版本更新,導致服務不可用!對於運維來說,考驗十分的大
開發即是運維的情況下更是如此,每一個機器都要部署環境,浪費時間和人力,容器化,項目帶着環境來打包,配置很麻煩,也有部分不能跨平台比如開發win,打包到linux
傳統思想 : 開發jar 運維來做
現在 : 開發打包部署上線,一套流程做完
為什么docker厲害?
java --apk --發布 — 張三使用 apk — 安裝即可用!
java —jar —打包項目帶上環境(鏡像) — (docker倉庫鏡像)–下載開發人員上傳的鏡像 – 直接就可以運行
docker根據以上的問題給出了解決方案
docker的思想來自於集裝箱

JRE - -多個應用—原來是交叉的
docker的核心思想 : 隔離,打包裝箱,每個箱子都是互相隔離的
Docker通過隔離機制,讓服務器更好的發揮
本質 : 所有的技術都是出現了問題,我們需要去解決
Docker的歷史和作用
2010,幾個搞it的年輕人,最開始的時候並不叫 Docker dotcloud
做一些pass的雲計算服務,LXC有關的容器技術
他們將自己的技術(容器化技術)同一的命名為 Docker
應為剛誕生所以沒什么基礎,於是乎領導人們選擇了將Docker的源碼開放
開源之后的Docker一瞬間就火了
為什么Docker火起來了,應為相比虛擬機,Docker要更加的輕量
虛擬機 :
一般都是再win中安裝Vmware 通過這個技術我們可以虛擬出來一台電腦或者是多台電腦,但是占用過大,隨便一個鏡像就是十幾個g,十分的笨重

虛擬機技術的缺點:
- 資源占用十分多
- 開機關機需要時間
- 運行完整的操作系統,還要安裝運行軟件
Docker :
相比之下Docker就顯得格外的小巧。隔離,鏡像(核心的環境4m+jdk+mysql)需要的時候我們只需要去運行鏡像就可以了,大大提升了靈活性
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ig48vjrP-1636124633471)(docker.assets/image-20211006143627502.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzE0MTBhZDQ1ODc0YjQ5ZTJiNDk5ZTA5ZTQzZjZiYTljLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzIwLGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
Docker技術 :
- 運行在操作系統之上,容器沒有內核,也不用虛擬硬件
- 每個容器是互相隔離的,又屬於自己的文件系統,不會互相的影響
了解了Docker的作用,可以知道我們程序員掌握Docker是十分的必要的
社區文檔
Docker的社區文檔是十分的詳細的
文檔連接 : https://docs.docker.com/
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iszg1TIj-1636124633472)(docker.assets/image-20211006143117018.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzZjMmY5ZDZhOWFjNzRhNGY5MjViMTY1NTI3ODBjNTVjLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzIwLGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
Docker倉庫地址 : https://www.docker.com/products/docker-hub
DevOps(開發和運維)
他的宗旨是什么
應用更快速的交付和部署
- 傳統 : 一堆幫助文檔,安裝程序
- Docker:打包鏡像發布測試,一鍵運行
更便捷的升級和擴容
使用了Docker之后,我們部署的應用和搭積木一樣
項目打包成一個鏡像,擴展到服務器A,服務器B
更簡單的系統運維
在容器化之后,我們的開發,測試環境,高度的一致
更高效的計算資源利用
Docker是內核級別的虛擬化,可以在一個物理機上運行很多的容器實例
Docker安裝
Docker的組成結構

鏡像:
Docker的鏡像就像是一個模板,可以榮國這個模板來創建容器服務
例子:
tomcat ====》run ===》tomcat01容器(提供服務)
我們可以同過鏡像創建多個容器(最終服務運行或者是項目運行都是在容器中的)
容器:
Docker利用容器技術,獨立運行一個或者一組應用,通過容器來創建的
啟動,停止,刪除,等基本命令
目前我們可以把容器理解為一個建議的linux系統,項目都是跑在系統上的
倉庫:
倉庫就是存放鏡像的地方
有私有的有共有的
DockerHub
阿里雲等等廠商都有鏡像服務
安裝Docker
環境准備
- 需要會一點點linx的基礎
- linux : CentOS7
- 使用連接工具連接服務器操作
確認系統環境
[root@iZwz90ps06ioyada63oiwiZ ~]# uname -r
3.10.0-957.21.3.el7.x86_64
[root@iZwz90ps06ioyada63oiwiZ ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
官方文檔可以看到要求:

我們如果是用的linxu系統是 CentOS 那么必須是 7 版本以上才支持的
如果安裝裝過的話,建議刪除之前的舊版本的docker
#1·卸載掉舊的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2 需要的安裝包
sudo yum install -y yum-utils
#3設置鏡像的倉庫,默認是國外的(建議大家使用阿里雲的鏡像)
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4 安裝docker相關的內容
yum install docker-ce docker-ce-cli containerd.io
#5 安裝之后測試是否安裝成功
systemctl start docker
#6查看docker的版本號
docker version
之后查看我們docker的版本即可
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ePuATjGc-1636124713724)(docker.assets/image-20211006150606651.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuL2FlOTkxZDQ0MWNjYjQ1YjU5YjE3ZWNlZjI5NzJjYWY0LnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzE5LGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
#7 運行docker的helloword
docker run hello-world
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rp9i6Juv-1636124713733)(docker.assets/image-20211006150917425.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuL2ZjYWFlYWE1OTQyMzQ4NDRiZTU2MWUwZTZkYjk4MmIyLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzIwLGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
# 8 如何查看docker下載的鏡像呢?
docker images
# 就可以查看docker下載的位置了
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GL3I91BF-1636124713734)(docker.assets/image-20211006150957136.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzgyMTM4Mjk2YTlhOTQwMTZiMWRhZTIxYjg2MzNiN2JmLnBuZw==.png)
了解 如何卸載docker
#1 卸載docker的相關內容
yum remove docker-ce docker-ce-cli containerd.io
#2 卸載docker的和我們下載容器
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# /var/lib/docker 是 docker的默認工作路徑
提升效率
阿里雲的容器加速
-
登錄阿里雲找到容器服務
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rhj7cGzW-1636124713734)(docker.assets/image-20211006151353748.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzJkNTY3YzJhZGRhZjQyYzBiMjYzMDBmOGQwNDc2ZDgxLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzE0LGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
-
找到鏡像加速地址
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NdNfGIj4-1636124713735)(docker.assets/image-20211006151407490.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuL2ZmYWM5OTYwNTI4ODRmMGM4MTQzM2FjMTI1ZDU3OWY3LnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzIwLGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
-
配置使用
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://v3ev0217.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
底層原理
docker是做什么工作的?
Docker是一個 Client server的系統,Docker是守護進程運行在主機上。通過socket從客戶端訪問
DockerServer接受到Docker-Client的指令,就會去執行這個命令。
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7THQCK30-1636124910502)(docker.assets/image-20211006164315668.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuL2E2YjI1YThlZWI1ZTRhNmFiYjI1ZDI2OWIzYmFhYmFhLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzIwLGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
Docker為什么比虛擬機快
-
Docker有着比虛擬機更少的抽象層
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VCnuFml4-1636124910503)(docker.assets/image-20211006164353290.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzUwYjAwZDAyNTMxYzRlMGZiOWI2NjQ0NDQ5OWFhNGYxLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzE1LGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
-
Docker利用的是主機的內核,vm需要的是Guset OS
-
所以說新建一個容器的時候,docker不需要想虛擬機一樣重新加一個操作系統的內核,避免引導,
-
虛擬機是加載 Guest OS 分鍾級別的,
-
而docker是利用主機的操作系統,省略了這個復雜的加載過程,秒級別
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ppCkvMSA-1636124910504)(docker.assets/image-20211006164648744.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzBjNDgyZDM4OWU1NTQwYTk4NGZjZmM2ODgwZmI1ZjZiLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzE3LGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
現在的docker是都支持的
不只支持 linux,Mac OS, windows都支持
之后又docker的使用經驗之后我們回過頭來再看理論,就會理解的很清晰了
常用命令
Docker imeages #查看所有本地的主機上有的鏡像
[root@iZwz90ps06ioyada63oiwiZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 days ago 13.3kB
#解釋
REPOSITORY 鏡像的倉庫源
TAG 鏡像的標簽
IMAGE ID 鏡像的id
CREATED 鏡像的創建時間
SIZE 鏡像的儲存大小
#可選項
-a -all #列出所有的鏡像
-q --quiet #只顯示鏡像的id
Docker pull 下載
#下載內容 ,默認的tag 是 latest
#可以按照版本號 ,也可以直接用mysql下載版本
[root@iZwz90ps06ioyada63oiwiZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
07aded7c29c6: Already exists #分段的下載,聯合文件系統,不用重復下載,可以共用重復的部分
f68b8cbd22de: Already exists
30c1754a28c4: Already exists
1b7cb4d6fe05: Already exists
79a41dc56b9a: Already exists
00a75e3842fb: Already exists
b36a6919c217: Already exists
5e11fe494f45: Pull complete
9c7de1f889a7: Pull complete
cf6a13d05a76: Pull complete
fc5aa81f393a: Pull complete
Digest: sha256:360c7488c2b5d112804a74cd272d1070d264eef4812d9a9cc6b8ed68c3546189
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ObvTN4Cm-1636124988355)(docker.assets/image-20211006225936295.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzIwZDMyYWMxNmNhNTQxYjE5ZWIyMGE1MDBmNjE1N2ZlLnBuZw==.png)
刪除命令
docker rmi -f 9f35042c6a98 #根據 鏡像id 刪除docker鏡像
docker rmi -f images id images id images id #批量刪除docker鏡像
docker rmi -f $(docker images -aq) # 刪除全部鏡像
我們有了鏡像才可以創建容器,以linux為例子,創造一個CentOS的容器
來測試學習
docker pull centos
新建容器並且啟動
docker run [可選參數] image
#參數說明
--name = "name" 容器名字, tomcat 1 ,tomcat 2來區分容器
-d 后台的方式運行
-it 使用交互方式運行 ,進入容器查看內容
-p 指定容器的端口 -p 8080:8080
-p ip :主機端口:容器端口
-p 主機端口 : 容器端口(常用)
-p 容器端口
-p 隨機指定端口
#測試,並且啟動進入容器
[root@iZwz90ps06ioyada63oiwiZ ~]# docker run -it centos /bin/bash
[root@aa1a02ed3f51 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#推出容器查看
[root@iZwz90ps06ioyada63oiwiZ /]# ls
bin dev home lib64 media mynacos nginxWebdata patch project run srv tmp var
boot etc lib lost+found mnt myredis opt proc root sbin sys usr www
列出所有運行的容器
docker ps
#列出當前正在運行的容器
-a #列出當前正在運行的容器+帶出歷史運行過的內容
-n = ? #顯示最近創建的容器
-q #只顯示容器的編號
#可以看到我們之前使用的 helloworld 和 centos 容器
[root@iZwz90ps06ioyada63oiwiZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa1a02ed3f51 centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago upbeat_matsumoto
0341862ece26 feb5d9fea6a5 "/hello" 8 hours ago Exited (0) 8 hours ago clever_jennings
退出容器
exit #直接容器停止並且推出
Ctrl + p + q #容器不停止 推出
刪除容器
docker rm 容器id # 刪除指定容器,不能刪除正在運行的容器
docker rm -f $(docker ps -aq) #刪除所有的容器
docker ps -a|xargs docker rm #也可以刪除所有的容器
[root@iZwz90ps06ioyada63oiwiZ /]# docker rm -f $(docker ps -aq)
aa1a02ed3f51
0341862ece26
啟動和停止容器
docker start 容器id #啟動容器
docker restart 容器id #重啟容器
docker stop 容器id #關閉容器
docker kill 容器id #強制關閉當前的容器
后台啟動容器
#命令 docker run -d 鏡像!
#問題 docker ps 發現centos停止了
#常見的坑 docker 容器使用后台運行,就必須要有一個前台的進程,docker發現沒有前台的應用,就會自動停止
#nginx 容器啟動后,發現自己沒有提供服務,就會立刻停止,就是沒有程序了
練習 部署 nginx
docker安裝nginx
#1, 搜索鏡像 search 建議去docker hub 上搜索可以看到詳細信息
docker search nginx
#2 拉取鏡像 pull 下載鏡像
docker pull nginx
#3 運行測試
#使用參數
#-d 后台運行
# --name 給容器名字
# -p 宿主機端口:容器端口
[root@iZwz90ps06ioyada63oiwiZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZwz90ps06ioyada63oiwiZ ~]# docker run -d --name nginx01 -p 3344:80 nginx
30361d53c7276f50adecbef37a56865b9858a0b553efa7f33689c8c9f16d927e
[root@iZwz90ps06ioyada63oiwiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30361d53c727 nginx "/docker-entrypoint.…" 30 seconds ago Up 30 seconds 0.0.0.0:3344->80/tcp nginx01
[root@iZwz90ps06ioyada63oiwiZ ~]# curl localhost:3344
#測試通過,進入查看配置,之后停止容器
[root@iZwz90ps06ioyada63oiwiZ ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
#成功
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@iZwz90ps06ioyada63oiwiZ ~]# docker exec -it nginx01 /bin/bash
root@30361d53c727:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@30361d53c727:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@30361d53c727:/# cd /etc/nginx
root@30361d53c727:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@30361d53c727:/etc/nginx# exit
exit
[root@iZwz90ps06ioyada63oiwiZ ~]# ls
install.sh
[root@iZwz90ps06ioyada63oiwiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30361d53c727 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:3344->80/tcp nginx01
[root@iZwz90ps06ioyada63oiwiZ ~]# docker stop 30361d53c727
30361d53c727
端口暴露的概念
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-M5RXIyK0-1636125204154)(docker.assets/image-20211007113424795.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuL2VhZGY5OWIxYTQyNjQ4Nzc5Mjg5YzI5ODhlZWMzMzU4LnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1pISnZhV1J6WVc1elptRnNiR0poWTJzLHNoYWRvd181MCx0ZXh0X1ExTkVUaUJBWkc5dmJYZGhkR05vWlhJPSxzaXplXzIwLGNvbG9yX0ZGRkZGRix0XzcwLGdfc2UseF8xNg==.png)
總結
docker 給我們帶來的好處
- 更高的性能
- 獨立隔離的容器使用
- 活躍的社區詳細的文檔
我們之前部署項目,需要大量的環境搭建,使用docker之后我們可以將環境一起打包,需要的時候拉取容器,省去了繁瑣的環境搭建,拉到鏡像就可以直接跑,效率直線提升
