docker官方文件https://docs.docker.com/engine/install/ubuntu/
docker 全球映象倉庫https://hub.docker.com/
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/
註冊一個賬號。
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_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),不會啟動新的程序
資料卷
概念
資料卷是一個虛擬資料夾,它將宿主機的資料夾對映到容器內的資料夾,方便操作容器內的檔案
常見命令:
- docker volume create 建立資料卷
- docker volume ls 檢視所有資料卷
- docker volume rm 刪除指定的資料卷
- docker volume inspect 檢視某個資料卷的詳情
- docker volume prune 清除資料卷
如何掛載資料卷?
- 不需要透過命令去主動建立資料卷,當建立容器時,如果掛載了資料卷且資料卷不存在,會自動建立資料卷
- 在docker run 命令建立容器時,新增引數
-v **資料卷名**:**容器內資料夾**
進行資料卷的掛載
直接資料掛載宿主機資料夾(不透過資料卷)
- 在執行dockerrun命令時,使用
-v **本地目錄**:**容器內目錄**
可以完成本地目錄掛載 - 本地目錄必須以 "/" 或 " ./ ”開頭,如果直接以名稱開頭,會被識別為資料卷而非本地目錄
- -v mysql:/var/lib/mysql會被識別為一個資料卷叫mysql (錯誤)
- -v ./mysql:/var/lib/mysql會被識別為當前目錄下的mysql目錄 (正確)
自定義映象
映象就是包含了應用程式、程式執行的系統函式庫、執行配置等檔案的檔案包。構建映象的過程其實就是把上述檔案打包的過程。
Dockerfile就是一個文字檔案,其中包含一個個的指令(Instruction),用指令來說明要執行什麼操作來構建映象。將來Docker可以根據Dockerfile幫我們構建映象
這裡舉一個例子:
假設我們現在有一個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的一個虛擬網橋上
由於,當容器重新啟動時,容器分配的IP地址會改變,所以容器之間透過內部IP地址互聯是不現實的。
於是,我們需要自定義docker網路。
自定義網路示例:
假設現在宿主機中已經有,A,B兩個容器,以及還沒有建立成容器的映象C
- 建立一個網路,起名為 “ **my_net ” **
docker network create my_net
- 將名為A的容器加入網路
docker network connect my_net A
- 將名為B的容器加入到網路
docker network connect my_net B
- 也可以在容器建立啟動的時候直接加入到網路中,比如C映象建立成容器
docker run -d --name C -p 8080:8080 --network my_net **IMAGE_NAME:TAG**
DockerCompose
DockerCompose透過一個單獨的docker-compose.yml模板檔案來定義一組相關聯的應用容器,幫助我們實現多個相互關聯的docker容器的快速部署。
舉一個例子:
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]**