docker詳解


本文包含Docker命令Dockerfiledocker-composek8s

容器、鏡像、倉庫

  • 鏡像就是一個只讀模板,鏡像可以用來創建Docker容器,一個鏡像可以創建很多容器。
  • Docker利用容器獨立運行一個或一組應用,容器是用鏡像創建的運行實例。可以被啟動、開始、停止、刪除。
  • 可以把容器看做是一個簡易版的LInux環境
  • 倉庫是存放鏡像的地方

鏡像加速

點擊這里獲取阿里雲docker加速器

至於如何使用, 可以看網站的教程

常用命令

命令圖片

幫助命令

  • docker version
    獲取docker版本
  • docker info
    docker信息,如多少個鏡像,內存等信息。
  • docker --help
    幫助信息

鏡像命令

  • docker images
    列出本機上的鏡像
    -a 列出本地所有的鏡像(含中間映射層) (重要)
    -q 只顯示鏡像ID (重要)
    --digests 顯示鏡像的摘要信息
    --no-trunc 顯示完整的鏡像信息
  • docker search 某個XXX鏡像的名字
    www.dockerhub.com搜索
    --no-trun 顯示完整的鏡像描述
    -s 列出收藏數不小於指定值的鏡像(重要)
    --automated 只列出 automated build類型的鏡像
  • docker pull 某個鏡像的名字
    下載鏡像
    指定tag:docker pull 鏡像名字[:TAG],默認最新(latest)
  • docker rmi 某個XXX鏡像的名字ID
    刪除鏡像
    刪除單個docker rmi -f 鏡像ID
    刪除多個docker rmi -f 鏡像名1:TAG 鏡像名2:TAG
    刪除全部docker rmi -f ${docker images -qa}
  • docker history 鏡像id
    列出鏡像的構建歷史

容器命令

有鏡像才能創建容器,這是根本前提(下載一個Centos鏡像演示)

運行容器docker run

創建並運行一個容器(本地沒有鏡像時,將從雲端下載)

docker run的流程:
docker run命令

命令: docker run [OPTIONS] IMAGE [COMMAND][ARG]
參數

  • --name="容器新名字":為容器指定一個名稱
  • -d:后台運行容器,並返回容器ID, 也即啟動守護式容器
  • -i:以交互模式運行容器,通常與-t同時使用
  • -t:為容器重新分配一個偽輸入終端,通常與-i同時使用
  • -P:隨機端口映射(大寫)
  • -p:指定端口映射,有以下四種格式:
    1. ip:hostPort:containerPort
    2. ip::containerPort
    3. hostPort:containerPort
    4. containerPort

例子:

$docker run -d -p 8080:8080 tomcat

查看容器 docker ps

列出當前所有正在運行的容器

命令: docker ps [OPTIONS]
參數

  • -a:列出當前所有正在運行的容器+歷史上運行過的
  • -|:顯示最近一個創建的容器
  • -n n:顯示最近n個創建的容器
  • -q:靜默模式,只顯示容器ID
  • --no-trunc :不截斷輸出

例子:

$docker ps
CONTAINER ID   IMAGE          COMMAND                ...  PORTS             NAMES
09b93464c2f7   nginx:latest    "nginx -g 'daemon off" ...  80/tcp, 443/tcp            mynginx
96f7f14e99ab   mysql:5.6      "docker-entrypoint.sh" ...  0.0.0.0:3306->3306/tcp       mymysql

$docker ps -n 3
CONTAINER ID        IMAGE               COMMAND                   CREATED           
09b93464c2f7        nginx:latest        "nginx -g 'daemon off"    2 days ago   ...     
b8573233d675        nginx:latest        "/bin/bash"               2 days ago   ...     
b1a0703e41e7        nginx:latest        "nginx -g 'daemon off"    2 days ago   ...    

退出容器

在容器中的兩種退出方式:

  1. exit 容器停止退出
  2. ctrl+P+Q 容器不停止退出

啟動/停止/重啟容器

啟動已經存在的容器: docker start 容器ID或容器name
重啟已經存在的容器: docker restart 容器ID或容器name
停止已經存在的容器: docker stop 容器ID或容器name
強制停止容器: docker kill 容器ID或容器簽名

