Docker 學習筆記

低吟不作語發表於2023-02-19

概述

1. 什麼是 Docker?

Docker 是一個應用容器平臺,管理專案中用到的所有環境(MySQL、Redis...)

2. Docker 和虛擬機器的區別

虛擬機器是攜帶作業系統的,本身很小的應用程式因為攜帶了作業系統而變得十分笨重,Docker 不攜帶作業系統,所以 Docker 的應用非常輕巧

在呼叫宿主機資源時,虛擬機器利用 Hypervisor 去虛擬化記憶體,整個呼叫過程是 虛擬記憶體 - 虛擬實體記憶體 - 真實實體記憶體,但是 Docker 利用 Docker Engine 去呼叫宿主機資源,這個過程是 虛擬記憶體 - 真實實體記憶體

3. Docker 核心架構

  • 映象:一個映象代表一個應用環境,它是一個只讀的檔案,如 MySQL 映象,Tomcat 映象,Nginx 映象等
  • 容器:映象每次執行之後就會產生一個容器,就是正在執行的映象,特點是可讀可寫
  • 倉庫:用來存放映象的位置,類似於 maven 倉庫,也是映象上傳和下載的位置
  • dockerFile:docker 生成映象配置檔案,用來書寫自定義映象的配置
  • tar:一個對映象打包的檔案,日後可以還原成映象

4. Docker 執行流程


安裝 Docker

以 Ubuntu18.04.4 為例

更新 ubuntu 的 apt 源索引

sudo apt-get update

安裝包允許 apt 透過 HTTPS 使用倉庫

sudo apt-get install \
	apt-transport-https \
	ca-certificates \
	curl \
	software-properties-common

新增 Docker 官方 GPG key

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

設定 Docker 穩定版倉庫

sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"

新增倉庫後,更新 apt 源索引

sudo apt-get update

安裝最新版 Docker CE(社群版)

sudo apt-get install docker-ce

檢查 Docker CE 是否安裝正確

sudo docker run hello-world

啟動 docker

sudo service docker start

停止 docker

sudo service docker stop

重啟 docker

sudo service docker restart

Docker 配置阿里雲映象加速服務,訪問阿里雲登入自己的賬號檢視 docker 映象加速服務

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://e9rzpyni.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info	# 驗證 docker 的映象加速是否生效

Docker 映象命令

# 輔助命令
docker version  # 檢視 docker 命令
docker info     # 檢視更詳細的資訊
docker --help   # 幫助命令
# images 映象命令
docker images       # 檢視本地所有映象
docker images -a    # 列出所有映象(包含中間映像層)
docker images -q    # 只顯示映象id
# 搜尋映象
docker search [映象名]
docker search -s [映象名]   # 列出收藏數不少於指定值的映象
docker search --no-trunc [映象名]   # 顯示完整的映象資訊
# 拉取映象
docker pull [映象名]
# 刪除映象
docker rmi [映象名]
docker rmi -f [映象名]  # 強制刪除
# 構建映象
docker build -t [映象名] [Dockerfile所在目錄]
docker build -t [映象名] [Dockerfile所在目錄] --no-cache    # 禁用快取

Docker 容器命令

## 執行容器
# --name  # 為容器起一個名字
# -p      # 對映埠號:原始埠號,指定埠號啟動
# -d      # 啟動守護式容器
# -rm    # 用完即刪
docker run [映象名]
## 檢視執行的容器
# -a      # 正在執行的和歷史執行過的容器
# -q      # 靜默模式,只顯示容器編號
docker ps   # 列出所有正在執行的容器
## 停止|關閉|重啟容器
docker start 容器名字或容器id   # 開啟容器
docker restart 容器名或容器id   # 重啟容器
docker stop 容器名或容器id      # 正常停止容器執行
docker kill 容器名或容器id      # 立即停止容器執行
## 刪除容器
docker rm [容器id]
docker rm -f [容器id]  # 強制刪除
docker rm -f $(docker ps -qa)   # 全部容器刪除
## 檢視容器內的程式
docker top [容器名或容器id]     # 檢視容器內的程式
## 檢視執行容器內部的細節
docker inspect [容器id]     # 檢視容器內部細節
## 檢視容器的執行日誌
# -t              # 加入時間戳
# -f              # 跟隨最新的日誌列印
# -tail [數字]    # 顯示最後多少條
docker logs [OPTIONS] [容器id或容器名]  # 檢視容器日誌
## 容器內資料互動
# 進入容器內部
# -i  # 以互動模式執行容器,通常與 -t 一起使用
# -t  # 分配一個偽終端,命令後要跟一個 shell 視窗,如 /bin/bash
docker exec [options] [容器id]
# 退出容器
exit
## 將容器打包為新的映象
docker commit -a="[作者]" -m="[描述資訊]" [容器id] [目標映象名稱]:TAG
## 從容器中複製檔案到宿主機目錄中
docker cp 容器id:容器內資源路徑 宿主機目錄路徑
## 設定容器和宿主機共享目錄
# 宿主機必須是絕對路徑,宿主機目錄會覆蓋容器內目錄內容
docker run -it -v /[宿主機路徑]:/[容器內的路徑]:映象名
# 檢查 json 字串有沒有以下內容,如果有則證明卷掛載成功
# "Mounts":[
# 	{
# 		"Type":"bind",
#       "Source":"/hostDataValueme",
#       "Destination":"/containerDataValueme",
#       "Mode":"",
#       "RW":true,
#       "Propagation":"rprivate"
#	}
# ]
docker inspect [容器id]
## 打包映象
docker save [映象名] -o [名稱].tar
## 載入映象
docker load -i [名稱].tar

