###### tags: `教學` `Docker` `學習筆記` `DockerCLI` # Docker and Container A02 - 常用指令 [TOC] --- ## part1 ### 啟動 ```linux= 開啟服務 $ sudo systemctl start docker.service $ sudo service docker start 設定開機啟動 $ sudo systemctl enable docker.service 停止服務 $ sudo service docker stop 查看服務狀態 $ sudo systemctl status docker.service ``` ### Registry * `docker login`:進入Registry * `docker login localhost:8080`,經由8080進入倉庫 * `dokcer logout`:退出Registry(docker hub) * `docker pull aaa:latest`:抓取aaa專案最新的版本 * `docker push <image>:<tag>`:把映像檔推到倉庫(docker hub) * 尋找映像檔: ``` docker search nginx ,搜尋nginx這個映像檔 docker search nginx --stars=3 --no-trunc busybox ``` * 將映像檔從倉庫拉到本地(pull):`docker pull nginx` * 將映像檔從本地推到倉庫(push):`docker push eon01/nginx localhost:5000/myadmin/nginx` ### image * `docker images` :可以看到本地的image有哪些 * `docker rmi aaa`:刪除aaa這個image(rmi = remove image) * `docker run aaa:bbb`:執行aaa專案的docker image(bbb的版本) * `docker run aaa echo "hey001"`: echo "hey001"這種東西 * `docker run aaa df`:看看這個image的磁碟空間 * `docker run aaa ls /`:看看這個image的根目錄下有什麼東西 * `docker run -it aaa /bin/sh`:執行/bin/裡面的shell * `docker run -d -it aaa /bin/sh`:-d在背景執行-,這樣不會主動印出log * `docker tag [source] [target]`: 替image加上標籤/別名 * `docker commit [container id] [new image name]`,將容器轉換為image * `docker inspect <image>`, 查看映像檔的詳細資料 #### more Images 1. Building Images: - `docker build -t <image>:<tag> <run_directory> -f <dockerfile>`,使用dockerfile建立一個映像檔 ```dockerfile= docker build . docker build github.com/creack/ docker-firefoxdocker build - < Dockerfile docker build - < context.tar.gz docker build -t eon/infinite . docker build -f myOtherDockerfile .curl example.com/remote/Dockerfile | docker build -f - . ``` 1. Loading a Tarred Repository from a File or the Standard Input Stream:`docker load < ubuntu.tar.gzdocker load --input ubuntu.tar` 1. Save an Image to a Tar Archive:`docker save busybox > ubuntu.tar` 1. Showing the History of an Image:`docker history` 1. Creating an Image Fron a Container:`docker commit nginx` 1. Tagging an Image:`docker tag nginx eon01/nginx` ### Container * `docker container ls`:列出容器 * `docker ps`,列出正在執行的容器(process status) * -a:顯示所有的容器,包括未運行的。 - -f:根據條件過濾顯示的內容。 - --format:指定返回值的模板文件。 - -l:顯示最近創建的容器。 - -n:列出最近創建的n個容器。 - --no-trunc:不截斷輸出。 - -q:靜默模式,只顯示容器編號。 - -s:顯示總的文件大小。 * `docker exec -it ert43yer /bin/sh`:進入ert43yer這個container執行shell * -i = --interactive,把標準輸入綁定到容器上 #### 基本操作1 1. 創建容器(create):`docker create -t -i eon01/infinite --name infinite` 1. 執行容器(run):`docker run -it --rm --name infinite -d eon01/infinite` - --rm:當容器終止時會自動刪除 3. 容器更名:`docker rename infinite infinity` * 將infinite改成infinity 4. 映像檔更名:`$ docker tag [imageid] [name:tag]` 5. 移除容器:`$ docker rm infinite` 6. 更新容器:`$ docker update --cpu-shares 512 -m 300M infinite` #### 基本操作2 1. 啟動容器:`docker start nginx` 1. 停止容器:`docker stop nginx` 1. 重開:`docker restart nginx` 1. 暫停:`docker pause nginx` 1. 取消暫停:`docker unpause nginx` 1. 阻塞容器:`docker wait nginx` 1. 殺掉容器:`docker kill nginx` 1. 與現有容器連接:`docker attach nginx` #### 特別操作 1. `docker run -v [外部位置]:[Container內部位址]`:利用外部位置來取代Container內部的位置,可以為資料夾或是檔案。 #### 從容器取得資訊: 1. 查看執行中的容器:`docker ps`,`docker ps -a` 1. Container Logs:`docker logs <container>` 1. Inspecting Containers: ``` docker inspect <container> docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -q) ``` 3. Containers Events:`docker events <container>` 4. List the ports a docker container is running on :`docker port <container>` 5. `docker top <container>` Running Processes / Show a 'top' view of processes running on a container 6. `docker stats <container>`,Container Resource Usage / Show a 'top' view of all docker containers 7. 檢查容器文件系統上的變更:`docker diff <container>` #### 容器內外交換資料 (docker cp) > 從容器內複製東西出來,把東西送到容器內 ```dockerfile= # Mount a local directory to your container 掛載本地資料夾到容器 docker run -v <local_dir>:<container_dir> <image> # Copy file or folder from a docker container to host machine 從容器內複製東西出來 docker cp <container>:<container_dir> <local_dir> # Copy file or folder from local machine onto a container 從本地複製東西進到容器 docker cp <local_dir> <container>:<container_dir> ``` --- ### Dockerfile * `vi Dockerfile`:編輯dockerfile </br>  * 第一行:去找最新版的image(alpine為image名) * 第二行第三行:根據XXX進行安裝 * 第四行:啟動指令 * `docker build -t myimage .`:在當下目錄用dockerfile來建立一個image(名為myimage) * `docker run -d -p 80:80 myimage`:在背景執行image,並指定port * docker run -d -p 127.0.0.1:<local_port>:<docker_port> <image>,將本地埠號連結到容器本身 ### 掃描 - 掃描image與Dockerfile:雖然上傳到某些映像檔倉庫也會掃描,包版完先掃描可以節省很多時間 * `$ docker scan <image>`,掃描映像檔 * `$ docker scan --file Dockerfile <image:tag>`,掃描(所在地的)Dockerfile和指定的映像檔 --- ## part2 ### 刪除 1. `docker rmi xxxxx`,删除xxx這個映像檔 6. `docker rmi $(docker images -aq)`,删除所有的映像檔 7. `docker image prune`,移除未使用的映像檔 1. `REPOSITORY` 與 `TAG` 標示為 `<none>` 2. 沒有其他 image 或 container 與此 image 有相依 9. `docker rm nginx`,刪除容器 10. `docker rm -v nginx`,刪除容器和它的資料卷 11. `docker ps -aq`,列出所有的容器 ID 12. `docker stop $(docker ps -aq)`,停止所有的容器 13. `docker rm $(docker ps -aq)`,删除所有的容器 14. `docker rm $(docker ps -a -f status=exited -q)`,移除全部退出的容器 15. `docker rmi $(docker images -f dangling=true -q)`,移除無相關的映像檔,此映像檔沒有與任何資源相連結 16. `docker volume rm $(docker volume ls -f dangling=true -q)`,移除無相關的資料卷 17. `docker system prune`,移除所有未使用的資源 - all stopped containers - all networks not used by at least one container - all dangling images - all build cache 1. `docker kill [container]`: Kill a particular container. 1. `docker kill $(docker ps -q)`: Kill all containers that are currently running. 1. `docker rm [container]`: Delete a particular container that is not currently running. 1. `docker rm $(docker ps -a -q)`: Delete all containers that are not currently running. - [參考資料](https://iter01.com/572355.html) --- ### 清理 > 把當下的都清理掉 1. 停止全部container:`$ docker stop $(docker container ls -aq)` 2. 清掉所有沒在用的container和image:`$ docker system prune`,確認(y) 3. 清除所有images:`$ docker rmi $(docker images -aq)` 4. 清除volume(如果有資料的話):`$ docker volume rm $(docker volume ls)` --- ### 查看log或其他資訊 - `$ docker history [image]`: 展示個別映像檔的歷史 - `$ docker logs [Container]`:查看紀錄 - `$ journalctl -xe`:查看系統歷程 - `$ docker logs -f <container>`,持續追蹤這個容器的log - `$ docker logs -t <container>`,顯示log的時間戳記 - `$ docker system info`,顯示與docker有關的資訊 - `$ docker system df`,顯示docker的磁碟空間使用情形 --- ## part3 ### Networking 1. Creating Networks: ```dockerfile= docker network create -d overlay MyOverlayNetwork docker network create -d bridge MyBridgeNetwork docker network create -d overlay \ --subnet=192.168.0.0/16 \ --subnet=192.170.0.0/16 \ --gateway=192.168.0.100 \ --gateway=192.170.0.100 \ --ip-range=192.168.1.0/24 \ --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \ --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \ MyOverlayNetwork ``` 1. Removing a Network:`docker network rm MyOverlayNetwork` 1. Listing Networks:`docker network ls` 1. Getting Information About a Network:`docker network inspect MyOverlayNetwork` 1. Connecting a Running Container to a Network:`docker network connect MyOverlayNetwork nginx` 1. Connecting a Container to a Network When it Starts:`docker run -it -d --network=MyOverlayNetwork nginx` 1. Disconnecting a Container from a Network:`docker network disconnect MyOverlayNetwork nginx` --- ### Docker Volumes ```dockerfile= # List volumes docker volume ls # Create a volume docker volume create <volume> # Delete a volume docker volume rm <volume> # Show volume metadata docker volume inspect <volume> # Delete all volumes not attached to a container docker volume prune ``` ### Docker Compose > 一次處理一堆container ```dockerfile= # Start your docker-compose defined resources in detached mode 啟動compose $ docker-compose up -d -f <docker_compose_yaml> # Stop all docker-compose resources 停止compose $ docker-compose stop # Destroy all docker-compose resources 關掉compose $ docker-compose down # Show docker-compose processes 列出現有的container $ docker-compose ps # Show docker-compose logs 查看log $ docker-compose logs # Show docker-compose resource consumption $ docker-compose top # 根據Dockerfile去製作全新的image來用。`--no-cache`指令會跟docker daemon說不要使用本地已經有的image。 $ docker-compose build --no-cache ``` --- ### Docker Swarm 1. 安裝Docker Swarm:`curl -ssl https://get.docker.com | bash` 1. 初始化Swarm:`docker swarm init --advertise-addr 192.168.10.1` 1. Getting a Worker to Join the Swarm:`docker swarm join-token worker` 1. Getting a Manager to Join the Swarm:`docker swarm join-token manager` 1. Listing Services:`docker service ls` 1. Listing nodes:`docker node ls` 1. 創建服務:`docker service create --name vote -p 8080:80 instavote/vote` 1. Listing Swarm Tasks:`docker service ps` 1. 擴展服務:`docker service scale vote=3` 1. 更新服務: ```dockerfile= docker service update --image instavote/vote:movies vote docker service update --force --update-parallelism 1 --update-delay 30s nginx docker service update --update-parallelism 5--update-delay 2s --image instavote/vote:indent vote docker service update --limit-cpu 2 nginx docker service update --replicas=5 nginx ``` --- ### 複製文件 * `docker cp mycontainer:/opt/file.txt /opt/local/` * `docker cp /opt/local/file.txt mycontainer:/opt/` ### 使用別名 **範例:使用 npm** > 設定好後,打 npm 就等於打了長長一串 docker run 指令了。到這裡讀者也能感受,最後用起來的感覺會跟平常使用 npm 一模一樣,幾乎可以取代安裝工具。 1. alias npm="`docker run -it --rm -v \$PWD:/source -w /source node:14-alpine npm`" 2. npm --- ### 參數 * `-e`|--environment,key=value * `-d`|--detach 背景執行 container * `-it` 通常需要跟 container 互動,因此會加這個選項 * `-p`|--publish 把 container 的 port 公開到 host 上,格式為 [[[IP:]HOST_PORT:]CONTAINER_PORT] * 給完整格式的話,會把 IP:HOST_PORT 綁定到 CONTAINER_PORT;如果沒給 IP,則 IP 會代 0.0.0.0;如果連 HOST_PORT 也沒給,則會使用 0.0.0.0 加上隨機選一個 port,如 0.0.0.0:32768。 * `-f`|--force 如果是執行中的 container,會強制移除(使用 SIGKILL) * `-i`|--interactive 和 -t|--tty * `-v`|--volume,掛載 volume 到這個 container 上,格式為 **[/host]:[/container]:[參數]** * `-v $PWD:/source` 把本機目錄綁定到 container,$PWD 為執行指令時的當下目錄,/source 則是 container 裡的絕對路徑 * `-w /source` 是進去 container 時,預設會在哪個路徑下執行指令 * `npm -v` 在 container 執行的指令,可以視需求換成其他指令 * `-w`|--workdir 指定預設執行的路徑 --- ### docker指令圖解 -  --- #### 延伸閱讀、參考資料 - [更詳細的 Docker 操作方法](https://ithelp.ithome.com.tw/articles/10252871) - [DOCKER 移除 CONTAINERS、IMAGES、VOLUMES 與 NETWORKS 的方法](https://blog.clarence.tw/2019/09/10/docker-removing-containers-images-volumes-and-networks/) - [joshhu 全面易懂的Docker指令大全](https://joshhu.gitbooks.io/dockercommands/content/) - [Docker Cheat Sheet](https://swissarmydevops.com/wp-content/uploads/2020/11/Docker_Cheat_Sheet-1.pdf) --- - [回到目錄](https://hackmd.io/@Hualiteq/r1lye3M3d)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up