您的位置:首页 > 运维架构 > Docker

docker详解

2021-12-05 18:18 459 查看

本文包含

Docker命令
Dockerfile
docker-compose
k8s

容器、镜像、仓库

  • 镜像就是一个只读模板,镜像可以用来创建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 [OPTIONS] IMAGE [COMMAND][ARG]

参数

  • --name="容器新名字"
    :为容器指定一个名称
  • -d
    :后台运行容器,并返回容器ID, 也即启动守护式容器
  • -i
    :以交互模式运行容器,通常与-t同时使用
  • -t
    :为容器重新分配一个伪输入终端,通常与-i同时使用
  • -P
    :随机端口映射(大写)
  • -p
    :指定端口映射,有以下四种格式:
      ip:hostPort:containerPort
    1. ip::containerPort
    2. hostPort:containerPort
    3. 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

安装

  • 方法一

      安装 国内镜像安装:
    $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 2. 添加权限

    $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
    指令可以进一步拆分:

      context
      dockerfile
      args
      version: '3.8'
      services:
      
      webapp:
      build:
      context: ./dir  # 指定文件夹路径 可以是包含 Dockerfile 的目录路径,也可以是 git 存储库的url
      dockerfile: Dockerfile-alternate  # 指定 Dockerfile 文件名
      args: # 为Dockerfile中的变量赋值
      buildno: 1
    1. cache_from
      version: '3.8'
      services:
      
      webapp:
      build:
      context: .
      cache_from: # 指定构建镜像时使用的缓存
      - alpine:latest
      - corp/web_app:3.14
    2. labels
      version: '3.8'
      services:
      
      webapp:
      build:
      context: .
      labels: # 通过标签向生成的镜像添加元数据
      com.example.description: "Accounting webapp"
      com.example.department: "Finance"
      com.example.label-with-empty-value: ""
    3. network
      version: '3.8'
      services:
      
      webapp:
      build:
      context: .
      network: host   # 设置构建期间 run 指令要链接的网络
      # 可以设置为 none 禁用网络
    4. sim_size
      version: '3.8'
      services:
      
      webapp:
      build:
      context: .
      shm_size: '2gb' # 设置所构建容器的/dev/shm分区大小
    5. target
      version: '3.8'
      services:
      
      webapp:
      build:
      context: .
      target: prod # 按照在 Dockerfile 中定义的方式构建指定的阶段
  • image
    指定要从哪个镜像启动容器。
    如果镜像在本地不存在,也没有指定了
    build
    ,Compose 将会尝试拉取这个镜像。

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

    假如

    build
    image
    同时存在,
    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 init
    docker swarm join

      创建秘钥 直接创建:

      $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
      可以查看秘钥

    1. docker-compose
      中使用
      secret

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

      db_user
      db_password
      docker secret
      的名字,
      external
      表示使用外部的
      docker secret
      中的秘钥

    2. 在应用中使用 需要在应用内部指定使用了那些秘钥

      version: '3'
      
      volumes:
      mysql-data:
      
      services:
      mysql:
      image: mysql
      secrets:
      - db_password
      secrets:
      db_password:
      external: true
    3. 在容器中访问秘钥 秘钥文件会挂载到容器中的

      /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 -p123456789mysql: [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必知必会系列》

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: