常用 docker 指令

基本資訊

1
2
3
4
5
6
7
8
9
# 顯示 docker 的資訊
docker info

# 查看版本
docker -v
docker-compose -v

# 查看 container 佔用資源狀態
docker stats

小範例

假設本機裝好了 docker,但是沒有下載任何的 image,讓我們來跑幾個指令看看如何下載 image,以及啟動容器

範例 1

1
2
3
4
5
# 從 docker hub 下載 hello-word image
docker pull hello-world

# 啟動 hello world cotainer
docker run hello-world

範例 2

1
2
3
4
5
6
7
8
9
10
11
# 這個指令先檢查本機有沒有 ubuntu image,沒有的話會先 pull 再 run
# -i, --interactive (互動模式)
# -t, --tty (配置一個終端機)
docker run -it ubuntu bash

docker run ubuntu /bin/echo "Hi, Ubuntu"

# 也可以一開始在背景執行,後面再用 exec 指令進入環境
docker run -d ubuntu

docker exec -it CONTAINER_ID bash

Image 相關

build image

1
2
3
4
# 修改 docker-compose.yml 後 rebuild 服務,使用 --no-cache 不使用快取
docker-compose build SERVICE_NAME

docker-compose build --no-cache workspace

查看 image

1
2
3
4
5
# 查看機器上有的 image
docker images

# 查看 image 的詳細訊息,會返回一個 json 格式
docker inspect IMAGE_ID

刪除 image
注意:必須先刪除有使用這個 image 的 container 才能刪除 image

1
2
3
4
5
6
7
8
9
10
11
# 刪除指定 image,
docker rmi IMAGE_ID

# 找到無用的 images
docker images --filter "dangling=true"

# 刪除無用的 images
docker rmi $(docker images -f "dangling=true" -q)

# 刪除名字出現特定字串的 image
docker rmi $(docker images |grep 'k8s')

Container 相關

查看 container

1
2
3
4
5
6
7
8
9
10
11
12
# 查看運行中的 container
docker ps

# 查看所有 container, 包含沒有啟動的(STATUS=exited)
docker ps -a

# 查看停止的 container
docker ps -f "status=exited"

# 查看 container 的詳細訊息,會返回一個 json 格式
docker inspect CONTAINER_ID
docker inspect CONTAINER_NAME

啟動或停止 container

1
2
3
4
5
6
7
8
9
10
11
# 啟動 container
docker start CONTAINER_ID

# 重啟 container,如果 container 本身是 stop 狀態,效果同 start
docker restart CONTAINER_ID

# 停止 container
docker stop CONTAINER_ID

# 停止在運作的所有 container
docker stop $(docker ps -a -q)

或是也可以用 docker-compose 一次啟動多個 container

1
2
3
# 使用 docker-compose 啟動服務,-d 為在背景執行
docker-compose up -d apache2 mysql
docker-compose up nginx mysql redis

1
2
3
4
5
# 進入 container
docker-compose exec --use=root apache2 bash
docker-compose exec --use=laradock workspace bash
docker-compose exec --user=root mysql bash
docker-compose exec --user=root redis bash

刪除 container

1
2
3
4
5
# 刪除指定的 container
docker rm CONTAINER_ID

# 刪除所有 container
docker rm $(docker ps -a -q)

刪除所有 image & container

1
docker-compose down

log 相關

1
2
3
4
5
6
7
8
9
10
11
# 查看某個服務的 log 
docker-compose logs SERVICE_NAME

# 查看 nginx 的即時 log。好用,尤其是在啟動服務時使用了 -d 背景執行,看不到服務的執行狀況時
docker-compose logs -f nginx

# 看倒數 5 行的 log
docker-compose logs --tail 5 nginx

# 也可以用 docker 指令看倒數 5 分鐘的 log,但對象要是 container id
docker logs --since 5m CONTAINER_ID

備份和還原 mysql container 的資料

1
2
3
4
5
# Backup,以 mysqldump 把資料庫備份出來,檔案會存在當前目錄
docker exec CONTAINERI_ID /usr/bin/mysqldump -u root --password=root DATABASE_NAME > backup.sql

# Restore
cat backup.sql | docker exec -i CONTAINER_ID /usr/bin/mysql -u root --password=root DATABASE_NAME

Reference

Use the Docker command line

【Day 3】 - Docker 基本指令操作

如何快速刪除狀態 DANGLING 的特定 DOCKER IMAGES

Backup and restore a mysql database from a running Docker mysql container