0802-Docker

第一章 Docker基础

1.1 Docker概述

        Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

        Docker是一个开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离,以便快速交付软件。有了Docker,可以像管理应用程序一样管理你的基础设施(Docker是容器,容器里安装的是应用软件)。通过利用Docker快速发布、测试和部署代码的方法,可以显著减少编写代码和在生产环境中运行代码之间的延迟。

        Docker容器可以将开发的应用程序和开发依赖的应用软件以及软件所在的系统环境直接打包在一起,并且将Docker容器打包的镜像可以在任何服务器中运行而且可以保障应用程序运行环境一致;

1.2 Docker架构

  1. Docker架构:Docker使用C-S架构。Docker客户端与Docker守护进程通信,Docker守护进程负责构建、运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API,通过UNIX Socket(套接字)或网络接口进行通信,

    daHOIS.jpg
  2. Docker守护进程:Docker守护进程(dockerd)监听Docker API的请求并管理Docker对象,如镜像(images)、容器(containers)、网络(networks)和卷(volumes)。守护进程还可以与其他守护进程通信以管理Docker服务。

  3. Docker客户端(docker):是许多Docker用户与Docker进行交互的主要方式。当您使用docker run等命令时,客户端会将这些命令发送给dockerd,dockerd会执行这些命令。docker命令使用docker API。Docker客户端可以与多个docker守护进程通信。

  4. Docker registry:用来存储Docker镜像。Docker Hub是任何人都可以使用的公共registry,Docker默认配置为在Docker Hub上查找镜像。您可以运行自己的私有registry。如果您使用Docker数据中心(DDC),它包括Docker Trusted Registry(DTR)。使用docker pull或docker run命令时,将从配置的registry中提取所需的镜像。使用docker push命令时,镜像将被推送到配置的registry中。

  5. Docker对象:当使用Docker时,您可能正在创建和使用镜像、容器、网络、卷、插件和其他对象。

  6. 镜像(image):是一个只读模板,包含了创建Docker容器的指导说明。通常,一个镜像基于另一个镜像,并带有一些额外的自定义项。例如,您可以构建一个镜像,它是基于ubuntu镜像,然后再安装Apache web服务器和您的应用程序,并做相关详细配置确保应用能运行。

    • 也可以创建自己的镜像,也可以只使用其他人创建并在docker hub registry中发布的镜像。要构建自己的镜像,需要创建一个Dockerfile,其中包含一些简单的语法,用于定义创建镜像并运行它所需的步骤。Dockerfile中的每条指令都会在镜像中创建一个层。更改Dockerfile并重新生成镜像时,仅重新生成已更改的层。与其他虚拟化技术相比,这是使镜像如此轻量级、小型和快速的原因之一。
  7. 容器(container):是镜像的可运行实例。您可以使用Docker API或CLI创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,将存储附加到该容器,甚至可以基于其当前状态创建新镜像。

    • 默认情况下,容器与其他容器及其主机隔离得相对较好。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。

    • 容器由其镜像以及创建或启动时提供给它的任何配置选项定义。当容器被删除时,对其状态的任何未存储在持久性存储中的更改都将丢失,即创建容器时我们要先规划好确保有用数据是放在持久化的存储上。

  8. 联合文件系统(Union file systems):是通过创建层来操作的文件系统,这使得它们非常轻量和快速。Docker引擎使用UnionFS为容器提供构建块。Docker引擎可以使用多个UnionFS变体,包括AUFS、btrfs、vfs和DeviceMapper。

1.3 Docker安装

