docker命令大全

一、基本命令:
查看鏡像:docker images
搜索鏡像:docker search mysql:5.7.0 (5.7.0:搜索指定的版本)
列出當前運行的容器:docker ps
列出所有的容器(包括已停止的):docker ps -a
停止容器 :docker stop 5d034c6ea010 (5d034c6ea010 : 容器id)
進入容器: docker exec -it 容器id /bin/bash
下載鏡像:docker pull ubuntu(默認latest,最新版)
下載帶版本的鏡像:docker pull ubuntu:13.10
創建容器時,設置自動啟動容器:docker run --restart=always 容器id(或者容器名稱)
如果創建時未指定 --restart=always ,可通過update 命令設置:
docker update --restart=always 容器id(或者容器名稱)
查看docker信息:docker info
查看容器的日志:docker logs -f 容器ID(-f:可以滾動查看日志的最后幾行)
查看我們的容器與基礎鏡像有什么不同:docker container diff sample
A代表新增文件
C代表修改過的文件
D代表被刪除的文件
將修改過的容器導出為自己的鏡像:docker container commit sample my-alpine
看本地鏡像runoob/ubuntu:v3的創建歷史:docker history runoob/ubuntu:v3
將鏡像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文檔:
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3(-o :輸出到的文件)
導入使用 docker save 命令導出的鏡像:
docker load < busybox.tar.gz
從鏡像歸檔文件my_ubuntu_v3.tar創建鏡像,命名為runoob/ubuntu:v4:
docker import my_ubuntu_v3.tar runoob/ubuntu:v4
創建容器:docker run -i -t -v /root/software/:/mnt/software/ 9f38484d220f /bin/bash (-v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>)
運行容器:docker run --rm -t -i ubuntu:15.10 /bin/bash (/bin/bash:交互式 Shell,-t: 表示容器啟動后會進入其命令行,-i: 表示以“交互模式”運行容器,
--rm:停止容器后直接刪除容器)
數據拷貝: docker cp,此命令用于容器與宿主機之間進行數據拷貝,如 docker cp 5d034c6ea010: /etc/nginx/nginx.conf /dockerData/nginx/conf/nginx.conf 將容器的目錄文件拷貝到宿主機指定位置,容器ID可以替換成容器名
刪除鏡像:docker rmi 鏡像名/鏡像id
刪除容器: docker rm 容器id (必須是未啟動的容器 )
強制刪除容器 db01、db02:docker rm -f db01 db02
刪除容器 nginx01, 并刪除容器掛載的數據卷:docker rm -v nginx01
移除所有的容器:docker rm -f (docker container ls -aq) 殺掉一個運行中的容器:docker kill -s KILL mynginx(-s :向容器發送一個信號) 更新鏡像: 1.從已經創建的容器中更新鏡像,并且提交這個鏡像,使用 yum update 更新鏡像,在完成操作之后,輸入 exit 命令來退出這個容器。 提交鏡像: docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2,其中: -m: 提交的描述信息 -a: 指定鏡像作者 e218edb10161:容器 ID runoob/ubuntu:v2: 指定要創建的目標鏡像名 2、使用 Dockerfile 指令來創建一個新的鏡像 設置鏡像標簽: docker tag 860c279d2fec ubuntu:dev 查詢最后一次創建的容器: docker ps -l 容器命名: docker run -d -P --name runoob training/webapp python app.py(--name命令:定義容器別名,其中runoob :容器名,training/webapp:容器所屬的鏡像名,python:為啟動的容器創建的別名) 新建網絡:docker network create -d bridge test-net,參數說明:-d:參數指定 Docker 網絡類型,有 bridge、overlay,其中 overlay 網絡類型用于 Swarm mode 登錄docker遠程鏡像倉庫: sudo docker login --username=qweads registry.cn-hangzhou.aliyuncs.com 退出docker遠程鏡像倉庫:docker logout 推送鏡像到遠程倉庫:docker push 鏡像名/鏡像id 導出容器:docker export 容器id> /地址/容器別名.tar, 導入容器:cat docker/ubuntu.tar | docker import - test/ubuntu:v1 (將快照文件 ubuntu.tar 導入到鏡像 test/ubuntu:v1) 查看鏡像或容器的詳細信息:docker inspect 容器id (可以加-f參數只查看某一項信息) 查看容器IP: docker inspect --format='{{.NetworkSettings.IPAddress}}'CONTAINER_ID/NAME
查看容器數據卷掛載目錄:docker inspect container_id | grep Mounts -A 20
手動創建數據卷: docker volume create shared-data
刪除數據卷: docker volume rm my-data
列出目前已有的volume:docker volume ls
與磁盤空間使用情況相關的命令:docker system df
移除所有不在運行狀態的容器:docker container prune
清除未被使用到的鏡像:docker image prune --force --all
清除未被使用到的數據卷:docker volume prune
創建一個自定的網絡:docker network create --driver bridge sample-net
查看所有網絡 :docker network ls
刪除所有未被任何容器或者服務連接的網絡:docker network prune
查看該網絡的詳細情況:docker network inspect test-network
將一個容器連接到多個網絡:
第一步:docker run -itd --name test --network test-net mysql /bin/bash ping
127.0.0.1
第二步:docker network connect test-net mysql
從網絡中移除容器:docker network disconnect 網絡名/id mysql
刪除網絡:docker network rm my-network1(刪除前,必須確認沒有容器在使用該網絡)
修改已啟動容器的端口號:

  1. docker ps 查看 Container 的 id
  2. docker stop {container_id}
    3.找到 /var/lib/docker/containers/{container_id}/hostconfig.json 修改
  3. sudo service docker restart 重啟docker
  4. docker start {container_id} 重新啟動 container