例子:

$docker start container 
$docker stop container
$docker restart container

刪除容器docker rm

可以刪除多個容器

命令: docker rm 容器ID [OPTIONS]
參數

  • f: 通過SIGKILL信號強制刪除一個運行中的容器
  • l: 移除容器間的網絡連接,而非容器本身
  • v: 刪除與容器關聯的卷

一次性刪除所有容器:

$docker rm -f $(docker ps -a -q)`

容器日志docker logs

查看容器日志

命令: docker logs 容器ID [OPTIONS]
參數

  • -t 是加入時間戳
  • -f 跟隨最新的日志打印
  • --tail 數字顯示最后多少條
  • --since :顯示某個開始時間的所有日志
$docker logs -f mynginx
192.168.239.1 - - [10/Jul/2021:16:53:33 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows ....

查看容器mynginx從2021年10月1日后的最新10條日志

$docker logs --since="2021-10-01" --tail=10 mynginx

容器內進程docker top

查看容器中運行的進程信息,支持 ps 命令參數。

命令: docker top 容器ID

$docker top mymysql

容器內元數據docker inspect

命令: docker inspect 容器ID

獲取容器/鏡像的元數據

$docker inspect mysql:5.6

在外部操作容器

一次性執行, 命令: docker exec -it 容器ID bashShell
交互執行 (連接到正在運行中的容器), 命令: docker attach 容器ID
復制文件 (從容器內拷貝文件到主機上), 命令: docker cp 容器ID:容器內路徑 目的主機路徑

創建新鏡像docker commit

提交容器副本使之稱為一個新的鏡像

命令: docker commit

格式: docker commit -m="提交的描述信息" -a="作者" 容器ID 要創建的目標鏡像名:[標簽名]

關於Docker的一些概念

Docker鏡像

鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件,它包含運行某個軟件所需的有內容,包括代碼、運行時、庫、環境變量和配置文件

docker底層

docker底層是UnionFS
UnionFS(聯合文件系統): 是一種分層、輕量級並且高性能的文件系統,它支持對文件系統的修作為一 次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a singlevirtualfilesystem)。
Union文件系統是Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像)可以制作各種具.體的應用鏡像。

特性: 一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文 件系統會包含所有底層的文件和目錄

加載原理

Docker鏡像加載原理: docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。
botfs(boot file system)主要包含bootloader和kernel, bootloader主 要是引導加載kernel
Linux剛啟動時會加載bootfs文件系統,在Docker鏡像的最底層是bootfs。這一-層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。
當boot加載完成之 后整個內核就都在內存中了,此時內存的使用權己由bootfs轉交給內核,此時系統也會卸載bootfs。

rootfs (root file system),在bootfs之 上。 包含的就是典型Linux系統中的/dev, /proc, /bin, /etc等標准目錄和文件。
rootfs就是各種不同的操作系統發行版,比如Ubuntu
,Centos等等。

問: 平時我們安裝的虛擬機的Centos都是好幾個G ,為什么docker這里才要200m?

對於一個精簡的OS, rootfs可 以很小,只需要包括最基本的命令、工具和程序庫就可以了,因為底層直接用Host的kernel, 只需要提供rootfs就行了。
由此可見對於不同的linux發行版, bootfs基本是一致的, rootfs會有差別,因此不同的發行版可以公用bootfs。

優點

主要優點: 使用分層結構

為什么Docker想要采用這種分層結構?

最大的一個好處就是-共享資源 比如:有多個鏡像都從相同的base鏡像構建而來,
那么宿主機只需在磁盤上保存一份base鏡像, 同時內存中也只需加載一份base鏡像,就可以為所有容器服務了。
而且鏡像的每一層都可以被共享。

特點

Docker鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部,這一層通常被稱為容器層,容器層之下都叫鏡像層

容器數據卷

是什么

一句話:有點類似我們Redis里面的rdb和aof文件,做宿主機與容器之間的數據同步

特點:

  1. 數據卷可在容器之間共享或重用數據
  2. 卷中的更改可以直接生效
  3. 數據卷中的更改不會包含在鏡像的更新中
  4. 數據卷的生命周期一直持續到沒有容器使用它為止

使用

使用-v指定數據卷

  • 不帶權限(即擁有 讀寫 權限): docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
  • 帶權限(ro: 只讀): docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名

使用docker inspect 容器ID命令可以清楚看到綁定了哪些數據卷,以及數據卷的權限。

使用dockerfile構建內置數據卷

即不需要手動指定
VOLUME指令來給鏡像添加一個或多個數據卷. 語法參考Dockerfile章節

宿主機對應地址通過docker inspect命令查看。

若Docker掛載主機目錄Docker訪問出現cannot open directory . Permission denied
解決辦法:在掛載目錄后多加一個--privileged=true參數即可

數據卷容器

命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器.

即多個容器之間數據共享

使用方法:

  1. 創建容器a
  2. 創建容器b,指定參數--volumes -from a
  3. 這樣就實現數據同步了

容器之間配置信息的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止

Dockerfile

Dockerfile是用來構建Docker鏡像的構建文件,由一系列命令和參數構成的腳本

構建三步驟

  1. 編寫Dockerfile文件
  2. docker build
  3. docker run

編寫Dockerfile

Dockerfile內容基礎知識

  1. 每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數
  2. 指令按照從.上到下,順序執行
  3. #表示注釋
  4. 每條指令都會創建一個新的鏡像層,並對鏡像進行提交

Docker執行Dockerfile的大致流程

  1. docker 從基礎鏡像運行一個容器
  2. 執行一-條指令並對容器作出修改
  3. 執行類似docker commit的操作提交- -個新的鏡像層
  4. docker再基 於剛提交的鏡像運行一一個新容器
  5. 執行dockerfile中的 下一條指令直到所有指令都執行完成

Dockerfile常用指令

點擊這里查看: Dockerfile命令詳解(超全版本)
簡潔版如下:

指令 說明
FROM 基礎鏡像,當前新鏡像基於哪個鏡像
MAINTAINER 鏡像維護者的姓名和郵箱地址
RUN 容器構建時需要運行的命令
EXPOSE 當前容器對外暴露的端口
WORKDIR 指定創建容器后,終端默認登錄進來的工作目錄
ENV 用來在構建鏡像過程中設置環境變量
ADD 將宿主機目錄下的文件拷貝進鏡像,會自動處理URL和解壓tar壓縮包
COPY 類似ADD,拷貝文件和目錄到鏡像中,但不會自動解壓
VOLUME 容器數據卷,用於數據保存和持久化工作
CMD 容器啟動時執行的命令,多個時,最后一個生效. 會被docker run后面的參數替換(假如指定的話)
ENTRYPOINT 容器啟動時執行的命令. docker run后面命令會將成為ENTRYPOINT參數,然后拼接成新的命令
ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像被子鏡像繼承后父鏡像的ONBUILD會被觸發

例子

# myproject/Dockerfile
# 建立 python3.9 環境
FROM python:3.9

# 鏡像作者
MAINTAINER lczmx

# 設置 python 環境變量
ENV PYTHONUNBUFFERED 1

# 替換pip源為國內源
COPY pip.conf /root/.pip/pip.conf

# 創建 myproject 文件夾
RUN mkdir -p /var/www/html/myproject

# 將 myproject 文件夾為工作目錄
WORKDIR /var/www/html/myproject

# 將當前目錄加入到工作目錄中(. 表示當前目錄)
ADD . /var/www/html/myproject

# 更新pip版本
RUN /usr/local/bin/python -m pip install --upgrade pip

# 利用 pip 安裝依賴
RUN pip install -r requirements.txt

# 執行命令 python main.py
ENTRYPOINT ["python", "main.py"]

docker compose

docker-compose是一種容器編排技術

安裝/卸載docker-compose

安裝

  • 方法一

    1. 安裝
      國內鏡像安裝:
    $curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    

    從github上安裝

    $curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    

    需要安裝不同的版本時, 替換URL的版本即可, 點擊這里查看可用releases

    1. 添加權限
    $sudo chmod +x /usr/local/bin/docker-compose
    
    1. 使用
    $docker-compose version
    docker-compose version 1.27.4, build 40524192
    docker-py version: 4.3.1
    CPython version: 3.7.7
    OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
    
  • 方法二
    使用pip安裝

    $pip install docker-compose
    

    檢驗使用

    $docker-compose version
    docker-compose version 1.27.4, build 40524192
    docker-py version: 4.3.1
    CPython version: 3.7.7
    OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
    

卸載

如果基於 curl 安裝,通過以下命令卸載Docker Compose

$sudo rm /usr/local/bin/docker-compose

如果基於 pip 安裝,通過以下命令卸載Docker Compose

$pip uninstall docker-compose

使用步驟

  1. 定義dockerfile
  2. 定義docker-compose.yaml
  3. 執行docker-compose up命令或docker-compose up --build命令

docker-compose.yaml規則

也可以把文件命名為docker-compose.yml
docker-compose.yaml文件的所有指令見: docker compose官方文檔,全部配置都可以在這里找到
上面鏈接的譯文見: docker-compose 編排指南 (v3.8)
yaml文件的編寫規則見: YAML 入門教程

version

指定docker-compose的版本 (1.x/2.x/3.x), 點擊這里查看版本區別
version: "3"相當於version: "3.0"

version: '3.8'

services

服務配置
注意: services需要結合其他指令

version: '3.8'
services:
  webapp:

webapp指的是一個應用

  • build

    指定Dockerfile所在文件夾的路徑, Compose將會利用它自動構建鏡像

    version: '3.8'
    services:
    
      webapp:
    	build: ./dir
    

    build指令可以進一步拆分:

    1. contextdockerfileargs
      version: '3.8'
      services:
      
        webapp:
      	build:
      	  context: ./dir  # 指定文件夾路徑 可以是包含 Dockerfile 的目錄路徑,也可以是 git 存儲庫的url
      	  dockerfile: Dockerfile-alternate  # 指定 Dockerfile 文件名
      	  args: # 為Dockerfile中的變量賦值
      		buildno: 1
      
    2. cache_from
      version: '3.8'
      services:
      
        webapp:
      	build:
      	  context: .
      	  cache_from: # 指定構建鏡像時使用的緩存
      		- alpine:latest
      		- corp/web_app:3.14
      
    3. labels
      version: '3.8'
      services:
      
        webapp:
      	build:
      	  context: .
      	  labels: # 通過標簽向生成的鏡像添加元數據
      		com.example.description: "Accounting webapp"
      		com.example.department: "Finance"
      		com.example.label-with-empty-value: ""
      
    4. network
      version: '3.8'
      services:
      
        webapp:
      	build:
      	  context: .
      	  network: host   # 設置構建期間 run 指令要鏈接的網絡
      	  # 可以設置為 none 禁用網絡
      
    5. sim_size
      version: '3.8'
      services:
      
        webapp:
      	build:
      	  context: .
      	  shm_size: '2gb' # 設置所構建容器的/dev/shm分區大小
      
    6. target
      version: '3.8'
      services:
      
        webapp:
      	build:
      	  context: .
      	  target: prod # 按照在 Dockerfile 中定義的方式構建指定的階段
      
  • image
    指定要從哪個鏡像啟動容器。
    如果鏡像在本地不存在,也沒有指定了build,Compose 將會嘗試拉取這個鏡像。

    image: ubuntu
    image: example-registry.com:4000/postgresql
    image: a4bc65fd
    

    假如buildimage同時存在, Compose 會使用在image中指定的名字標簽來命名最終構建的鏡像

    build: ./dir
    image: webapp:tag
    

    這將從./dir構建, 生成名為webapp, 標簽為tag的鏡像

  • command

    覆蓋容器啟動后默認執行的命令

    command: echo "hello world"
    
  • entrypoint

    重寫默認入口點

    entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
    
  • environment

    設置環境變量

    environment:
      RACK_ENV: development
      SESSION_SECRET:
    
    environment:
      - RACK_ENV=development
      - SESSION_SECRET
    
  • expose

    暴露容器內部端口,
    注意不是將內部端口映射到本地端口

    expose:
     - "3000"
     - "8000"
    
  • ports

    暴露端口信息。
    使用 HOST:CONTAINER 格式,或者僅指定容器端口(宿主機將隨機選擇端口)都可以。

    ports:
      - "3000"
      - "3000-3005"
      - "8000:8000"
      - "9090-9091:8080-8081"
      - "49100:22"
      - "127.0.0.1:8001:8001"
      - "127.0.0.1:5000-5010:5000-5010"
      - "6060:6060/udp"
      - "12400-12500:1240"
    
  • working_dir

    指定容器中工作目錄

    working_dir: /code
    
  • container_name

    指定容器名稱。默認將會使用項目名稱_服務名稱_序號這樣的格式。

    container_name: project-web-container
    
  • user

    指定容器中運行應用的用戶名

    user: nginx
    
  • depends_on

    指定服務之間的依賴關系,以便按順序啟動服務。

    version: '3.8'
    
    services:
      web:
    	build: .
    	depends_on: # 先啟動 redis db 再啟動 web
    	  - db
    	  - redis
    
      redis:
    	image: redis
    
      db:
    	image: postgres
    
  • secrets

    利用docker存儲敏感數據, 然后在應用中使用
    例如 mysql 服務密碼

    注意: 需要通過提示, 執行: docker swarm initdocker swarm join

    1. 創建秘鑰
      直接創建:

      $printf "some string that is your secret value" | docker secret create my_secret -
      

      從文件中創建:

      $docker secret create my_db_pass db_pass.txt
      

      若以文件創建, 請確保文件是否安全, 或創建完后刪除文件
      使用命令: docker secret ls可以查看秘鑰

    2. docker-compose中使用secret

      version: '3'
      
      secrets:
        db_user:
      	external: true
        db_password:
      	external: true
      

      db_userdb_passworddocker secret的名字, external表示使用外部的docker secret中的秘鑰

    3. 在應用中使用
      需要在應用內部指定使用了那些秘鑰

      version: '3'
      
      volumes:
        mysql-data:
      
      services:
        mysql:
      	image: mysql
      	secrets:
      	  - db_password
      secrets:
        db_password:
      	external: true
      
    4. 在容器中訪問秘鑰
      秘鑰文件會掛載到容器中的/run/secret/目錄, 故可以通過/run/secret/<secret-name>的形式訪問秘鑰
      也就是說, 可以將/run/secret/<secret-name>作為環境變量的形式傳入到程序中

      version: '3'
      
      volumes:
        mysql-data:
      
      services:
        mysql:
      	image: mysql
      	secrets:
      	  - db_password
      	environment:
      	  MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
      	  MYSQL_DATABASE: test_database
      	volumes:
      	  - mysql-data:/var/lib/mysql
      
      secrets:
        db_password:
      	external: true
      
      

    也可不用docker secret, 直接將文件讀入

    version: '3'
    
    volumes:
      mysql-data:
    
    services:
      mysql:
    	image: mysql
    	secrets:
    	  - db_password
    	environment:
    	  MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
    	  MYSQL_DATABASE: test_database
    	volumes:
    	  - mysql-data:/var/lib/mysql
    
    
    secrets:
      db_password:
    	file: ./db_password.txt
    

    那些程序是否可以通過環境變量指定秘鑰, 請查詢對應程序的文檔

  • dns

    自定義 DNS 服務器,可以是單個值或列表

    dns: 8.8.8.8
    
    dns:
      - 8.8.8.8
      - 114.114.114.114
    
  • extra_hosts

    添加主機名映射

    extra_hosts:
      - "somehost:162.242.195.82"
      - "otherhost:50.31.209.229"
    
  • devices

    指定設備映射關系

    devices:
      - "/dev/ttyUSB0:/dev/ttyUSB0"
    
  • 其他

    domainname: your_website.com	# 容器中搜索域名
    hostname: test	# 容器中主機名
    mac_address: 08-00-27-00-0C-0A	 # 容器mac 地址
    privileged: true	# 允許容器中運行一些特權命令。
    
    # 指定容器退出后的重啟策略為始終重啟。
    restart: always		# 生產環境推薦配置為 always
    

networks

network_mode 設置網絡模式

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks 配置容器連接的網絡

services:

  some-service:
    networks:
     - some-network
     - other-network

networks:
  some-network:
  other-network:

volumes

數據卷所掛載路徑設置。

可以設置為宿主機路徑(HOST:CONTAINER)或者數據卷名稱(VOLUME:CONTAINER),並且可以設置訪問模式 (HOST:CONTAINER:ro)。

自定義數據卷,位於宿主機/var/lib/docker/volumes

version: "3"

services:
  my_sql:
    image: mysql:8.0
    volumes:
      - mysql_data:/var/lib/mysql # 數據卷名稱
      - cache/:/tmp/cache # 宿主機路徑
      - ~/configs:/etc/configs/:ro # 宿主機路徑

volumes:
  mysql_data: # 位於宿主機/var/lib/docker/volumes內
  

讀取變量

Compose 模板文件支持動態讀取主機的系統環境變量和當前目錄下的 .env文件 中的變量

使用類似shell的方式

環境變量

version: "3"
services:

  db:
    image: "mongo:${MONGO_VERSION}"

使用.env文件

# 支持注釋
MONGO_VERSION=3.6

例子

參考: Docker完美部署Django Uwsgi+Nginx+MySQL+Redis

docker-compose命令

命令格式: docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令選項:

  • -f, --file FILE 指定模板文件,默認為docker-compose.yml,可以指定多個文件
  • -p, --project-name NAME 指定項目名稱,默認使用所在目錄名
  • --verbose 輸出更多調試信息
  • -v, --version 打印版本並退出
  • -H, --host HOST 指定連接到哪個守護進程

執行命令的的環境

文件結構:

-- test
    |-- docker-compose.yaml
    `-- db_password.txt

