zoukankan      html  css  js  c++  java
  • 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必知必会系列》

  • 相关阅读:
    rss相关资料(TODO)
    chrome extension 开发
    macos finder 创建smart folder
    JDK 16都发布了,为什么我们要关心Java8
    你真的了解索引吗(上)?|mysql 系列(6)
    VARCHAR 最多存多少个字符?|mysql系列(3)
    Ansible 快速入门
    MySQL 中存储时间的最佳实践
    没登录网页也能个性化推荐?一文详解浏览器指纹
    私有化仓库的 GO 模块使用实践
  • 原文地址:https://www.cnblogs.com/lczmx/p/15646377.html
Copyright © 2011-2022 走看看