一、基本命令:
查看鏡像: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 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(刪除前,必須確認沒有容器在使用該網絡)
修改已啟動容器的端口號:
- docker ps 查看 Container 的 id
- docker stop {container_id}
3.找到 /var/lib/docker/containers/{container_id}/hostconfig.json 修改 - sudo service docker restart 重啟docker
- 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 -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)。
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
停止、刪除虛擬主機后,再重新創建即可。