Docker安裝
一鍵安裝命令
sudo curl -fsSL https://get.docker.com| bash -s docker --mirror Aliyun
啟動docker
sudo service docker start
pull鏡像加速配置
sudo vi /etc/docker/daemon.json
輸入下列內容,最后按ESC,輸入 :wq!
保存退出。
{"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.1panel.live","https://hub.rat.dev"]
}
重啟docker
sudo service docker restart
鏡像的獲取和管理
獲取Docker鏡像:docker pull
docker pull 鏡像名稱:標簽
比如:
docker pull nginx # 省略標簽默認為latest,拉取最新Nginx官方鏡像
docker pull postgres:14 # PostgreSQL 14鏡像
docker pull your_docker_username/project:1.0
查看管理本地鏡像
列出本地鏡像:docker images
或 docker image ls
docker images
docker image ls
刪除本地鏡像:docker rmi
或 docker image rm
docker rmi 鏡像id或名稱
注:如果鏡像正在被容器使用(即使容器已經停止),需要先刪除容器。
強制刪除:docker rmi -f 鏡像id或名稱
將docker鏡像保存為.tar
文件
mkdir -p ~/docker_images/
docker save -o ~/docker_images/project_images.tar 鏡像名字:標簽
在目標機器加載鏡像
docker load -i ./project_images.tar
鏡像的運行
運行鏡像(創建容器): docker run
docker run 選項 鏡像名稱:標簽 命令 參數
常用選項:
-d
/ --detach
: 后臺運行
docker run -d nginx
-p 主機端口:容器端口
/ --publish 端口映射
:將宿主機端口映射到容器內部端口,從外部訪問容器中的服務
--name 容器名稱
:指定容器名稱,如果不指定,docker隨機生成
docker run -d -p 8080:80 --name my-nginx nginx
# 將主機8080映射到容器80
# 訪問主機:http://localhost:8080
-it
: 交互式運行
-i
/ --interactive
: 保持標準輸入打開
-t
/ --tty
: 分配偽終端(TTY)
docker run -it ubuntu:22.04 bash
# 啟動一個ubuntu容器并進入bash shell
--rm
: 容器退出時,自動刪除容器
docker run -it --rm ubuntu:22.04 bash
-v: 宿主機路徑:容器內路徑:權限
/ --volume
權限:ro
(只讀)或rw
(讀寫)
# 將本地項目代碼映射到容器
docker run -it --rm -p 80:80 \
-v /home/a/java-app:/app \
java-dev-image:latest bash
--network 網絡名稱
:將容器連接到指定的Docker網絡
docker run -d --network my-custom-network my-app-image
容器的管理操作
查看正在運行的容器:docker ps
docker ps```
查看所有容器(包括已經停止的):`docker ps -a````bash
docker ps -a
docker compose up
:基于 docker-compose.yml
創建并啟動容器。
docker compose down
:刪除容器,再次啟動時重新創建。
docker compose up
docker compose down
停止容器:docker stop
保留容器及其數據。
啟動容器:docker start
用來啟動已經創建好的容器,不會讀取 docker-compose.yml
。
docker stop 容器id或名稱
docker start 容器id或名稱
進入正在運行的容器:docker exec
docker exec -it 容器id或名稱 bash
# 退出容器shell: exit
從容器復制文件到宿主機:docker cp 容器id或名稱:/path /path
從宿主機復制文件到容器:docker cp /path 容器id或名稱:/path
Docker Compose 與多服務編排
在多服務應用場景下,手動編寫和管理復雜的 docker run
命令會變得非常繁瑣。docker-compose
應運而生,它允許你通過一個 YAML 文件(docker-compose.yml
)來定義和運行多個 Docker 容器應用。它極大地簡化了多容器應用的部署和管理。
Docker Compose 的核心作用
docker-compose.yml
的作用是在 Dockerfile
構建好的鏡像基礎上,進一步定義這些服務在運行時如何協同工作。它關注的是整個應用棧的運行時配置和生命周期管理,例如:
- 服務定義:你的
app
、frontend
、db
等,每個都是一個服務。 - 鏡像來源:可以直接引用預構建的鏡像 (
image: nginx
),也可以指定通過Dockerfile
構建 (build: .
)。 - 端口映射:將容器的端口映射到宿主機的端口,這是實際的對外暴露。
- 數據卷掛載:將宿主機的文件或目錄掛載到容器內部,用于數據持久化或動態配置。
- 環境變量:向容器注入運行時所需的環境變量。
- 命令覆蓋:覆蓋
Dockerfile
中定義的默認啟動命令,常用于傳遞運行時參數。 - 服務依賴:定義服務啟動順序,確保依賴的服務先啟動。
- 網絡配置:定義服務之間的通信方式,
docker-compose
會自動處理服務發現。 - 健康檢查:定義如何判斷服務是否正常運行。
Dockerfile
專注于構建一個獨立的、可運行的鏡像,它描述的是鏡像在構建時的狀態和內容。而 docker-compose.yml
則專注于如何將這些獨立的鏡像組裝起來,形成一個完整的、可部署的應用系統,并處理它們之間的協作和運行環境。這種職責分離使得 Dockerfile
可以更簡潔地專注于其核心任務,而將復雜的部署細節委托給 docker-compose.yml
。
單獨構建與運行服務
雖然 docker-compose
極大地簡化了多服務管理,但理解如何單獨構建和運行每個服務仍然很重要。下面我們將以你的項目為例,展示如何為每個服務單獨編寫 Dockerfile
(如果需要)并使用 docker run
命令來啟動它們。
1. 數據庫服務 (db
)
在 docker-compose.yml
中,db
服務直接使用了 postgis/postgis:17-3.4-alpine
官方鏡像。通常不需要為它單獨編寫 Dockerfile
,直接拉取并使用即可。
- Dockerfile
如果需要為 db
服務定制鏡像(例如,在鏡像中預裝特定的數據庫擴展或初始化腳本),創建一個 Dockerfile_db
:
# Dockerfile_db
FROM postgis/postgis:17-3.4-alpine# 示例:如果要在構建時加入初始化腳本
# COPY ./db_init_scripts/ /docker-entrypoint-initdb.d/
構建鏡像 (如果創建了 Dockerfile_db
):
docker build -t my-custom-postgis -f Dockerfile_db .
單獨運行 db
服務的 docker run
命令
將 docker-compose.yml
中 db
服務的所有配置轉換為 docker run
命令的參數。首先手動創建一個 Docker 網絡,因為 docker-compose
會自動創建。
# 1. 創建網絡 (如果 app-network 不存在)
docker network create app-network# 2. 運行 db 服務
# 注意:以下命令中的環境變量值替換為默認值,實際使用時根據需要修改。
docker run -d \--name postgres \-p 54321:5432 \--restart always \-e POSTGRES_USER="postgres" \-e POSTGRES_PASSWORD="postgres" \-e POSTGRES_DB="postgis_test" \-e PGDATA="/var/lib/postgresql/data/pgdata" \-v ./volumes/db/data:/var/lib/postgresql/data \-v /home/a/Downloads/數據庫:/docker-entrypoint-initdb.d \--network app-network \postgis/postgis:17-3.4-alpine \postgres -c 'max_connections=100' \-c 'shared_buffers=128MB' \-c 'work_mem=4MB' \-c 'maintenance_work_mem=64MB' \-c 'effective_cache_size=4096MB'
2. 前端服務 (frontend
)
前端服務使用 Nginx 提供靜態文件和反向代理。
Dockerfile
這是項目中用于構建 frontend
鏡像的 Dockerfile
:
# Dockerfile (for frontend)
FROM nginx
COPY ./ /home/mapsys
COPY default.conf /etc/nginx/nginx.conf
構建鏡像:
docker build -t front .
單獨運行 frontend
服務的 docker run
命令
# 運行 frontend 服務
# 確保 app-network 已經創建 (見 db 服務部分)
docker run -d \--name frontend \-p 18000:80 \--network app-network \front
注意: 如果 default.conf
或 /home/mapsys
中的內容在容器啟動后需要動態更新,需要在 docker run
命令中添加 -v
參數進行卷掛載,例如:
-v ./default.conf:/etc/nginx/nginx.conf
-v /path/to/your/front/files:/home/mapsys
3. 后端應用服務 (app
)
后端應用是基于 Java 的 Spring Boot 應用。
Dockerfile
項目中用于構建 app
鏡像的 Dockerfile_app
:
# Dockerfile_app (for app)
FROM openjdk:8-jreCOPY ./server/geospatial-0.0.1-SNAPSHOT.jar /usr/app/geospatial-0.0.1-SNAPSHOT.jar
構建鏡像:
docker build -t app -f Dockerfile_app .
單獨運行 app
服務的 docker run
命令
# 運行 app 服務
# 確保 db 服務和 app-network 已經創建并運行
docker run -d \--name java-app \-p 18080:8080 \--network app-network \app \java -jar /usr/app/geospatial-0.0.1-SNAPSHOT.jar \--spring.datasource.url=jdbc:postgresql://db:54321/postgis_test?stringtype=unspecified \--spring.datasource.username=postgres \--spring.datasource.password=postgres
注意: 在這個 docker run
命令中,--network app-network
是關鍵,它使得 java-app
容器能夠通過服務名 db
訪問到 postgres
容器(數據庫)。