docker-compose.yaml:


version: '3'

volumes:
  mysql-data:

services:
  mysql:
    image: mysql
	ports:
      - 3306:3306
    secrets:
      - db_password
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
      MYSQL_DATABASE: test_database
    volumes:
      - mysql-data:/var/lib/mysql


secrets:
  db_password:
    file: ./db_password.txt

db_password.txt:

123456789

查看版本version

查看版本信息。

$docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

構建並啟動服務up

自動構建,(重新)創建服務
啟動服務並在控制台聚合顯示每個容器的日志

命令選項:

  • -d在后台運行服務容器
  • --no-color不使用顏色來區分不同的服務的控制台輸出
  • --no-deps不啟動服務所鏈接的容器
  • --force-recreate強制重新創建容器,不能與--no-recreate同時使用
  • --no-recreate如果容器已經存在了,則不重新創建,不能與--force-recreate同時使用
  • --no-build不自動構建缺失的服務鏡像
  • --no-start僅創建服務但不啟動
  • -t, --timeout TIMEOUT在附加或容器已運行時,超時(默認為 10 秒)關閉容器
  • -V, --renew-anon-volumes重新創建匿名卷,而不是從以前的容器中檢索數據
  • --remove-orphans刪除未在 Compose 文件中定義的服務的容器
  • --scale SERVICE=NUM設置為服務運行的容器數量。會覆蓋 Compose 文件中的scale設置