1. CentOS系统安装

  1. 下载CentOS7.5:https://vault.centos.org/

    • 种子文件:7.5.1804/isos/x86_64/CentOS-7-x86_64-DVD-1804.torrent
    • 完整版:Everything.iso 集成所有软件
    • 桌面版:GnomeLive.iso
    • 网络安装版:NetInstall-1804.iso
    • 最小化版:Minimal-1804.iso
  2. 配置CentOS固定IP

    • 查看网络配置文件

      1
      cd /etc/sysconfig/network-scripts
    • 查看当前网络

      1
      ifconfig
    • 编辑网络配置文件:ifcfg-[enp0网络名称]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      TYPE=Ethernet
      PROXY_METHOD=none
      BROWSER_ONLY=no
      BOOTPROTO=static
      DEFROUTE=yes
      IPV4_FAILURE_FATAL=no
      IPV6INIT=yes
      IPV6_AUTOCONF=yes
      IPV6_DEFROUTE=yes
      IPV6_FAILURE_FATAL=no
      NAME=enp0s5
      UUID=628a5a09-999c-4667-9636-75340e6465ff
      DEVICE=enp0s5
      ONBOOT=yes

      IPADDR=10.211.55.201
      GATEWAY=10.211.55.1
      NETMASK=255.255.255.0
  3. 官网安装文档:https://docs.docker.com/install/linux/docker-ce/centos/

  4. 安装前准备

    • 检查CentOS 系统的内核版本(Docker 要求 CentOS 系统的内核版本高于 3.10 )

      1
      uname -r
    • 使用 root 权限登录 Centos。确保 yum 包更新到最新

      1
      yum update
      • CentOS 8的yum源已线下,需要添加如下配置

        1. 运行以下命令备份之前的repo文件。

          1
          rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo
        2. 运行以下命令下载最新的repo文件

          1
          2
          wget https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo -O /etc/yum.repos.d/Centos-vault-8.5.2111.repo
          wget https://mirrors.aliyun.com/repo/epel-archive-8.repo -O /etc/yum.repos.d/epel-archive-8.repo
        3. 运行以下命令替换repo文件中的链接

          1
          2
          sed -i 's/mirrors.cloud.aliyuncs.com/url_tmp/g'  /etc/yum.repos.d/Centos-vault-8.5.2111.repo &&  sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo && sed -i 's/url_tmp/mirrors.aliyun.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo
          sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/epel-archive-8.repo

          http://mirrors.cloud.aliyuncs.com需要替换为http://mirrors.aliyun.com,但是官方提供的命令没替换完,如果有执行官方提供的命令还是不行的话执行下面的命令:

          1
          2
          sed -i 's/mirrors.cloud.aliyuncs.com/mirrors.aliyun.com/g'  /etc/yum.repos.d/Centos-vault-8.5.2111.repo 
          sed -i 's/mirrors.cloud.aliyuncs.com/mirrors.aliyun.com/g' /etc/yum.repos.d/epel-archive-8.repo
        4. 运行以下命令重新创建缓存

          1
          yum clean all && yum makecache
    • 查看系统的Docker旧版信息,如果有旧版Docker,需要先卸载掉Docker

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      # 查看系统中已安装的Docker相关的yum包





      # 假设系统已安装Docker旧版,需要卸载掉旧版的安装新
      sudo yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engine
    • 下载Docker安装的依赖环境:yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

      1
      sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    • 配置Docker的yum原为阿里云:默认镜像源网速慢

      1
      sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    • 我们在更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存

      1
      yum makecache fast
  5. 安装Docker

    • 可以查看所有仓库中所有docker版本,并选择特定版本安装

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      yum list docker-ce --showduplicates | sort -r
      yum list docker-ce.x86_64 --showduplicates | sort -r

      已加载插件:fastestmirror, langpacks
      可安装的软件包
      * updates: mirrors.aliyun.com
      Loading mirror speeds from cached hostfile
      * extras: mirrors.bfsu.edu.cn
      docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
      docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
      docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
      docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
      docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
      docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
      docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
      docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
      docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
      docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
      docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable

    • 安装Docker:若要安装指定版本,需要安装列表中版本信息中有centos标志的相关包,版本格式如下:中横线分开版本信息

      1
      2
      yum install -y docker-ce
      yum install -y docker-ce-18.03.1.ce-1.el7.centos
  6. 配置Docker容器镜像

    1
    2
    3
    4
    5
    6
    7
    8
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://84u6b78t.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
  7. 修改配置后需要启动Docker并设置为开机启动

    1
    2
    systemctl start docker
    systemctl enable docker

2. Windows系统安装

3. Mac系统安装

4. Ubuntu系统安装

5 其他LInux系统

Debian:https://docs.docker.com/install/linux/docker-ce/debian/

Fedora:https://docs.docker.com/install/linux/docker-ce/fedora/

其他Linux 发行版:https://docs.docker.com/install/linux/docker-ce/binaries/

第二章 Docker基础指令