Docker 安裝 MySQL

以 Ubuntu18.04.4 為例

拉取 mysql 映象到本地

sudo docker pull mysql:tag  # tag 不加預設最新版本

執行 mysql 服務

# 沒有暴露外部埠,外部不能連線
docker run --name [自定義容器名稱] -e MYSQL_ROOT_PASSWORD=[設定 root 密碼] -d mysql:tag
# 暴露外部埠
docker run --name [自定義容器名稱] -e MYSQL_ROOT_PASSWORD=[設定 root 密碼] -p 3306:3306 -d mysql:tag

進入 mysql 容器

sudo docker exec -it [容器名稱]|[容器id] bash

外部檢視 mysql 日誌

sudo docker logs [容器名稱]|[容器id]

使用自定義配置引數

docker run --name [自定義容器名稱] -v [宿主機配置檔案目錄]:[容器中配置檔案目錄] -e MYSQL_ROOT_PASSWORD=[設定 root 密碼] -p 3306:3306 -d mysql:tag

將容器資料位置與宿主機位置掛載保證資料安全

docker run --name [自定義容器名稱] -v [宿主機配置檔案目錄]:[容器中配置檔案目錄] -v [宿主機資料檔案目錄]:[容器中資料檔案目錄] -e MYSQL_ROOT_PASSWORD=[設定 root 密碼] -p 3306:3306 -d mysql:tag

將 mysql 資料庫備份為 sql 檔案

# 匯出全部資料
sudo docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 匯出指定庫資料
sudo docker exec mysql sh -c 'exec mysqldump --databases [庫表] -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 匯出指定庫,但不要資料
sudo docker exec mysql sh -c 'exec mysqldump --no-data --databases [庫表] -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql

執行 sql 檔案到 mysql

sudo docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /root/xxx.sql

Docker 安裝 Redis

以 Ubuntu18.04.4 為例

在 docker hub 搜尋 redis 映象

sudo docker search redis

拉取 redis 映象到本地

sudo docker pull redis

執行 redis 服務

# 沒有暴露外部埠,外部不能連線
sudo docker run --name [自定義容器名稱] -d redis:tag
# 暴露外部埠
sudo docker run --name [自定義容器名稱] -p 6379:6379 -d redis:tag

外部檢視 redis 日誌

sudo docker logs -t -f [容器名稱]|[容器id]

進入容器內部檢視

sudo docker exec -it [容器名稱]|[容器id] bash

載入外部自定義配置啟動 redis 容器,預設情況下 redis 官方映象中沒有 redis.conf 配置檔案,需要去官網下載指定版本的配置檔案

sudo docker run --name [自定義容器名稱] -v [宿主機配置檔案路徑]:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis:tag redis-server /usr/local/etc/redis/redis.conf

將資料目錄掛載到本地保證資料安全

sudo docker run --name [自定義容器名稱] -v [宿主機資料目錄]:/data -v [宿主機配置檔案路徑]:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis:tag redis-server /usr/local/etc/redis/redis.conf

Docker 安裝 Nginx 伺服器

以 Ubuntu18.04.4 為例

在 docker hub 搜尋 Nginx 映象

sudo docker search nginx

拉取 nginx 映象到本地

sudo docker pull nginx

執行 nginx 服務

# 沒有暴露外部埠,外部不能連線
sudo docker run --name [自定義容器名稱] -d nginx:tag
# 暴露外部埠
sudo docker run --name [自定義容器名稱] -p 80:80 -d redis:tag

進入容器內部

sudo docker exec -it [容器名稱]|[容器id] /bin/bash
# 查詢目錄
whereis nginx
# 配置檔案
/etc/nginx/nginx.conf

從容器複製配置檔案到主機

dokcer cp [容器名稱]|[容器id]:/etc/nginx/nginx.conf [宿主機目錄]

掛載 nginx 配置以及 html 到宿主機外部

sudo docker run --name [自定義容器名稱] -v [宿主機配置檔案路徑]:/etc/nginx/nginx.conf -v [宿主機 html 目錄]:/usr/share/nginx/html -p 80:80 -d nginx

Docker 安裝 Tomcat 伺服器

