Docker學習記錄

beiyuan666發表於2024-04-18

docker官方文件https://docs.docker.com/engine/install/ubuntu/
docker 全球映象倉庫https://hub.docker.com/

image.png

1、docker的安裝

1.1、解除安裝舊版

首先如果系統中已經存在舊的Docker,先解除安裝: 但是不同的系統,解除安裝方式不一樣!!!
Ubuntu系統:

apt-get autoremove docker docker-ce docker-engine  docker.io  containerd runc
dpkg -l | grep docker
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P # 刪除無用的相關的配置檔案
apt-get autoremove docker-ce-*
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
docker --version	# 檢查是否存在

1.2、安裝docker

不同版本,安裝步驟也不一樣。具體看官網!!!

Ubuntu:

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# 安裝最新版
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 驗證
sudo docker run hello-world

# 新增docker使用者組 比如:zyp使用者
sudo usermod -aG docker zyp

1.3、啟動docker服務

# 啟動Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重啟
systemctl restart docker

# 設定開機自啟
systemctl enable docker

# 執行docker ps命令,如果不報錯,說明安裝啟動成功
docker ps

1.4、配置映象加速器

這裡舉例阿里雲映象加速器

首先訪問阿里雲網站:
https://www.aliyun.com/
註冊一個賬號。
image.png
image.png

docker命令

舉例解讀一個命令含義

docker run -d \
	--name mysql \
  -p 3307:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:5.7
  • docker run 建立並執行一個容器,-d是讓容器在後臺執行
  • --name 給這個容器取名,必須唯一
  • -p 埠對映,在這是雲伺服器的3307埠,與容器內的3306對映。為什麼要對映?因為容器內部對外不可訪問
  • -e KEY=VALUE 設定環境變數
  • 最後是指定執行映象的名稱 後面透過冒號:可以接版本號,不寫的話就是最新版。

常見命令大全

image.png

說明: **IMAGE_NAME:TAG **表示 映象名稱 :版本號
CONTAINER 表示 容器名稱
映象相關:

  • docker pull IMAGE_NAME:TAG
  • docker images
  • docker rmi IMAGE_NAME:TAG
  • docker commit CONTAINER IMAGE_NAME:TAG 建立某個container的映象
  • docker save -o XXXXXX.tar **IMAGE_NAME:TAG** 將映象IMAGE_NAME:TAG匯出到本地檔案XXXXX.tar
  • docker load -i **XXXX.tar** 將映象IMAGE_NAME:TAG 從本地檔案XXXX.tar中載入出來

容器相關:

  • docker run -itd **IMAGE_NAME:TAG** 將一個映象建立成容器,並執行(可以新增引數 如, -d -i -t)
    • -i 以互動方式執行容器,通常與-t 同時使用
    • -t 為容器重新分配一個偽輸入終端,通常與 -i 同時使用
      • 即啟動互動式容器,一般是 bash
    • -d 後臺執行容器,即啟動守護式容器
  • docker ps -a 檢視本地所有容器
  • docker start CONTAINER 啟動容器
  • docker stop CONTAINER 停止容器
  • docker restart CONTAINER 重啟容器
  • docker attach CONTAINER 進入容器
    • 先按Ctrl-p,再按Ctrl-q可以掛起容器
  • docker exec -it CONTAINER bash 進入該容器執行命令
  • docker rm **CONTAINER** 刪除某個容器
  • docker inspect **CONTAINER** 檢視某個容器詳情,包括資料卷

docker attach 與docker exec 區別:是否開啟一個新的程序

  • docker exec 進入容器後開啟一個新的終端,可以在裡面操作(常用)
  • docker attach 進入容器正在執行的終端(前提 run 的時候 有-it),不會啟動新的程序

資料卷

概念

資料卷是一個虛擬資料夾,它將宿主機的資料夾對映到容器內的資料夾,方便操作容器內的檔案

常見命令:

  1. docker volume create 建立資料卷
  2. docker volume ls 檢視所有資料卷
  3. docker volume rm 刪除指定的資料卷
  4. docker volume inspect 檢視某個資料卷的詳情
  5. docker volume prune 清除資料卷

如何掛載資料卷?

  • 不需要透過命令去主動建立資料卷,當建立容器時,如果掛載了資料卷且資料卷不存在,會自動建立資料卷
  • 在docker run 命令建立容器時,新增引數 -v **資料卷名**:**容器內資料夾** 進行資料卷的掛載

直接資料掛載宿主機資料夾(不透過資料卷)

  • 在執行dockerrun命令時,使用 -v **本地目錄**:**容器內目錄** 可以完成本地目錄掛載
  • 本地目錄必須以 "/" 或 " ./ ”開頭,如果直接以名稱開頭,會被識別為資料卷而非本地目錄
    • -v mysql:/var/lib/mysql會被識別為一個資料卷叫mysql (錯誤)
    • -v ./mysql:/var/lib/mysql會被識別為當前目錄下的mysql目錄 (正確)

自定義映象

映象就是包含了應用程式、程式執行的系統函式庫、執行配置等檔案的檔案包。構建映象的過程其實就是把上述檔案打包的過程。

Dockerfile就是一個文字檔案,其中包含一個個的指令(Instruction),用指令來說明要執行什麼操作來構建映象。將來Docker可以根據Dockerfile幫我們構建映象
image.png

這裡舉一個例子:

假設我們現在有一個springboot專案打包好的jar包“my_back.jar”,現在要寫一個dockerfile檔案

# 
FROM openjdk:11.0-jre-buster
# 
ENV TZ=Asia/Shanghai
RUN ln -snf/usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 
COPY my_back.jar /app.jar
# 
ENTRYPOINT ["java", "-jar", "/app.jar"]

注意: openjdk的版本
在雲伺服器中,我們需要把dockerfile檔案和my_back.jar檔案放到同一級目錄下,然後
如果我們直接在當前目錄下透過dockerfile檔案構建映象:**docker build -t IMAGE_NAME .**
這樣,我們的自定義的一個java應用的映象就構建好了!!!

docker網路

預設情況下,所有的容器都是以bridge的方式連線到Docker的一個虛擬網橋上

image.png

由於,當容器重新啟動時,容器分配的IP地址會改變,所以容器之間透過內部IP地址互聯是不現實的。
於是,我們需要自定義docker網路。
image.png

自定義網路示例:

假設現在宿主機中已經有,A,B兩個容器,以及還沒有建立成容器的映象C

  1. 建立一個網路,起名為 “ **my_net ” **

docker network create my_net

  1. 將名為A的容器加入網路

docker network connect my_net A

  1. 將名為B的容器加入到網路

docker network connect my_net B

  1. 也可以在容器建立啟動的時候直接加入到網路中,比如C映象建立成容器

docker run -d --name C -p 8080:8080 --network my_net **IMAGE_NAME:TAG**

DockerCompose

DockerCompose透過一個單獨的docker-compose.yml模板檔案來定義一組相關聯的應用容器,幫助我們實現多個相互關聯的docker容器的快速部署。

image.png
舉一個例子:

version: "3.8"
services:
	mysql:
  	image: mysql
  	container_name: mysql
  	ports:
    	- "3306:3306"
    evironment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: xxxxxxx
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
    - my_net
  spingboot_backend:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: my_backend
    ports:
      - "8080:8080"
    networks:
    	- hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
    	- my_backend
    networks:
      - my_net
networks:
	my_net:
  	name: my_net

可以發現, dockercompose.yaml檔案的很多地方與docker run 命令後面的那一大段類似。

**docker compose [OPTIONS] [COMMANDS]**
image.png

相關文章