二、dockerfile:
1、創建Dockerfile文件:mkdir Dockerfile
2、編輯文件 :vi Dockerfile
3、添加腳本如:
FROM nginx
RUN echo '這是一個本地構建的nginx鏡像' > /usr/share/nginx/html/index.html
介紹:
FROM:定制的鏡像都是基于 FROM 的鏡像,這里的 nginx 就是定制需要的基礎鏡像。后續的操作都是基于 nginx。
RUN:用于執行后面跟著的命令行命令。有以下倆種格式:
shell 格式:RUN <命令行命令>,<命令行命令> 等同于,在終端操作的 shell命令。
exec 格式:RUN ["可執行文件", "參數1", "參數2"]
例如:#RUN ["./test.php", "dev", "offline"] 等價于RUN ./test.php dev offline

指令詳解
1》COPY
復制指令,從上下文目錄中復制文件或者目錄到容器里指定路徑:
COPY . /app #將上下文目錄中所有文件或目錄遞歸拷貝到容器的/app目錄下
COPY ./web /app/web #將上下文目錄中的web目錄下的內容拷貝到容器的/app/web目錄下
COPY sample.txt /data/my-sample.txt #拷貝單個文件并重命名
ADD sample.tar /app/bin/ #解壓tar包內的文件到指定目錄
ADD http://example.com/sample.txt /data/ #拷貝遠程文件到指定目錄
COPY ./sample* /mydir/ #支持源路徑中使用通配符
2》WORKDIR
WORKDIR用來定義工作目錄或者上下文目錄。常見的問題:
(WORKDIR 指定的工作目錄,必須是提前創建好的)。
由于每執行一次RUN,都是在原有鏡像上添加一個新層,因此上面的命令只是在root目錄下新建了sample.txt文件。
正確的切換至一個目錄下,并新建文件,命令如下:
WORKDIR /app/bin
RUN touch sample.txt
3》CMD
類似于 RUN 指令,用于運行程序,但二者運行的時間點不同:
CMD 在docker run 時運行。
RUN 是在 docker build。
作用:為啟動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD 指令指定的程序可被 docker run 命令行參數中指定要運行的程序所覆蓋。
如果 Dockerfile 中如果存在多個 CMD 指令,僅最后一個生效。
CMD ["<可執行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 該寫法是為 ENTRYPOINT 指令指定的程序提供默認參數
4》ENTRYPOINT
類似于 CMD 指令,但其不會被 docker run 的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程序。
但是, 如果運行 docker run 時使用了 --entrypoint 選項,此選項的參數可當作要運行的程序覆蓋 ENTRYPOINT 指令指定的程序。
假設已通過 Dockerfile 構建了 nginx:test 鏡像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定參
CMD ["/etc/nginx/nginx.conf"] # 變參
1、不傳參運行
docker run nginx:test
容器內會默認運行以下命令,啟動主進程。
nginx -c /etc/nginx/nginx.conf
2、傳參運行
docker run nginx:test -c /etc/nginx/new.conf
容器內會默認運行以下命令,啟動主進程(/etc/nginx/new.conf:假設容器內已有此文件)
nginx -c /etc/nginx/new.conf
Dockerfile構建鏡像命令:docker build -t nginx:test . (. 代表Dockerfile文件的路徑)
當你的配置文件不是默認的名字時,可以使用-f參數指定:

  docker build -t nginx:test -f my-Dockerfile .

三、docker-compose:
docker-compose.yml 配置文件:
# yaml 配置
version: '3'
services:
webapp:
build: ./dir
ports:
- "5000:5000"
redis:
image: "redis:alpine"
介紹:
docker-compose命令需在docker-compose.yml 所在目錄下才能運行
啟動應用程序:docker-compose up -d (-d:在后臺啟動)
指定使用的 Compose 模板文件,默認為 docker-compose.yml:
docker-compose -f docker-compose.yml up -d
停用移除所有容器以及網絡相關:docker-compose down
docker-compose logs:docker-compose logs
列出所有容器:docker-compose ps
構建(重新構建)項目中的服務容器:docker-compose build
拉取服務依賴的鏡像:docker-compose pull
列出指定服務的容器:docker-compose ps eureka
刪除指定服務的容器:docker-compose rm eureka
啟動指定服務已存在的容器:docker-compose start eureka
在一個服務上執行一個命令:docker-compose run web bash(這樣即可啟動一個web服務,同時執行bash命令)
停止已運行的容器:docker-compose stop eureka
通過發送SIGKILL 信號停止指定服務的容器:docker-compose kill eureka
一個web服務形成瓶頸的時候,我們可以快速地的擴充幾個web服務出來 :
docker-compose up --scale web=3(ports:需要修改為隨即映射端口,如 -5000)
version:指定本 yml 依從的 compose 哪個版本制定的。
build:指定為從上下文路徑 ./dir/Dockerfile 所構建的鏡像,
或者,作為具有在上下文指定的路徑的對象,以及可選的 Dockerfile 和 args:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod
context:上下文路徑。
dockerfile:指定構建鏡像的 Dockerfile 文件名。
args:添加構建參數,這是只能在構建過程中訪問的環境變量。
labels:設置構建鏡像的標簽。
target:多層構建,可以指定構建哪一層。

depends_on 設置依賴關系:
docker-compose up :以依賴性順序啟動服務
docker-compose up SERVICE :自動包含 SERVICE 的依賴項。在以下示例中,docker-compose up web 還將創建并啟動 db 和 redis。
docker-compose stop :按依賴關系順序停止服務。
docker-compose.yml:
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:web 服務不會等待 redis db 完全啟動 之后才啟動。

deploy:指定與服務的部署和運行有關的配置。只在 swarm 模式下才會有用。
docker-compose.yml:
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
mode:replicated
replicas: 6
endpoint_mode: dnsrr
labels:
description: "This redis service label"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s

endpoint_mode:訪問集群服務的方式:
vip:集群服務一個對外的虛擬 ip。所有的請求都會通過這個虛擬 ip 到達集群服務內部的機器。
dnsrr:DNS 輪詢(DNSRR)。所有的請求會自動輪詢獲取到集群 ip 列表中的一個 ip 地址。
labels:在服務上設置標簽。可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。
mode:指定服務提供的模式:
replicated:復制服務,復制指定服務到集群的機器上
global:全局服務,服務將部署至集群的每個節點。
replicas:mode 為 replicated 時,需要使用此參數配置具體運行的節點數量。
resources:配置服務器資源使用的限制,例如上例子,配置 redis 集群運行需要的 cpu 的百分比 和 內存的占用。避免占用資源過高出現異常。
restart_policy:配置如何在退出容器時重新啟動容器。
condition:可選 none,on-failure 或者 any(默認值:any)。
delay:設置多久之后重啟(默認值:0)。
max_attempts:嘗試重新啟動容器的次數,超出次數,則不再嘗試(默 認值:一直重試)。
window:設置容器重啟超時時間(默認值:0)。

四、docker-machine:
列出可用的機器:docker-machine ls
創建一臺名為 test 的機器:docker-machine create --driver virtualbox test(--driver:指定用來創建機器的驅動類型。)
查看機器的 ip:docker-machine ip test
停止機器: docker-machine stop test
啟動機器:docker-machine start test
進入機器:docker-machine ssh test
查看當前激活狀態的 Docker 主機:docker-machine active
查看某一個docker vm主機的信息:docker-machine env test
刪除某臺 Docker 主機,對應的虛擬機也會被刪除::docker-machine rm test
以 json 格式輸出指定Docker的詳細信息:docker-machine inspect test
設置當前的環境變量為某一個主機的信息:eval (docker-machine env test) 取消當前環境變量:eval(docker-machine env -u)
通過 SSH 連接到主機上,執行命令:docker-machine ssh swarm-manager

五、docker swarm:
Docker Swarm 是 Docker 的集群管理工具。它將 Docker 主機池轉變為單個虛擬 Docker 主機。 Docker Swarm 提供了標準的 Docker API,所有任何已經與 Docker 守護程序通信的工具都可以使用 Swarm 輕松地擴展到多個主機。
swarm 集群由管理節點(manager)和工作節點(work node)構成。
swarm mananger:負責整個集群的管理工作包括集群配置、服務管理等所有跟集群有關的工作。
work node:即圖中的 available node,主要負責運行相應的服務來執行任務(task)。


image.png

1、創建 swarm 集群管理節點(manager)
創建 docker 機器: docker-machine create -d virtualbox swarm-manager
連接到主機上:docker-machine ssh swarm-manager
初始化 swarm 集群,進行初始化的這臺機器,就是集群的管理節點:
docker swarm init --advertise-addr 192.168.99.107 #這里的 IP 為創建機器時分配的 ip。
會輸出:
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
查看集群節點信息: docker node ls
2、創建 swarm 集群工作節點(worker)
使用docker-machine 創建swarm-worker1 和 swarm-worker2 兩臺機器。
docker-machine create -d virtualbox worker1
docker-machine create -d virtualbox worker2
docker-machine ssh swarm-worker1進入機器里
添加上一步輸出的內容。
3、查看集群信息
docker-machine ssh swarm-manager進入集群管理節點,執行docker info 可以查看當前集群的信息(Swarm:active,Managers:1,Nodes:3,有三個節點,其中有一個是管理節點)
4、部署服務到集群中
注意:跟集群管理有關的任何操作,都是在管理節點上操作的。
在一個工作節點上創建一個名為 helloworld 的服務,這里是隨機指派給一個工作節點:docker service create --replicas 1 --name helloworld alpine ping docker.com
命令解釋:
docker service create 命令創建一個服務
--name 服務名稱命名為 helloworld
--replicas 設置啟動的示例數
alpine指的是使用的鏡像名稱,ping docker.com指的是容器運行的bash
5、查看服務部署情況
查看 helloworld 服務運行在哪個節點上,可以看到目前是在 swarm-worker1 節點: docker service ps helloworld
查看 helloworld 部署的具體信息:docker service inspect --pretty helloworld
6、擴展集群服務
將上述的 helloworld 服務擴展到倆個節點:docker service scale helloworld=2
可以看到已經從一個節點,擴展到兩個節點:docker service ps helloworld
7、刪除服務:docker service rm helloworld
查看是否已刪除:docker service ps helloworld
8、滾動升級服務
介紹 redis 版本如何滾動升級至更高版本
創建一個 3.0.6 版本的 redis。
docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6
滾動升級 redis
docker service update --image redis:3.0.7 redis
9、停止某個節點接收新的任務
查看所有的節點:docker node ls
可以看到目前所有的節點都是 Active, 可以接收新的任務分配。
停止節點 swarm-worker1:
docker node update --availability drain swarm-worker1 (Drain:節點狀態)
重新激活swarm-worker1:
docker node update --availability active swarm-worker1(active :活躍狀態)
10.退出 Swarm 集群
如果 Manager 想要退出 Swarm 集群, 在 Manager Node 上執行如下命令:
docker swarm leave
就可以退出集群,如果集群中還存在其它的 Worker Node,還希望 Manager 退出集群,則加上一個強制選項,命令行如下所示:docker swarm leave --force
在 Worker2 上進行退出測試,登錄 worker2 節點:
docker-machine ssh worker2
執行退出命令:docker swarm leave
11.重新搭建命令
使用 VirtualBox 做測試的時候,如果想重復實驗可以將實驗節點刪掉再重來。
停止虛擬機:docker-machine stop manager1 worker1 worker2
移除虛擬機:docker-machine rm manager1 worker1 worker2
停止、刪除虛擬主機后,再重新創建即可。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容