Docker入門

Docker

一.什麼是Docker?

百度百科:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發布到任何流行的 Linux或Windows作業系統的機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
docker官網://www.docker.com

二.為什麼說Docker是容器化技術?

image

  • 容器化技術的特點:
  • 標準化:每個容器都是標準化、可移植的,因為他們直接運行在宿主機的內核上
  • 隔離:容器互相隔離,互不干擾,獨立運行
  • 高性能:容器性能開銷極低,可以實現分鐘級甚至秒級的部署和啟動
  • 版本:CE(Community Edition:社區版)和 EE(Enterprise Edition:企業版)

三.Docker 理念

Build,Ship and Run Any App,Anywhere,在任何地方構建、 發布並運行任何應用程式(一次封裝,到處運行)

四.Docker 架構

image

docker 由三部分組成:

  • Client 客戶端
  • docker 主機
  • Registry 鏡像倉庫伺服器

docker daemon:

  • docker 安裝後,會以後台運行、守護進程的形式存在
  • images 鏡像: 鏡像可以用來創建 docker 容器,一個鏡像可以創建很多容器
  • containers: 鏡像和容器的關係類似面向對象設計中的類和對象, 鏡像是容器的模板,容器是基於鏡像創建出來的。 容器可以被創建、啟動、停止、刪除等等。

Registry:

  • 鏡像註冊伺服器 //hub.docker.com 一個 docker Registry(倉庫註冊伺服器) 中可以包含多個 Repository(倉庫); 每個倉庫可以包含多個標籤/版本(Tag);每個標籤對應一個鏡像。 倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式,公開倉庫就是 docker 官方倉庫,私有倉庫是自己搭建的 docker 私服

Client:

  • docker 終端 安裝好 docker 中,同時包含了 docker 客戶端,客戶端負責執行 docker 命令, 發送給 docker 主機中的 docker 守護進程,例如:從倉庫下載鏡像,通過鏡像創 建容器等等

五.CentOS7 安裝 docker

(1)安裝需要的軟體包:

yum install -y yum-utils device-mapper-persistent-data lvm2

(2)設置 docker 下載鏡像(推薦用阿里雲,一個字:快)

yum-config-manager --add-repo //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(3)更新 yum 軟體包索引

yum makecache fas

(4)安裝 DOCKER CE (社區版)

yum install -y docker-ce docker-ce-cli containerd.io
注意第一次安裝可能會出現錯誤,重新執行一下安裝的命令就好了

(5)啟動 docker

systemctl start docker # 啟動docker
systemctl enable docker # 設置開機自啟動

(6)查看版本

docker version
image

(7)docker 卸載,一次執行下面的三行命令

systemctl stop docker
yum remove -y docker-ce
rm -rf /var/lib/docker