2.1 DockerHub

  1. DockerHUB地址

  2. 查看镜像并下载指定版本的软件镜像

  3. Docker帮助启动指令

    指令 说明
    systemctl start docker 启动Docker服务
    systemctl stop docker 停止Docker服务
    systemctl restart docker 重启Docker服务
    systemctl status docker 查看Docker服务状态
    systemctl enable docker 设置Docker服务开机启动
    docker info 查看Docker概要信息
    docker –help 查看Docker帮助文档
    docker 指令 –help 查看Docker指令帮助文档

2.2 镜像

1. 镜像指令

  • 虚悬镜像:仓库名、标签都是<none>的镜像
指令 说明
docker images 查看本地所有的镜像
docker search <镜像名称> 在Docker搜索镜像
docker pull 进行名称:版本号 从DockerHUB拉取镜像到本地
docker system df 查看镜像|容器|数据卷所占空间
docker rmi 镜像ID 删除镜像

2. docker images

  • 指令参数

    指令选项 说明
    docker images -a 列出本地所有的镜像
    docker images -q 只显示镜像ID
  • 指令结果说明

    REPOSITORY TAG IMAGE ID CREATED SIZE
    仓库源 版本标签号:latest 镜像ID 镜像创建时间 镜像大小
  • 指令参数

    指令选项 说明
    docker search –limit 数量 指搜索关注数最多的前几个
  • 查询结果

    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    名称 描述 被关注数 是否官方镜像 是否自动编译

4. docker system df

