Docker 常用命令詳細教程
目錄
- 1. Docker 基礎(chǔ)命令
- 2. 鏡像管理命令
- 3. 容器管理命令
- 4. 網(wǎng)絡(luò)管理命令
- 5. 數(shù)據(jù)卷管理命令
- 6. Docker Compose 命令
- 7. 系統(tǒng)管理命令
- 8. 實用技巧與最佳實踐
1. Docker 基礎(chǔ)命令
1.1 查看 Docker 版本
docker --version
docker version
說明:
-
--version: 顯示簡短版本信息 -
version: 顯示詳細的客戶端和服務(wù)端版本信息
1.2 查看 Docker 系統(tǒng)信息
docker info
說明: 顯示 Docker 系統(tǒng)的詳細信息,包括容器數(shù)量、鏡像數(shù)量、存儲驅(qū)動、網(wǎng)絡(luò)配置等。
1.3 查看幫助信息
docker --help
docker <command> --help
示例:
docker run --help # 查看 run 命令的幫助
2. 鏡像管理命令
2.1 搜索鏡像
docker search <鏡像名>
docker search --filter stars=100 <鏡像名>
docker search --limit 10 <鏡像名>
示例:
docker search nginx
docker search --filter stars=500 python
2.2 拉取鏡像
docker pull <鏡像名>[:標簽]
示例:
docker pull nginx
docker pull nginx:1.21.6
docker pull mysql:8.0
docker pull redis:alpine
2.3 查看本地鏡像
docker images
docker image ls
docker images -a # 顯示所有鏡像(包括中間層)
docker images -q # 只顯示鏡像ID
docker images --no-trunc # 顯示完整的鏡像ID
示例:
docker images
docker images nginx
docker images --filter "dangling=true" # 查看懸空鏡像
2.4 刪除鏡像
docker rmi <鏡像ID/鏡像名>
docker rmi -f <鏡像ID> # 強制刪除
docker image prune # 刪除所有懸空鏡像
docker image prune -a # 刪除所有未使用的鏡像
示例:
docker rmi nginx:latest
docker rmi $(docker images -q) # 刪除所有鏡像
2.5 構(gòu)建鏡像
docker build -t <鏡像名>[:標簽] <Dockerfile路徑>
docker build -t <鏡像名> .
docker build --no-cache -t <鏡像名> .
docker build --build-arg VERSION=1.0 -t <鏡像名> .
參數(shù)說明:
-
-t, --tag: 指定鏡像名稱和標簽 -
-f, --file: 指定 Dockerfile 文件 -
--no-cache: 不使用緩存 -
--build-arg: 設(shè)置構(gòu)建參數(shù)
示例:
docker build -t myapp:1.0 .
docker build -t myapp:latest -f Dockerfile.prod .
2.6 保存和加載鏡像
# 導出鏡像到文件
docker save -o <文件名.tar> <鏡像名>
docker save <鏡像名> > <文件名.tar>
# 從文件加載鏡像
docker load -i <文件名.tar>
docker load < <文件名.tar>
示例:
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
2.7 標記鏡像
docker tag <源鏡像>[:標簽] <目標鏡像>[:標簽]
示例:
docker tag nginx:latest myregistry.com/nginx:v1
docker tag myapp:latest myapp:1.0.0
2.8 查看鏡像歷史
docker history <鏡像名>
docker history --no-trunc <鏡像名>
2.9 查看鏡像詳細信息
docker inspect <鏡像名/鏡像ID>
docker image inspect <鏡像名>
示例:
docker inspect nginx:latest
docker inspect --format='{{.Config.ExposedPorts}}' nginx
3. 容器管理命令
3.1 創(chuàng)建并運行容器
docker run [選項] <鏡像名> [命令]
常用參數(shù):
-
-d, --detach: 后臺運行 -
-it: 交互式終端 -
--name: 指定容器名稱 -
-p: 端口映射(主機端口:容器端口) -
-P: 隨機映射端口 -
-v: 掛載數(shù)據(jù)卷(主機路徑:容器路徑) -
-e: 設(shè)置環(huán)境變量 -
--rm: 容器停止后自動刪除 -
--restart: 重啟策略(no/on-failure/always/unless-stopped) -
--network: 指定網(wǎng)絡(luò) -
-m, --memory: 限制內(nèi)存 -
--cpus: 限制CPU
示例:
# 基本運行
docker run nginx
# 后臺運行并命名
docker run -d --name my-nginx nginx
# 端口映射
docker run -d -p 8080:80 --name web nginx
# 多端口映射
docker run -d -p 8080:80 -p 8443:443 nginx
# 掛載數(shù)據(jù)卷
docker run -d -v /host/path:/container/path nginx
docker run -d -v my-volume:/data nginx
# 設(shè)置環(huán)境變量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql
# 交互式運行
docker run -it ubuntu /bin/bash
# 容器停止后自動刪除
docker run --rm -it ubuntu /bin/bash
# 設(shè)置重啟策略
docker run -d --restart=always nginx
# 資源限制
docker run -d --memory="512m" --cpus="1.5" nginx
# 綜合示例
docker run -d \
--name my-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
-v mysql-data:/var/lib/mysql \
--restart=always \
mysql:8.0
3.2 查看容器
# 查看運行中的容器
docker ps
docker container ls
# 查看所有容器(包括停止的)
docker ps -a
docker container ls -a
# 只顯示容器ID
docker ps -q
# 查看最近創(chuàng)建的容器
docker ps -l
# 顯示容器大小
docker ps -s
參數(shù)說明:
-
-a, --all: 顯示所有容器 -
-q, --quiet: 只顯示容器ID -
-l, --latest: 顯示最近創(chuàng)建的容器 -
-s, --size: 顯示容器大小
示例:
docker ps
docker ps -a
docker ps --filter "status=exited"
docker ps --filter "name=nginx"
3.3 啟動和停止容器
# 啟動容器
docker start <容器ID/容器名>
# 停止容器
docker stop <容器ID/容器名>
# 重啟容器
docker restart <容器ID/容器名>
# 強制停止容器
docker kill <容器ID/容器名>
# 暫停容器
docker pause <容器ID/容器名>
# 恢復容器
docker unpause <容器ID/容器名>
示例:
docker start my-nginx
docker stop my-nginx
docker restart my-nginx
# 批量操作
docker start $(docker ps -a -q) # 啟動所有容器
docker stop $(docker ps -q) # 停止所有運行中的容器
3.4 刪除容器
docker rm <容器ID/容器名>
docker rm -f <容器ID> # 強制刪除運行中的容器
docker rm -v <容器ID> # 刪除容器并刪除關(guān)聯(lián)的匿名卷
docker container prune # 刪除所有停止的容器
示例:
docker rm my-nginx
docker rm -f my-nginx
docker rm $(docker ps -a -q) # 刪除所有容器
docker rm $(docker ps -a -q -f status=exited) # 刪除所有已停止的容器
3.5 進入容器
# 執(zhí)行命令(推薦)
docker exec -it <容器ID/容器名> /bin/bash
docker exec -it <容器ID/容器名> sh
# 附加到容器(不推薦)
docker attach <容器ID/容器名>
區(qū)別說明:
-
exec: 在容器中啟動新進程,退出不會停止容器 -
attach: 附加到容器主進程,退出會停止容器
示例:
docker exec -it my-nginx /bin/bash
docker exec -it my-mysql mysql -uroot -p
docker exec my-nginx ls /etc/nginx
3.6 查看容器日志
docker logs <容器ID/容器名>
docker logs -f <容器ID> # 實時查看日志
docker logs --tail 100 <容器ID> # 查看最后100行
docker logs --since "2024-01-01" <容器ID> # 查看指定時間后的日志
docker logs -t <容器ID> # 顯示時間戳
參數(shù)說明:
-
-f, --follow: 實時跟蹤日志 -
--tail: 顯示最后N行 -
--since: 顯示指定時間后的日志 -
--until: 顯示指定時間前的日志 -
-t, --timestamps: 顯示時間戳
示例:
docker logs my-nginx
docker logs -f --tail 50 my-nginx
docker logs --since "2024-10-20T00:00:00" my-nginx
3.7 查看容器詳細信息
docker inspect <容器ID/容器名>
docker inspect --format='{{.NetworkSettings.IPAddress}}' <容器名>
示例:
docker inspect my-nginx
docker inspect --format='{{.State.Status}}' my-nginx
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx
3.8 查看容器進程
docker top <容器ID/容器名>
3.9 查看容器資源使用
docker stats # 查看所有容器的資源使用
docker stats <容器ID> # 查看指定容器
docker stats --no-stream # 只顯示一次
3.10 復制文件
# 從容器復制到主機
docker cp <容器ID>:<容器路徑> <主機路徑>
# 從主機復制到容器
docker cp <主機路徑> <容器ID>:<容器路徑>
示例:
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./app.conf my-nginx:/etc/nginx/conf.d/
3.11 導出和導入容器
# 導出容器為tar文件
docker export <容器ID> > <文件名.tar>
docker export -o <文件名.tar> <容器ID>
# 導入容器快照為鏡像
docker import <文件名.tar> <鏡像名>[:標簽]
3.12 容器提交為鏡像
docker commit [選項] <容器ID> <鏡像名>[:標簽]
參數(shù)說明:
-
-a, --author: 作者信息 -
-m, --message: 提交信息
示例:
docker commit my-nginx my-nginx-custom:v1
docker commit -a "author" -m "add custom config" my-nginx my-nginx:v2
3.13 容器重命名
docker rename <舊容器名> <新容器名>
3.14 更新容器配置
docker update [選項] <容器ID>
示例:
docker update --restart=always my-nginx
docker update --memory="1g" --cpus="2" my-nginx
4. 網(wǎng)絡(luò)管理命令
4.1 查看網(wǎng)絡(luò)
docker network ls
docker network ls --filter driver=bridge
4.2 創(chuàng)建網(wǎng)絡(luò)
docker network create <網(wǎng)絡(luò)名>
docker network create --driver <驅(qū)動類型> <網(wǎng)絡(luò)名>
docker network create --subnet <子網(wǎng)> <網(wǎng)絡(luò)名>
驅(qū)動類型:
-
bridge: 橋接網(wǎng)絡(luò)(默認) -
host: 主機網(wǎng)絡(luò) -
overlay: 覆蓋網(wǎng)絡(luò)(Swarm) -
macvlan: MAC地址網(wǎng)絡(luò) -
none: 無網(wǎng)絡(luò)
示例:
docker network create my-network
docker network create --driver bridge my-bridge
docker network create --subnet=172.18.0.0/16 my-net
docker network create --driver=bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 custom-net
4.3 查看網(wǎng)絡(luò)詳情
docker network inspect <網(wǎng)絡(luò)名>
4.4 連接和斷開網(wǎng)絡(luò)
# 連接容器到網(wǎng)絡(luò)
docker network connect <網(wǎng)絡(luò)名> <容器名>
# 斷開容器網(wǎng)絡(luò)連接
docker network disconnect <網(wǎng)絡(luò)名> <容器名>
4.5 刪除網(wǎng)絡(luò)
docker network rm <網(wǎng)絡(luò)名>
docker network prune # 刪除所有未使用的網(wǎng)絡(luò)
4.6 創(chuàng)建容器時指定網(wǎng)絡(luò)
docker run -d --network <網(wǎng)絡(luò)名> --name <容器名> <鏡像名>
示例:
docker run -d --network my-network --name web nginx
docker run -d --network host --name app myapp
5. 數(shù)據(jù)卷管理命令
5.1 查看數(shù)據(jù)卷
docker volume ls
docker volume ls -q
docker volume ls --filter dangling=true
5.2 創(chuàng)建數(shù)據(jù)卷
docker volume create <卷名>
docker volume create --driver <驅(qū)動> <卷名>
示例:
docker volume create my-volume
docker volume create --driver local my-data
5.3 查看數(shù)據(jù)卷詳情
docker volume inspect <卷名>
5.4 刪除數(shù)據(jù)卷
docker volume rm <卷名>
docker volume prune # 刪除所有未使用的數(shù)據(jù)卷
5.5 使用數(shù)據(jù)卷
# 命名卷
docker run -d -v <卷名>:<容器路徑> <鏡像名>
# 綁定掛載
docker run -d -v <主機路徑>:<容器路徑> <鏡像名>
# 只讀掛載
docker run -d -v <卷名>:<容器路徑>:ro <鏡像名>
示例:
docker run -d -v mysql-data:/var/lib/mysql mysql
docker run -d -v /host/data:/app/data nginx
docker run -d -v config:/etc/nginx:ro nginx
6. Docker Compose 命令
6.1 啟動服務(wù)
docker-compose up
docker-compose up -d # 后臺運行
docker-compose up --build # 構(gòu)建并啟動
docker-compose up --force-recreate # 強制重新創(chuàng)建容器
docker-compose up --scale <服務(wù)名>=<數(shù)量> # 擴展服務(wù)
6.2 停止服務(wù)
docker-compose down # 停止并刪除容器
docker-compose down -v # 同時刪除數(shù)據(jù)卷
docker-compose down --rmi all # 同時刪除鏡像
docker-compose stop # 僅停止容器
6.3 查看服務(wù)
docker-compose ps
docker-compose ps -a
6.4 查看日志
docker-compose logs
docker-compose logs -f # 實時查看
docker-compose logs -f <服務(wù)名> # 查看指定服務(wù)
docker-compose logs --tail=100
6.5 執(zhí)行命令
docker-compose exec <服務(wù)名> <命令>
docker-compose exec -it <服務(wù)名> /bin/bash
6.6 構(gòu)建服務(wù)
docker-compose build
docker-compose build --no-cache
docker-compose build <服務(wù)名>
6.7 其他命令
docker-compose restart # 重啟服務(wù)
docker-compose pause # 暫停服務(wù)
docker-compose unpause # 恢復服務(wù)
docker-compose top # 查看進程
docker-compose config # 驗證配置文件
docker-compose pull # 拉取鏡像
docker-compose push # 推送鏡像
7. 系統(tǒng)管理命令
7.1 清理系統(tǒng)
# 清理未使用的數(shù)據(jù)
docker system prune
# 清理所有未使用的數(shù)據(jù)(包括未使用的鏡像)
docker system prune -a
# 清理所有數(shù)據(jù)(包括數(shù)據(jù)卷)
docker system prune -a --volumes
# 強制清理(不提示確認)
docker system prune -f
7.2 查看磁盤使用
docker system df
docker system df -v # 詳細信息
7.3 查看系統(tǒng)事件
docker events
docker events --since '2024-10-20'
docker events --filter 'type=container'
7.4 登錄和登出鏡像倉庫
# 登錄 Docker Hub
docker login
# 登錄私有倉庫
docker login <倉庫地址>
# 登出
docker logout
7.5 推送和拉取鏡像
# 推送鏡像
docker push <鏡像名>[:標簽]
# 拉取鏡像
docker pull <鏡像名>[:標簽]
8. 實用技巧與最佳實踐
8.1 批量操作
停止所有容器
docker stop $(docker ps -q)
刪除所有容器
docker rm $(docker ps -a -q)
刪除所有鏡像
docker rmi $(docker images -q)
刪除所有未使用的資源
docker system prune -a --volumes
刪除懸空鏡像
docker rmi $(docker images -f "dangling=true" -q)
刪除已停止的容器
docker rm $(docker ps -a -q -f status=exited)
8.2 常用組合命令
構(gòu)建并運行
docker build -t myapp . && docker run -d -p 8080:80 myapp
停止并刪除容器
docker stop my-nginx && docker rm my-nginx
查看容器IP地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名>
查看容器環(huán)境變量
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' <容器名>
8.3 常用 Dockerfile 指令
# 基礎(chǔ)鏡像
FROM nginx:alpine
# 維護者信息
LABEL maintainer="your@email.com"
# 設(shè)置工作目錄
WORKDIR /app
# 復制文件
COPY . /app
ADD archive.tar.gz /app
# 運行命令
RUN apk add --no-cache python3
# 設(shè)置環(huán)境變量
ENV NODE_ENV=production
# 暴露端口
EXPOSE 80 443
# 掛載點
VOLUME ["/data"]
# 設(shè)置用戶
USER nginx
# 容器啟動命令
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT ["nginx"]
8.4 常用 docker-compose.yml 模板
version: '3.8'
services:
web:
image: nginx:alpine
container_name: web
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- app-network
restart: always
environment:
- TZ=Asia/Shanghai
depends_on:
- db
db:
image: mysql:8.0
container_name: mysql
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: myapp
MYSQL_USER: user
MYSQL_PASSWORD: password
networks:
- app-network
restart: always
redis:
image: redis:alpine
container_name: redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
networks:
- app-network
restart: always
networks:
app-network:
driver: bridge
volumes:
mysql-data:
redis-data:
8.5 性能優(yōu)化技巧
1. 減小鏡像體積 - 使用多階段構(gòu)建
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
2. 使用 .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
*.md
3. 合并 RUN 命令
# 推薦
RUN apt-get update && \
apt-get install -y nginx && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
8.6 安全最佳實踐
1. 使用非 root 用戶
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
2. 限制容器資源
docker run -d \
--memory="512m" \
--memory-swap="1g" \
--cpus="1.0" \
--pids-limit=100 \
nginx
3. 只讀文件系統(tǒng)
docker run -d --read-only --tmpfs /tmp nginx
8.7 常用調(diào)試命令
# 查看容器詳細信息
docker inspect <容器名>
# 查看容器日志
docker logs -f --tail 100 <容器名>
# 進入容器調(diào)試
docker exec -it <容器名> /bin/sh
# 查看容器進程
docker top <容器名>
# 查看資源使用
docker stats <容器名>
# 查看端口映射
docker port <容器名>
# 查看容器文件系統(tǒng)變化
docker diff <容器名>
8.8 數(shù)據(jù)備份與恢復
備份容器數(shù)據(jù)
# 備份數(shù)據(jù)卷
docker run --rm -v <卷名>:/data -v $(pwd):/backup ubuntu tar czf /backup/backup.tar.gz /data
# 備份容器
docker export <容器名> > container-backup.tar
恢復數(shù)據(jù)
# 恢復數(shù)據(jù)卷
docker run --rm -v <卷名>:/data -v $(pwd):/backup ubuntu tar xzf /backup/backup.tar.gz -C /
# 恢復容器
docker import container-backup.tar <鏡像名>
附錄:快速參考
鏡像命令快查
| 命令 | 說明 |
|---|---|
docker pull |
拉取鏡像 |
docker build |
構(gòu)建鏡像 |
docker images |
查看鏡像 |
docker rmi |
刪除鏡像 |
docker tag |
標記鏡像 |
docker save |
保存鏡像 |
docker load |
加載鏡像 |
容器命令快查
| 命令 | 說明 |
|---|---|
docker run |
創(chuàng)建并運行容器 |
docker ps |
查看容器 |
docker start |
啟動容器 |
docker stop |
停止容器 |
docker restart |
重啟容器 |
docker rm |
刪除容器 |
docker exec |
進入容器 |
docker logs |
查看日志 |
常用參數(shù)快查
| 參數(shù) | 說明 |
|---|---|
-d |
后臺運行 |
-it |
交互式終端 |
-p |
端口映射 |
-v |
數(shù)據(jù)卷掛載 |
-e |
環(huán)境變量 |
--name |
容器名稱 |
--restart |
重啟策略 |
--network |
網(wǎng)絡(luò)設(shè)置 |