六.配置阿里雲鏡像服務加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["//ny5dsu6o.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

七.Docker 常用命令

(1).Docker 基本命令

  • 版本資訊:docker version
    image

  • 詳細資訊:docker info
    image

  • 幫助文檔:docker --help 列出所有的docker命令

(2)Docker服務相關命令

  • 啟動Docker服務:systemctl start docker
    image

  • 關閉Docker服務:systemctl stop docker
    image

  • 查看Docker狀態:systemctl status docker
    image

  • 重啟Docker服務:systemctl restart docker
    image

  • 設置Docker服務跟隨虛擬機開機自啟:systemctl enable docker
    image

  • 取消Docker服務跟隨虛擬機開機自啟:systemctl disable docker
    image

(3)Docker 鏡像命令(docker官方鏡像網站)

  • 查看所有的本機鏡像:docker images [-q|--no-trunc],-q:查看鏡像ID –no-trunc:查看完成的鏡像ID
    image

  • 查找鏡像:docker search 鏡像名稱
    image

  • 下載鏡像:docker pull 鏡像名稱:版本號,不加版本號默認是latest最新版
    image

  • 刪除鏡像:docker rmi [-f] 鏡像名|鏡像ID:版本號,刪除指定版本鏡像,版本為latest版本號可以省略,[-f]:強制刪除
    image

  • 批量刪除:docker rmi [-f] mysql tomcat redis ,除多個鏡像,使用空格間隔不同的鏡像名稱

我就不演示了

  • 刪除全部鏡像:docker rmi -f $(docker images -q)

我就不演示了

  • 查看鏡像詳情:docker inspect 鏡像名|鏡像ID
    image

(4)容器操作

  • 列出所有正在運行的容器,不包含已停止的容器(容器怎麼運行可以看後面):docker ps
    image

  • 列出當前所有已經創建的容器:docker ps [-aq]
    image

  • 創建容器:

docker create 鏡像名稱 # 根據鏡像名創建一個容器
image
image

docker create --name tomcat1 鏡像名稱 # 根據鏡像創建名為 tomcat1 的容器
image

docker create 鏡像 id # 根據鏡像 id 新建一個容器
image

  • 啟動、停止、重啟容器:

docker start 容器名|容器ID
image

docker stop 容器名|容器ID
image

docker restart 容器名|容器ID
image

docker kill 容器名|容器ID 根據容器名強制停止一個容器

  • 創建並啟動容器:docker run --name tomcat2 tomcat
    當本地鏡像存在時,相當於 docker create + docker start
    當本地鏡像不存在時,相當於 docker pull + docker create + docker start

    image

  • 刪除容器:

docker rm 容器名稱 #刪除未啟動的容器
image

docker rm -f 容器名稱 #強制刪除已啟動的容器
image

docker rm -f $(docker ps -qa) #刪除所有容器,包括正在運行的容器
我就不演示了

docker ps -a -q | xargs docker rm #刪除所有容器,不包括正在運行的容器
我就不演示了

  • 互動式啟動:docker run -it --name qiu 鏡像名|鏡像ID
    image

  • 進入容器:docker exec -it 容器ID|容器名稱 /bin/bash
    image

  • 退出容器:

ctrl + p + q # 不停止退出容器

exit #容器停止退出,此時執行

  • 啟動守護式容器:docker run -d --name qiu 鏡像名|鏡像ID

推薦直接使用:docker run -itd --name qiu 鏡像名|鏡像ID

八.數據卷

(1)什麼是數據卷:數據卷是存在於一個或多個容器中的特定文件或文件夾,這個文件或文件夾以獨立於 docker 文件 系統的形式存在於宿主機中

(2)解決了什麼問題?例如:MySQL 容器損壞無法啟動,需要刪除容器重新創建,那麼資料庫數據將會丟失

image

(3)安裝centos:7鏡像:docker pull centos:7

(4)做一個例子

將宿主機根目錄中的 qiu 掛載到容器根目錄中的 qiu

(5)掛載數據卷

docker run -itd -v /qiu:/qiu --name myMysql mysql

-v:掛載數據卷格式:
	/宿主機目錄(文件):/容器內目錄(文件)
	目錄必須是絕對路徑
	如果目錄不存在,
	則自動創建
	可以掛載多個數據卷

image

(6)查看數據卷是否掛載成功

docker inspect myMysql

image

(7)數據共享

首先進入容器,在容器的數據卷掛載目錄中創建文件並寫入內容
然後退出容器,查看宿主機掛載目錄,可以看到同步更新的文件

(8)數據的同步

首先停止容器
然後在宿主機修改共享數據 接下來啟動前面的容器,
查看共享數據文件,發現數據在容器中同步

(9)數據的持久化

首先刪除容器
然後在宿主機修改共享數據
接著重新創建容器並掛載數據卷
發現數據在容器中恢復

(10)一個容器掛載多個數據卷,兩個容器掛載同一個數據卷

docker run -it -v /dataVolumeHost31:/dataVolumeContainer31 -v /dataVolumeHost32:/dataVolumeContainer32 --name centos3 centos:7
docker run -it -v /dataVolumeHost:/dataVolumeContainer4 --name centos4 centos:7
docker run -it -v /dataVolumeHost:/dataVolumeContainer5 --name centos5 centos:7

九.應用部署

(1)部署 tomcat

創建並運行tomcat容器
docker run -d -p 8080:8080 -v /docker/tomcat/webapps:/usr/local/tomcat/webapps -v /docker/tomcat/logs:/usr/local/tomcat/logs --name qiu_tomcat tomcat:8.5
image

準備一個index.html頁面,使用 ftp 工具上到 /docker/tomcat/webapps/qbb 中
image

瀏覽器訪問一下://192.168.137.72:8080/qbb/
image

也可以查看一下tomcat的日誌:docker logs -tf --tail 20 atguigu_tomcat

(2)部署MySQL

docker run -d -p 3306:3306 -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/logs:/logs -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name atguigu_mysql mysql:5.7
image

十.docker 容器化技術和虛擬機技術

image

十一.鏡像製作

(1)方式一:通過容器製作鏡像

①生成鏡像

docker commit 容器名 鏡像名稱:版本號

②壓縮鏡像

docker save -o 壓縮文件名稱 鏡像名稱:版本號

③還原鏡像

docker load -i 壓縮文件名稱