以 Ubuntu18.04.4 為例

在 docker hub 搜尋 tomcat

sudo docker search tomcat

下載 Tomcat 映象

sudo docker pull tomcat

執行 tomcat 映象

sudo dokcer run -p 8080:8080 -d --name [自定義容器名稱] tomcat

進入容器內部

sudo docker exec -it [容器名稱]|[容器id] /bin/bash

將 webapps 目錄掛載到外部

sudo docker -p 8080:8080 -v [宿主機webapps目錄]:/usr/local/tomcat/webapps -d --name [自定義容器名稱] tomcat

Docker 安裝 MongoDB 資料庫

以 Ubuntu18.04.4 為例

在 docker hub 搜尋 mongo

sudo docker search mongo    # 無須許可權

執行 mongoDB

sudo docker run -d -p 27107:27107 --name [自定義容器名稱] mongo

檢視 mongo 的執行日誌

sudo docker logs -f [容器名稱]

進入容器內部

sudo docker exec -it [容器名稱]|[容器id] /bin/bash

執行具有許可權的容器

sudo docker run --name [容器名稱] -p 27017:27017 -d mongo --auth

進入容器配置使用者名稱和密碼

# 進入 mongo 客戶端
mongo
# 選擇 admin 庫
use admin
# 建立使用者,此使用者建立成功,則後續操作都需要使用者認證
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
# 退出
exit

將 mongoDB 中資料目錄對映到宿主機中

sudo docker run -d -p 27017:27017 [宿主機資料目錄]:/data/db --name [自定義容器名稱] mongo

Docker 安裝 Elasticsearch 以及 Kibana 服務

預先配置

# 修改配置 sysctl.conf
sudo vim /etc/sysctl.conf
# 加入如下配置
vm.max_map_count=262144
# 啟用配置
sysctl -p

docker hub 拉取映象

sudo docker pull elasticsearch

執行 docker 映象

sudo docker run -d -p 9200:9200 -p 9300:9300 --name [自定義容器名稱] elasticsearch

複製容器中 data 目錄到宿主機

sudo docker cp [容器id]:/usr/share/share/elasticsearch/data [宿主機目錄]

執行 es 容器,指定 jvm 記憶體大小並指定 ik 分詞器的位置

sudo docker run -d --name  [自定義容器名稱] -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -v [宿主機外掛目錄]:/usr/share/elasticsearch/plugins -v [宿主機data目錄]:/usr/share/elasticsearch/data elasticsearch:tag

拉取 kibana 映象

sudo docker pull kibana

啟動 kibana 容器

sudo docker run -d --name [自定義容器名稱] -e ELASTICSEARCH_URL=[elasticsearch服務url] -p 5601:5601 kibana

Dockerfile

1. 概述

Dockerfile 可以認為是 Docker 映象的描述檔案,是由一系列命令和引數構成的指令碼,主要作用是用來構建 docker 映象

2. Dockerfile 解析過程

3. Dockerfile 的保留命令

## FROM:當前映象基於哪個映象構建,構建時會自動拉取 base 映象(第一個指令必須是 FROM)
FROM [映象]
FROM [映象]:tag
FROM [映象]:[@<digest>]     # 使用摘要
## MAINTAINER:映象維護者的姓名和郵箱地址
MAINTAINER [作者資訊]
## RUN:構建映象時需要執行的指令,並提交結果,生成的提交映像將用於 Dockerfile 的下一步
RUN [shell命令格式]
RUN yum install vim
RUN [json格式]
RUN ["yum","install","vim"]
## EXPOSE:構建的映象建立容器時對外暴露的埠號
EXPOSE 80/tcp   # 沒有顯示指定預設是 tcp
EXPOSE 80/udp
## WORKDIR:指定在建立容器後,終端預設登入進來的工作目錄,一個落腳點
WORKDIR [路徑]
## ENV:用來在構建映象過程中設定環境變數
ENV [鍵] [值]
ENV [鍵]=[值]
## AOD:將宿主機下的檔案或目錄複製到映象且 ADD 命令會自動處理 URL 和解壓 tar 包
ADD [要複製的檔案/目錄] [映象中的目錄]  # 第一個引數可以使用萬用字元
ADD [url] [映象中的目錄]
## COPY:類似 ADD,複製檔案和目錄到映象,但不能處理 URL 和解壓 tar 包
## VOLUME:容器執行時可以掛載到宿主機的目錄
VOLUME [容器中可以掛載到宿主機的目錄]
## CMD:構建的映象啟動容器時要執行的命令,DockerFile 中可以有多個 CMD 指令,但最後只有一個生效,CMD 會被 docker run 之後的引數替換,格式與 RUN 一致
## ENTRYPOINT:和 CMD 一樣,指定容器時執行命令,格式與 RUN 一致,如果要覆蓋,必須使用 --entrypoint="[新命令]" [映象名] [其他引數]

相關文章