1
2
3
4
5
TYPE            TOTAL           ACTIVE          SIZE         RECLAIMABLE
Images 1 0 112.7MB 112.7MB (100%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0B 0B

5. docker rmi

  • 指令参数

    指令选项 说明
    docker rmi -f 镜像ID 强制删除
    docker rmi 镜像ID 删除单个镜像
    docker rmi 镜像A 镜像B 删除多个镜像
    docker rmi $(docker images -qa) 在${}中执行命令,删除所有
  • 删除镜像注意事项

    • 正在运行容器的进行需要强制删除

2.2 容器

1. 容器指令

指令 说明
docker run 镜像标识 根据镜像名称、ID运行一个容器
docker ps 查看运行的容器信息
docker rm 容器ID 删除容器
docker start 容器ID 启动容器
docker stop 容器ID 停止容器
docker restart 容器ID 重启容器
docker inspect 容器ID 查看容器内部运行的进程
docker top 容器ID 查看容器内运行的进程
docker log 容器ID 查看容器的运行日志
docker exec -it 容器ID /bin/bash 以交互的方式进入容器内部

2. docker run

  • 指令参数

    指令选项 说明
    docker run –name 为容器指定新的名称
    docker run -d 后台运行容器并返回容器ID,即启动守护式容器
    docker run -i 以交互式模式运行容器,一般与-t同时使用
    docker run -t 为容器分配一个伪输入终端,一般与-t同时使用
    docker run -P (大写P)随机端口映射
    docker run -p 宿主机端口:容器端口 指定端口映射
    docker run -v 宿主机文件目录:容器文件目录 映射容器数据卷
  • 指令案例

    1
    2
    # 运行一个CentOS容器,并且交互式操作,/bin/bassh是指交互式的shell
    docker run -it centos /bin/bash

3. docker ps

  • 指令选项

    指令选项 说明
    docker ps -a 显示所有容器,包含已停止的容器
    docker ps -l 显示最近创建的容器
    docker ps -n 显示最近n个创建的容器
    docker ps -q 静默模式:只显示容器ID
  • 显示结果

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    容器ID 所属镜像 创建时间 状态 端口 名称

4. docker inspect

5. docker exec

6. docker log

第三章 容器数据卷

3.1 容器卷概述

        在Docker容器中产生的数据默认是保存在容器内部中,如果希望容器产生的数据实现持久化,需要将容器内的数据保存在宿主机中,否则删除容器也会将容器内的数据一并删除;目前Docker提供三种不同的方式将容器内数据挂载到宿主机中:

  • volumes:数据卷,Docker挂历宿主机文件系统的一部分,默认位于/var/lib/docker/volumes,默认所有的Container数据都存在真个目录下下面,创建是时候没有指定卷,Docker会默认创建匿名卷;(常用方式
  • bind mounts:意味着可以存储在宿主机系统的任意位置;但是bind moun在不同的宿主机时不可移植,比如Linux和WIndows的目录结构不同,bind mount所指向的host目录也不同;(不能出现在DockerFiles中
  • tempfs:挂载存储在宿主机系统的内从中,通过docker cp命令复制到宿主机中,而不会直接写入宿主机的文件系统(一般不会使用

        前提知识:CentOS安全模式版本被加强,目录挂载默认为不安全的,添加了数据权限保护,添加参数使容器拥有了root权限:需要添加参数--privileged=true

        容器数据卷:实现数据容器内数据的持久化,数据卷将宿主机的目录映射到容器内的目录中;默认创建的数据容器卷在宿主机的/var/lib/docker/volumes/数据卷名称/_data目录中,如果数据容器卷绑定容器目录后自动将容器内的文件复制出来:①数据卷可以在容器之间共享或重用数据②卷中更改可以直接实时生效③数据卷中更改不会包含在镜像的更新中④数据卷的生命周期移植持续到没有容器使用它为止

3.2 数据卷管理

  1. 查看所以容器卷

    1
    docker volume ls
  2. 创建一个自定义容器卷

    1
    docker volume create edc-nginx-vol
  3. 差点指定容器卷详情

    1
    docker volume inspect edc-nginx-vol
  4. 清理卷

    1
    docker volume rm edc-nginx-vol 

3.3 数据卷挂载

  1. 创建容器使用指定卷

    1
    docker run -d -it --name=edc-nginx -p 8800:80 -v edc-nginx-vol:/usr/share/nginx/html nginx
  2. 使用卷创建一个容器,如果没有会自动创建

    1
    docker run -d -it --name=edc-nginx -v /app/wwwroot:/usr/share/nginx/html nginx

第四章 Docker File

4.1 Dockfile介绍

  1. 什么是DockerFile
    • 是用来构建Docker镜像的文本文件,是由一条条构建镜像所需要的指令和参数构成的脚步;
    • DockerFiles的使用步骤:①编写DockerFIle文件②使用docker build指令将DockerFile构建为镜像③执行docker run指令将镜像运行为容器
  2. DockerFile构建
    • DockerFile基本格式说明
      • 每条DockerFile保留字指令必须大写,并且后面最少跟一个参数
      • DockerFIle中指令是从上到下执行
      • DockerFile中的#表示单行注释
      • 每条指令都会创建一个新的镜像层并对镜像进行commit
    • 通过DockerFile构建镜像的流程
      • Docker从基础镜像运行(run)一个容器
      • 执行RUN指令对容器进行修改
      • 修改成功后执行类似commit的操作提交形成一个新的镜像
      • Docker在基于刚提交的镜像形成一个新的容器,然后继续执行后续指令,直到DockerFile执行完成
  3. DockerFile的作用
    • 镜像的描述文件,可以用来帮助我们自己构建一个自定义镜像
    • 可以将自己的应用打包为镜像,将应用使用容器的方式运行
    • Dockerfile构建镜像的原理:在操作系统中定义一个目录在目录中定义名称为Dockerfile的文件执行docker build命令,Docker服务(Server)会将Dockerfile所在目录作为这次镜像的上下文目录,并且将上下文目录中的所有文件进行打包,Docker服务(Server)收到打包文件后会解析Dockerfile,根据Dockerfile中的指令构建镜像,每执行一条指令构建一个镜像(用户缓存正确的指令结果),执行完成后构成成最终镜像使用–no-cache参数不使用缓存;

4.2 Dockerfile保留字

指令 作用
FROM 当前镜像是基于哪个镜像的,第一个指令必须指定
MAINTAINER 镜像维护着的姓名和邮箱地址
RUN 构建镜像时需要运行的指令,有两种格式
- shell格式:shell命令
- exec格式:参数格式,如:RUN [“可执行文件”,”参数1”,”参数2”…]
EXPOST 当前容器对外暴露的端口号
WORKDIR 构建后的镜像运行为容器时候的登陆的工作目录
USER 指定该镜像用哪个用户执行,如果不指定,默认是root,一般不指定
ENV 用来构建镜像过程中设置环境变量
ADD 将宿主机加的文件拷贝进镜像且会自动处理URL和解压包
COPY 类似add,从构建上下文目录中的文件复制到新的一层镜像的目录位置
VOLUME 容器数据卷,用户数据保存和持久化
CMD 指定一个容器启动时需要运行的名
Dockerfile中可以定义多个CMD指令,但是只要最后一个会生效
ENTRYPOINT 记得一个容器启动时要运行的命令
  1. FROM:构建自己的镜像是基于哪个镜像的,在构建时候回自动从docker hub拉取这个镜像作为base镜像,所以必须是Dockerfile的第一行指令

    1
    2
    3
    FROM Centos			# 默认会拉取最信版本的镜像
    FROM Centos:7 # 拉取指定版本的镜像
    FROM Centos@degst # 使用镜像摘要
  2. RUN:构建镜像时候需要执行的命令

    1
    2
    RUN yum install -y vim				# 运行安装vim编辑器
    RUN ["yum","install","-y","vim"] # 命令的属性格式
  3. EXPOST:镜像运行时需要暴露的端口

    1
    2
    EXPOST 3306
    EXPOST
  4. WORKDIR:用来为Dockerfile值的任何RUN、CMD、ENDPOINT、COPY、ADD指令设置工作目录,如果WORKDIR不存在,即时它没有任何后续Dockerfile指令中使用,它也会被创建

    1
    2
    WORKDIR /root/workdir	# 如果不存在会自定创建
    WORKDIR workdir # 如果是相对路径,则改路径与先前WORKDIR指令的路径相对
  5. ADD:从上下文赋值新文件、目录或远程文件url,并将它们添加到指令路径的镜像文件系统中

    1
    2
    3
    4
    5
    ADD home/*	/workdir		# 通配符添加多个文件
    ADD home-?.txt /workdir # 通配符添加文件
    ADD home.txt workdir # 拷贝文件到相对目录
    ADD home.tar workdir # 拷贝文件到相对目录,并减压
    ADD url /workdir # 远程下载文件到指定目录
  6. COPY:用来将上下文中目录中指定文件复制到镜像的指定目录中

    1
    2
    3
    COPY home/*	/workdir		# 通配符添加多个文件
    COPY home-?.txt /workdir # 通配符添加文件
    COPY home.txt workdir # 拷贝文件到相对目录
  7. VOLUME:定义容器运行时可以挂在到宿主机的目录

    1
    2
    VOLUME ["/data"]
    VOLUME /data/tomcat/webapps
  8. ENV:用来设置构建的环境变量,这个值将在构建阶段中所有后续指令的环境中

    1
    2
    ENV key value		# 定义变量
    WORKDIR $KEY # 使用变量
  9. ENTRYPOINT:运行容器后会执行的指令,如果docker指令需要覆盖ENTRYPOINT配置的命令,需要指定参数–entrypoint参数

    1
    2
    ENTRYPOINT ls $key/webapps
    docker --entrypoint ls /data # 覆盖Dockerfile中的ls 并执行ls /data
  10. CMD:在docker run指令后执行的cmd指令会覆盖Dockerfile中的cmd指令,主要作用是配合ENTRYPOINT,必须使用过json格式的参数

    1
    2
    3
    4
    5
    6
    CMD ls $key/webapp		# 执行指令
    docker ls /data # docker命令后的ls会覆盖Dockerfile内的ls

    # 配合ENTRYPOINT使用,必须使用过json格式的参数
    ENTRYPOINT ["ls"] # ENTRYPOINT 只需要指令命令或为命令指定默认参数,
    CMD ["/data/bb"] # cmd指令覆盖ENTRYPOINT参数,然后docker指令后覆盖CMD的命令,如果不覆盖会执行CMD命令
  • 构建镜像

    1
    docker build -t 自定义镜像名称:镜像版本 .(表示当前目录)
  • 案例:①开发SpringBoot应用②定义Dockerfile和jar在同一目录

    1
    2
    3
    4
    5
    6
    FROM openjdk:8-jdk
    WORKDIR /app
    COPY x.jar app.jar
    EXPOSE 8081
    ENTRYPOINT ["java","-jar"]
    CMD ["app.jar"]

4.3 DockerFile实战

第五章 Docker Compose

5.1 Docker Compose概述

  • Compose项目上Docker官方的开源项目:负责实现对Docker集群的快速编排;(解释一下为什么需要容器编排:使用dokerfile可以额方便的定义一饿单独的应用容器,但是在日常工作中,经常是多个容器相互配合,并且有时候还需要容器间按顺序启动,使用docker compose就可以满足这样的需求)
  • Compose定位:定义和运行多个Docker容器的应用,允许用户通过单独的docker-compose.yml模版文件来定义一组相关联的容器作为一个项目。但是Compose做不到特别复杂的工作:如容器的资源调度,由k8s解决;
  • Compose中有两个重要概念
    1. 服务(Service):一个应用的容器,服务可以存在多个;
    2. 项目(Project):由一组关联应用容器组成的一个完整的业务单元,在docker-copose.yml中定义(可以理解为一个配置文件代表一个项目)

5.2 Docker Compose安装

1. Windows系统

  • DockerDesktop自带docker-compose

2. Mac系统

  • DockerDesktop自带docker-compose

3. Linux系统

  • 安装compose方式一

    1. 下载

      1
      2
      3
      4
      5
      # Github官网
      sudo curl -L https://github.com/docker/compose/releases/download/。。。 /docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

      # 国内下载地址
      https://get.daocloud.io/#install-compose
    2. 安装:是个shell脚本,需要修改下载的文件的执行权限s

      1
      chmod +x /usr/local/bin/docker-compose
  • 安装compose方式二

    1. 安装pip

      1
      2
      3
      4
      yum -y install epel-release
      yum -y install python-pip

      pip --version
    2. 更新pip

      1
      pip install --upgrade pip
    3. 安装docker-compose

      1
      pip install docker-compose 

5.3 Docker Compose语法

  1. docker-compose使用方式:由于一个docker-compose.yml是一个项目,约定文件名称固定,便于区分,需要将配置文件定义在单独的目录中,将这个文件作为项目;

  2. 基本语法

    • version:必须指定,说明项目的版本

    • services:一个配置文件中可以定义多个服务(service),是在这个services的配置项之下;

    • services.<服务名>:服务名称不能重复

    • services.<服务名>.container_name:相当于run --name;容器之间通信可以使用这个名称进行通信

    • services.<服务名>.image:当前服务所要使用的镜像,如果镜像不存在会从docker hub拉取,说明镜像和版本

    • services.<服务名>.ports:数组,用于映射端口,host与容器的端口映射,建议使用字符串

    • services.<服务名>.volumes:数组,宿主机和容器数据卷映射,或者容器卷名和容器路径 ;

    • services.<服务名>. networks:指定当前服务使用的网络桥,同一个网络桥的服务可以相互通信

    • services.<服务名>.environment:设置环境变量,可以使用数组可字典两种形式

    • services.<服务名>.env_file:用于替换environment,可以是相对路径或绝对路径;环境变量可以定义再指定配置文件中,配置文件必须是.env文件,配置文件中配置格式:key=value;

    • services.<服务名>:

      • build:启动服务时,先将build命令中指定的docker-file打包为镜像然后运行该镜像
        • context:指定上下文目录,是指docker-file所在的目录,相对于yaml文件的目录或绝对路径;
        • dockerfile:指定dockerfile文件名称;
    • services.<服务名>.command:覆盖容器启动后默认执行的命令

    • services.<服务名>.depends_on:解决容器依赖的顺序,代表这个容器的启动必须依赖其他容器,在其他容器启动到一定程度后就会启动,是个数组,可以指定多个服务名;

    • services.<服务名>.healthcheck:检测容器是否允许健康

      • test:[“CMD”, “curl”, “-f”, “检查的URL”]
      • interval:检查间隔时间
      • timeout:超时时间
      • retries:重试次数
    • services.<服务名>.sysctls:修改容器内核参数

    • services.<服务名>.ulimts:指定容器的ulimits限制值,修改容器系统内部进程最大限制

      • nproc:进程数
      • nofile:
        • soft:
        • hard:
    • volumes:用于声明容器卷,run -v

    • volumes.<容器卷名称>:定义服务中使用到的容器卷名称

    • volumes.<容器卷名称>.external.true|false:否使用指定的容器卷,如果没有需要提前创建好

    • network:定义服务中用到的网桥,默认创建的是bridge,同一个网桥的服务可以相互通信

    • network.<网桥名称>:同一个网桥名称服务可以相互通信

    • network.<网桥名称>.external.true|false:否使用外部指定的网桥,如果没有需要提前创建好

    • 使用docker-compose命令执行配置文件:要求执行命令的目录必须要有一个docker-compose.yml文件

      docker-compose选项 说明
      -f、–file 默认启动文件名称docker-compose.yaml
      -f <文件名>:指定启动文件
      -p 指定项目的名称,默认用目录名当作项目名称
      -v 显示版本信息
      docker-compose参数 说明
      images 列出镜像列表
      top 查看项目中进程信息
      logs 查看项目中日志信息
      ps 列出项目中目前所有容器
      up [serviceId] 创建并启动所有容器或指定容器
      -d:容器后台运行
      exec [serviceId] bash 进入到项目中指定容器,并使用bash命令
      down 停止up命令所启动的容器,并移除网络
      stop [serviceId] 停止项目中的服务,不会移除网络
      start [serviceId] 启动项目中的服务
      restart [serviceId] 重启项目中的服务
      rm [serviceId] 删除项目中的某个服务
      -f:强制删除
      -v:删除服务并删除数据卷
      pause [serviceId] 暂停项目中的服务
      unpause [serviceId] 恢复项目中暂停的服务

5.4 Docker Compose案例

  • 案例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    version: "3.8"
    services:
    <服务名:如tomcat>:
    image: tomcat:8.0-jre8
    ports:
    - "8080:8080"
    volumes:
    - 宿主机路径:容器路径
    - 容器卷名称(必须在容器中声明容器卷名称):容器路径
    environment:
    ENV: dev
    environment:
    - ENV=DEV
    command: "redis-server --appendonly yes"

    volumes:
    容器卷名称: <宿主机路径>声明指定的卷名,compose自动创建容器卷但是会新增项目名称
    external:
    false: 是否使用指定的容器卷,如果没有需要提前创建好
    1. version:
    2. services:表示可以定义多个服务
    3. services.服务名称:表示定义再服务下的一个服务,服务名唯一
    4. services.服务名称.image:表示这个服务所需要的镜像
    5. services.服务名称.ports:端口映射数组,服务内可能有多个端口,可以配置多个端口映射,每个映射项使用双引号,防止数字可冒号解析异常
    6. services.服务名称.volumes:容器数据卷配置
    7. volumes:容器卷数组,每个配置项的key是容器卷名称,value是宿主机路径

第六章 镜像发布

  • Compose项目上Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

  • 运行一个Docker镜像,需要大量的参数,可以通过Docker-Compose编写这些参数,可以批量管理容器,只需要通过docker-compose.yml文件维护

    1. 下载docker-compose:github - docker/compose

      1
      https://github.com/docker/compose/releases
    2. 文件名称和权限修改为可执行文件

      1
      chmod 777 xxx
    3. docker-compose.yml文件说明

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      version: '3.1'
      services:
      mysql: # 自定义的名称,要管理的服务
      restart: aways # Docker启动,容器随着启动
      image: # 镜像位置
      container_name: # docker ps看到的容器名称
      ports:
      - 3306:3306
      environment: # 指定环境变量
      属性名: 属性值
      属性名: 属性值
      volumes:
      - 宿主机路径:容器路径
    4. 命令说明:在当前目录中寻找docker-compose.yml文件

      • 基于docker-compose.yml启动管理的容器:docker-compose up -d
      • 关闭并删除容器:docker-compose down
      • docker-compose start | stop | restart
      • docker-compose ps
      • docker-compose logs -f

7.3 compose&file

  • 使用docker-compose.yml文件以及dockerFile文件在生成自定义镜像的同时启动当前镜像并由docker-compose管理容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    version: '3.1'
    services:
    mysql: # 自定义的名称,要管理的服务
    restart: aways # Docker启动,容器随着启动
    build: # 构建自定义镜像
    context: # dockerFile文件路径
    dockerfile: # 指定DockerFile名称
    container_name: # docker ps看到的容器名称
    image: 镜像名:[tag] # build的镜像的名称
    ports:
    - 3306:3306
    environment: # 指定环境变量
    属性名: 属性值
    属性名: 属性值
    volumes:
    - 宿主机路径:容器路径
  • 使用docker-copose 执行yml:如果镜像不存在会构建镜像, docker-compose build 构建镜像

  • 运行钱重新构建:docker-compose up -d build

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020-2022 xiaoliuxuesheng
  • PV: UV:

老板,来一杯Java

支付宝
微信