$docker-compose up -d
Pulling mysql (mysql:)...
latest: Pulling from library/mysql
ffbb094f4f9e: Pull complete
df186527fc46: Pull complete
fa362a6aa7bd: Pull complete
5af7cb1a200e: Pull complete
949da226cc6d: Pull complete
bce007079ee9: Pull complete
eab9f076e5a3: Pull complete
8a57a7529e8d: Pull complete
b1ccc6ed6fc7: Pull complete
b4af75e64169: Pull complete
3aed6a9cd681: Pull complete
23390142f76f: Pull complete
Digest: sha256:ff9a288d1ecf4397967989b5d1ec269f7d9042a46fc8bc2c3ae35458c1a26727
Status: Downloaded newer image for mysql:latest
Creating test_mysql_1 ... done

使用: docker-compose up --build對已經構建的容器進行重新構建

停止服務down

停止容器並移除由up命令創建的容器、網絡、卷和鏡像。 定義為external的網絡和卷不會被移除。

$docker-compose down
Stopping test_mysql_1 ... done
WARNING: Found orphan containers (test_redis_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing test_mysql_1 ... done
Removing network test_default

進入容器exec

進入指定的容器, 進行交互式操作

$docker-compose exec mysql /bin/bash
$mysql -uroot -p123456789
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


列出服務ps

列出項目中的所有容器

$docker-compose ps
    Name                 Command             State                          Ports
--------------------------------------------------------------------------------------------------------
test_mysql_1   docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp

查看進程top

查看各個服務內正在運行的進程。

$docker-compose top
test_mysql_1
  UID      PID    PPID    C   STIME   TTY     TIME      CMD
-------------------------------------------------------------
polkitd   26429   26410   1   17:11   ?     00:00:02   mysqld

停止服務kill

強制停止運行中的服務容器

格式為docker-compose kill [options] [SERVICE...]
支持通過-s參數來指定要發送的信號

$docker-compose kill mysql
Killing test_mysql_1 ... done

啟動服務start

啟動用於服務的現有容器

$docker-compose start mysql
Starting mysql ... done

停止服務stop

停止已經處於運行狀態的容器,但不刪除它

$docker-compose stop mysql
Stopping test_mysql_1 ... done

運行容器run

針對服務執行一次性命令

命令選項:

  • -d后台運行容器
  • --name NAME為容器指定一個名字
  • --entrypoint CMD覆蓋默認的容器啟動指令。
  • -e KEY=VA 設置環境變量值,可多次使用選項來設置多個環境變量
  • -u, --user=""指定運行容器的用戶名或者uid
  • --no-deps不自動啟動關聯的服務容器
  • --rm運行命令后自動刪除容器,d模式下將忽略
  • -p, --publish=[]映射容器端口到本地主機
  • --service-ports配置服務端口並映射到本地主機
  • -T分配偽 tty,意味着依賴 tty 的指令將無法運行
$docker-compose run

刪除容器rm

刪除停止的容器

默認情況下,不刪除附加到容器的匿名卷。您可以使用-v覆蓋它

$docker-compose rm mysql

暫停和取消暫停服務pause/unpause

暫停正在運行的容器,可通過unpause取消暫停
格式為: docker-compose pause [SERVICE...]

暫停:

$docker-compose pause
Pausing test_mysql_1 ... done

查看狀態:

$docker-compose ps
    Name                 Command             State           Ports
-------------------------------------------------------------------------
test_mysql_1   docker-entrypoint.sh mysqld   Paused   3306/tcp, 33060/tcp

取消暫停:

$docker-compose unpause
Unpausing test_mysql_1 ... done

重啟服務restart

重啟項目中的服務

$docker-compose restart
Restarting test_mysql_1 ... done

構建服務build

構建(重新構建)並標記服務

格式: docker-compose build [options] [SERVICE...]

不指定sevice時, 為全部服務

檢驗配置config

驗證並查看 Compose 文件

$docker-compose config
secrets:
  my_secret:
    file: /opt/script-docker/test/my_secret.txt
services:
  mysql:
    environment:
      MYSQL_DATABASE: test_database
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
    image: mysql
    secrets:
    - source: my_secret
    volumes:
    - mysql-data:/var/lib/mysql:rw
version: '3'
volumes:
  mysql-data: {}

監測時間events

監測項目中容器事件
使用--json標志時,每行將打印一個json對象

$docker-compose events

查看幫助help

顯示命令的幫助和用法說明

$docker-compose help

查看日志logs

查看服務的日志輸出
格式為docker-compose logs [options] [SERVICE...]
選項:

  • --no-color # 關閉不同服務用不同顏色顯示的功能
  • -f, --follow # 實時監控日志
  • -t, --timestamps # 顯示時間戳
  • --tail="all" # 顯示所有日志

查看端口port

打印某個容器所映射的公共端口
格式為docker-compose port [options] SERVICE PRIVATE_PORT

$docker-compose port mysql 3306
0.0.0.0:3306

列出鏡像images

列出 Compose 文件中包含的鏡像

$docker-compose images
 Container     Repository    Tag       Image Id       Size
------------------------------------------------------------
test_mysql_1   mysql        latest   bbf6571db497   515.6 MB

拉取鏡像pull

拉取服務依賴的鏡像
可通過--ignore-pull-failures參數忽略拉取鏡像過程中的錯誤

$docker-compose pull

推送鏡像push

推送服務所依賴的鏡像到鏡像倉庫。

$docker-compose push

Kubernetes

TODO: 待補充

Kubernetes中文文檔

推薦閱讀: 《Docker必知必會系列》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM