Docker 可以在機器上,快速產生出各種不同的 VM 環境,而且對機器沒有什麼負載(loading)。
- ex: 於 Ubuntu Linux 跑 Debian、CentOS 或 於 Debian 7 跑 Debian 8... 等等...
Docker 初學筆記 - 基本指令操作教學(常用指令)
Docker 可以產生 VM (OS Level),所以指令非常的多,在這邊只把初學者常用到的命令列出來,進階的就用到再去官方查詢即可(或者 docker help 都可以看到)。
在指令操作前,需要先有下述幾個名詞的基本觀念:
- Image 映像檔:Docker 都是唯讀的 Image,Image 執行(instance) 產生 Container
- Container 容器:Container 可以 run、start、stop、rm,每個 Container 都是獨立分離的。Image 是唯讀的,所以 Container 啟動時,會在上面建立一層可以寫入的層級。(最多寫入127層)
- Registry 倉庫 (Public / Private) https://hub.docker.com/ # Image 預設都由此處抓取
上述名詞於系統的流程
- 由 Registry 抓取 Image 到 Local 端,可以把 Image 想成是作業系統的 IMG、ISO 檔
- 啟動此作業系統(Image) 會產生 Container (實體化)
- 註1:一個 Image 可以產生、執行出多組 Container (同一個 VM 可以多重執行,執行當下會產生 Container,Container 上面會有自己寫入的 aufs 層級)
- 註2:可以想像 Container 就是 Image 上面的一層 Layer
Docker 常用命令
官方出版的 Docker
Docker commands 官方文件:
常用命令:run、exec、ps、rm、rmi、images
Docker 版本資訊
- docker version
- docker info
Docker 搜尋 Image
- docker search image-name
- docker search debian
- docker search nginx
Docker 抓取 Image
- docker pull ubuntu # 抓所有 ubuntu image 回來, tag 可於後面附加上去
- docker pull ubuntu:16.04 # 只抓取 Ubuntu 16.04 的 Image
- docker pull debian:jessie
- docker pull debian:latest # library/debian - Docker Hub,latest 只會抓最新版 (Debain Docker 官方版)
- docker pull ubuntu:latest # library/ubuntu - Docker Hub
Docker 列出 Local Images
- docker images # 列出 images
Docker 啟動 Image 產生 Container (start)
- docker start hash-id # docker ps -a 看到想要讓他執行,可以直接 start
Docker 暫停 Image 產生 Container (stop)
- docker stop hash-id # 此 hash-id 由 docker ps 可找到
Docker 執行 Image 產生 Container (run)
- docker run
- docker run -d debian:jessie # 會自動執行 docker pull + 啟動並進入背景執行
- docker run -it debian:jessie bash # 會自動執行 docker pull,跑起來自動執行 bash 程式進入此 Container
- docker run --rm debian:jessie bash # Container 執行停止(docker stop container-name)後,會自動移除
- docker run -d -p 80:80 nginx # 把裡面的 80 port 導到外面的 80 port (host Port:container Port)
- docker run ubuntu:trusty /bin/echo "hello world" # 說明如下
- image name:ubuntu:trusty
- execute:/bin/echo
- argument:"hello world"
- docker run ubuntu:latest /bin/sh -c "while true; do echo hello, world; sleep 1; done;"
- docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello, world; sleep 1; done;" # -d 會進入背景執行
- docker run -d ubuntu:latest /bin/sh -c "apt install apt-utils; done;" # 安裝套件
- docker run -it --name test ubuntu # 指定名稱
- docker run -d -p 3306:3306 -e MYSQLROOTPASSWORD=1234 mysql # 指定 port 與 密碼
- mysql -u root -p1234 -h 172.17.42.1 # 於外部可直接連進 Docker 內部 MySQL
- docker run -d -p 3307:3306 -e MYSQLROOTPASSWORD=1234 mysql # 本機 3307 對應到 docker 3306
- mysql -u root -p1234 -P 3307 -h 172.17.42.1
- docker run -d --name web -m 512m -p 8080:80 nginx # 限制記憶體大小
- docker run -d --expose=80 --name nginx-web nginx
- docker run -d -v $(pwd)/project:/var/www --rm --name container-name -p 80:80 container-name # 綜合上述,啟動執行,docker stop 順便移除
Docker 執行 Container 某命令 (exec)
- docker exec hash-id /sbin/ifconfig
- docker exec -t hash-id /bin/bash
- docker exec -it debian:latest /bin/bash
- docker exec -it debian:latest /sbin/ifconfig
Docker 掛載目錄進入 Container (run -v)
- docker -v 掛載點
- docker run -d --name xxx -p 80:80 -p 3306:3306 -v /mnt/xxx:/mnt debian:jessie
- /mnt/xxx:目前 Local 環境目錄
- /mnt:Container 目錄
Docker 產生、操作 Volumes (volume)
- docker volume create --name myvol # 建立 local volume
- docker run -v myvol:/data # Container start 就 Mount 此 volume
- docker volume rm myvol # 砍掉 volume
- docker volume ls # 列出 volumes
Docker 列出 Container (ps)
- docker ps # 還在執行中的 Container,可以看到詳細 hash id
- docker ps -a # 執行、停止的 Container 都列出來
- docker ps -l -q # 只列出 hash id,常用,可考慮加入 .bashrc:alias dl='docker ps -l -q'
Docker 進入(Attach) Container
- docker attach hash-id # -d 模式後,attach hash id 會回到此 conatiner console,"ctrl-p, ctrl-q detach".
- 註:attach 進去此 Container,若沒有用 detach 而是 exit 離開,此 Container 也會跟著離開結束
Docker 列出 Logs
- docker logs hash-id
- docker logs -f hash-id
Docker 刪除 Container (rm)
- docker rm hash-id # CONTAINER ID
- docker rm -f hash-id # 強置刪除
- docker rm $(docker ps --filter status=exited -q) # 砍掉所有停止的 Container
- docker rm $(docker ps -a -q) # 移除所有 Containers
- docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm # 一次砍掉狀態是 exited,而且是幾週前的 container
- docker ps -a | awk '{print $1}' | xargs --no-run-if-empty docker rm # ps -a 砍掉全部 stop 的 container
Docker 刪除 Images (rmi)
- docker rmi image-id # docker images 可以看到 image-id
- docker rmi -f image-id # 強置刪除
- docker rmi $(docker images -q) # 移除所有 docker images
- docker rmi
docker images -qa
# 移除所有 docker images - docker rmi $(docker images -f "dangling=true" -q) # 砍所有沒有 tag 的 image
Docker 查看 Container 詳細資訊 (inspect)
- docker inspect mysql
- docker inspect mysql | grep IPAddre # 想抓取 ip
Dockfile 產生 Image(build)、由 Container 產生 Image (commit)
- docker build -t myimage . # build image,需要 Dockerfile
- docker build -t user-name/v1.0.0 .
- docker commit hash-id myimage # 由 Container 產生 Image
- docker commit -m 'commit-message' hash-id tsung/myimage:tag-name # 用此 hash-id 現在的內容包成 Image (tsung/myimage),同時設定 Tag tag-name
Docker 將 Container 重新命名 (rename)
- docker rename hash-id new-name
Docker 從 Container 複製檔案出來 (cp)
- docker cp hash-id:/etc/group /tmp # Container-id:path local-storage
Docker 儲存當下環境的 Image 到 tar - (save)
- docker save image-name > image-name.tar # 存 Image
- docker save -o debian.tar debian:jessie
- docker save -o ubuntu.tar ubuntu:lucid ubuntu:saucy
- 註:save 儲存當下 Image 變動部份,與原始 Image 是分開的 (存映像檔,包成 Image)
Docker 由 tar 還原回 Image (load)
- docker load < image-name.tar # save tar
- 註:Load an image from a tar archive or STDIN
Docker 儲存當下環境的 Image(含原始 Image) 到 tar (export)
- docker export image-name > image-name.tar
- docker export --output="image-name.tar" image-name
- 註:只要有此 tar 檔,到其它機器都可以直接立刻使用 (把現在的環境打包,當下的 container)
Docker 由 tar 還原回 Container (import)
- docker import < image-name.tar # 直接建立一個新的 Container
- cat image-name.tar | docker import - local/image-name # image-name.tar = export tar
- 註:Import the contents from a tarball to create a filesystem image
Docker 查看 Container Ports (port)
- docker port hash-id # 80/tcp -> 0.0.0.0:80
Docker 查看 Container Process (top)
- docker top hash-id # 秀出 Container 正在執行的 process
Docker 砍掉正在跑得 Container (kill)
- docker kill hash-id
- docker kill $(docker ps -q) # 停止所有 Containers
執行 Docker 不需 sudo 的設定方式
- vim /etc/group # 將帳號加入 docker group 就不會每次都需要 sudo
docker:x:999:username - 或 sudo gpasswd -a ${USER} docker # 將自己此帳號加入 docker group
- sudo service docker restart
官方文件
- Docker Documentation
- What is a Container? | App Containerization - 關於 Container 的官方圖文解說版
- Configure and troubleshoot the Docker daemon - Docker Debug 文件
相關網頁
- Docker cheat sheet with examples
- 15 Docker Tips in 5 Minutes
- Docker Commands and Best Practices Cheat Sheet
- Docker Cheat Sheet - PDF
- Docker Cheat Sheet - PDF
- Docker Cheat Sheet - PDF
- wsargent/docker-cheat-sheet · GitHub
- Docker Cheat Sheet
- How to remove old Docker containers
- 10張圖帶你深入理解 Docker 容器和鏡像 - docker run 與 docker start 的不同
這篇很實用!謝謝