1. Docker概述

1.1 根本介绍

Docker 是一个开源的利用容器引擎,基于 Go 语言 并听从 Apache2.0 协定开源。

Docker 能够让开发者打包他们的利用以及依赖包到一个轻量级、可移植的容器中,而后公布到任何风行的 Linux 机器上,也能够实现虚拟化。

容器是齐全应用沙箱机制,相互之间不会有任何接口(相似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),咱们用社区版就能够了。官网:https://docs.docker.com/

1.2 利用场景

  • Web利用的自动化打包和公布
  • 自动化测试和继续集成、公布
  • 在服务型环境中部署和整体数据库或其余的后盾利用
  • 从头编译或者扩大现有的OpenShiftCloud Foundry平台来搭建本人的Paas环境

1.3 Docker的劣势

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您可能将应用程序与基础架构离开,从而能够疾速交付软件。借助 Docker,您能够与管理应用程序雷同的形式来治理基础架构。通过利用 Docker 的办法来疾速交付,测试和部署代码,您能够大大减少编写代码和在生产环境中运行代码之间的提早。

  1. 疾速,统一地交付您的应用程序

    Docker 容许开发人员应用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。

    容器非常适合继续集成和继续交付(CI / CD)工作流程,请思考以下示例计划:

    您的开发人员在本地编写代码,并应用 Docker 容器与共事共享他们的工作。
    他们应用 Docker 将其应用程序推送到测试环境中,并执行主动或手动测试。
    当开发人员发现错误时,他们能够在开发环境中对其进行修复,而后将其重新部署到测试环境中,以进行测试和验证。
    测试实现后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简略。

  2. 响应式部署和扩大

    Docker 是基于容器的平台,容许高度可移植的工作负载。Docker 容器能够在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。

    Docker 的可移植性和轻量级的个性,还能够使您轻松地实现动静治理的工作累赘,并依据业务需要批示,实时扩大或拆除应用程序和服务。

  3. 在同一硬件上运行更多工作负载

    Docker 笨重疾速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的代替计划,因而您能够利用更多的计算能力来实现业务指标。Docker 非常适合于高密度环境以及中小型部署,而您能够用更少的资源做更多的事件。

2. 虚拟化技术和容器化技术

虚拟化技术:资源占用多、冗余步骤多、启动很慢

容器化技术:容器化技术不是模仿的一个残缺的操作系统

比拟Docker和虚拟机的不同:

  1. 传统虚拟机,虚构出硬件,运行一个残缺的操作系统,而后在这个零碎上装置和运行软件。
  2. Docker容器内的利用间接运行在宿主机的内容,容器是没有本人的内核的,也没有虚构硬件。
  3. 每个容器都是互相隔离的,每个容器都有属于本人的文件系统,互不影响。

3. Docker的根本组成

  • 镜像(image)

    docker镜像就好比是一个模版,能够通过这个模版来创立容器服务

  • 容器(container)

    Docker利用容器技术,独立运行一个或者一组利用,通过镜像来创立(目前能够把一个容器简略的了解为一个繁难的Linux零碎)

  • 仓库(repository)

    仓库就是寄存镜像的中央,例如Docker Hub

4. 装置运行Docker

  1. 确保零碎为centos7,内核方法为3以上

    [[email protected] docker]# uname -r3.10.0-1160.11.1.el7.x86_64[[email protected] docker]# cat /etc/os-releaseNAME="CentOS Linux"VERSION="7 (Core)"
  2. 卸载Docker旧版本(之前没有装置则能够跳过)

    yum remove docker \                  docker-client \                  docker-client-latest \                  docker-common \                  docker-latest \                  docker-latest-logrotate \                  docker-logrotate \                  docker-engine
  3. 下载docker所需的工具包

    sudo yum install -y yum-utils
  4. 设置下载docker的镜像仓库为阿里云

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. 更新yum软件包索引

    yum makecache fast
  6. 装置最新版的docker(docker-ce 是社区版,docker-ee 企业版)

    sudo yum install docker-ce docker-ce-cli containerd.io
  7. 启动Docker

    systemctl start docker
  8. 查看Docker版本号

    docker version

    呈现版本信息则表明装置胜利!

  9. 设置Docker开机自启

    systemctl enable docker
  10. 下载hello-world镜像进行测试

    docker run hello-world
  11. 查看hell0-world镜像是否下载胜利

    docker images
  12. 卸载Docker

    # 1. 卸载依赖yum remove docker-ce docker-ce-cli containerd.io# 2. 删除资源  . /var/lib/docker是docker的默认工作门路rm -rf /var/lib/docker

5. Docker镜像减速

  1. 进入网址https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors获取阿里云镜像减速链接

  2. 顺次执行上面四条命令

    #创立对应的目录(如果有就不须要创立)sudo mkdir -p /etc/docker#创立daemon.json文件,并写入镜像加速器地址([]中替换为下面本人获取的加速器地址)sudo tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://ppc7nwnq.mirror.aliyuncs.com"]}EOF#重启服务sudo systemctl daemon-reloadsudo systemctl restart docker

6. Docker容器运行流程

Docker为什么比VM Ware快?

  1. Docker比虚拟机更少的形象层
  2. docker利用宿主机的内核,VM须要的是Guest OS

Docker新建一个容器的时候,不须要像虚拟机一样从新加载一个操作系统内核,间接利用宿主机的操作系统,而虚拟机是须要加载Guest OS。Docker和VM的比照如下:

7. Docker常用命令

7.1 根底命令

#查看docker版本信息docker version#查看docker的零碎信息docker info#帮忙命令docker command --help

7.2 镜像命令

7.2.1 查看本地主机的所有镜像

语法:docker images

[[email protected] ~]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED         SIZEhello-world   latest    bf756fb1ae65   11 months ago   13.3kB#解释:1.REPOSITORY  镜像的仓库源2.TAG  镜像的标签3.IMAGE ID 镜像的id4.CREATED 镜像的创立工夫5.SIZE 镜像的大小# 可选参数-a/--all 列出所有镜像-q/--quiet 只显示镜像的id

7.2.2 搜寻镜像

语法:docker search

[[email protected] ~]# docker search mysqlNAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDmysql                             MySQL is a widely used, open-source relation…   10308     [OK]mariadb                           MariaDB is a community-developed fork of MyS…   3819      [OK]mysql/mysql-server                Optimized MySQL Server Docker images. Create…   754                  [OK]percona                           Percona Server is a fork of the MySQL relati…   517       [OK]centos/mysql-57-centos7           MySQL 5.7 SQL database server                   86mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   79centurylink/mysql                 Image containing mysql. Optimized to be link…   60                   [OK]#可选参数Search the Docker Hub for imagesOptions:  -f, --filter filter   Filter output based on conditions provided      --format string   Pretty-print search using a Go template      --limit int       Max number of search results (default 25)      --no-trunc        Don't truncate output            #搜寻珍藏数大于3000的镜像[[email protected] ~]# docker search mysql --filter=STARS=3000NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDmysql     MySQL is a widely used, open-source relation…   10308     [OK]mariadb   MariaDB is a community-developed fordockerk of MyS…   3819      [OK]

7.2.3 下载镜像

语法:docker pull 镜像名[:tag]

[[email protected] ~]# docker pull mysqlUsing default tag: latest            #如果不写tag默认就是latestlatest: Pulling from library/mysql6ec7b7d162b2: Pull complete          #分层下载,docker image的外围-联结文件系统fedd960d3481: Pull complete7ab947313861: Pull complete64f92f19e638: Pull complete3e80b17bff96: Pull complete014e976799f9: Pull complete59ae84fee1b3: Pull completeffe10de703ea: Pull complete657af6d90c83: Pull complete98bfb480322c: Pull complete6aa3859c4789: Pull complete1ed875d851ef: Pull completeDigest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名Status: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest  #下载起源的实在地址  #docker pull mysql等价于docker pull docker.io/library/mysql:latest#指定版本下载[[email protected] ~]# docker pull mysql:5.75.7: Pulling from library/mysql6ec7b7d162b2: Already existsfedd960d3481: Already exists7ab947313861: Already exists64f92f19e638: Already exists3e80b17bff96: Already exists014e976799f9: Already exists59ae84fee1b3: Already exists7d1da2a18e2e: Pull complete301a28b700b9: Pull complete529dc8dbeaf3: Pull completebc9d021dc13f: Pull completeDigest: sha256:c3a567d3e3ad8b05dfce401ed08f0f6bf3f3b64cc17694979d5f2e5d78e10173Status: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7

7.2.4 删除指定镜像

语法:docker rmi 镜像id

#1.删除指定的镜像id[[email protected] ~]# docker rmi -f  镜像id#2.删除多个镜像id[[email protected] ~]# docker rmi -f  镜像id 镜像id 镜像id#3.删除全副的镜像id[[email protected] ~]# docker rmi -f  $(docker images -aq)

7.2.5 打包镜像

语法:docker save 镜像名 -o 名称.tar

#打包mydocker镜像[[email protected] temp]# docker save mydocker -o mydocker.tar[[email protected] temp]# ll总用量 232992-rw-r--r-- 1 root root         0 9月  20 11:29 HelloWorld.java-rw------- 1 root root 238581760 9月  20 11:36 mydocker.tar    #打包的镜像tar包

7.2.6 载入镜像

语法:docker load -i 名称.tar

[[email protected] temp]# docker load -i mydocker.tarLoaded image: mydocker:latest

7.3 容器命令

7.3.1 拉取下载一个容器

语法:docker pull 容器名

#拉取下载centos容器docker pull centos

7.3.2 运行容器

语法:docker run [可选参数] image

#后盾运行centos容器docker run -d centos#交互方式运行centos容器docker run -it centos /bin/bash#进行退出交互容器[[email protected] /]# exit#退出但不进行交互容器Ctrl+P+Q#参数阐明--name="名字"           指定容器名字-d                     后盾形式运行-it                    应用交互方式运行,进入容器查看内容-p                     指定容器的端口(-p ip:主机端口:容器端口  配置主机端口映射到容器端口-p 主机端口:容器端口-p 容器端口)-P                     随机指定端口(大写的P)

7.3.3 查问容器

语法:docker ps

#docker ps      # 列出以后正在运行的容器-a   # 列出所有容器的运行记录-n=? # 显示最近创立的n个容器-q   # 只显示容器的编号[[email protected] ~]# docker psCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES[[email protected] ~]# docker ps -aCONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMESbca129320bb5   centos         "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago             optimistic_shternbd1b8900c547   centos         "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             cool_teslacf6adbf1b506   bf756fb1ae65   "/hello"      5 hours ago     Exited (0) 5 hours ago               optimistic_darwin

7.3.4 启动和进行容器

语法:docker command 容器id

docker start 容器id          #启动容器docker restart 容器id        #重启容器docker stop 容器id           #进行以后运行的容器docker kill 容器id           #强制进行以后容器

7.3.5 删除容器

语法:docker rm 容器id

docker rm 容器id                 #删除指定的容器,不能删除正在运行的容器,强制删除应用 rm -fdocker rm -f $(docker ps -aq)   #删除所有的容器docker ps -a -q|xargs docker rm #删除所有的容器

7.3.6 查看容器日志

语法: docker logs [参数] 容器id

#继续带工夫打印指定10条容器日志docker logs -tf --tail 10 6a9fe6a924ea#参数阐明-t 日志加工夫-f 保留打印窗口,继续打印-tail number 显示最初的number行

7.3.7 查看容器中过程信息

语法:docker top 容器id

[[email protected] bin]# docker top 6a9fe6a924eaUID                 PID                 PPID                C                   STIME               TTY                 TIME                CMDroot                12357               12337               0                   13:49               ?                   00:00:00            /bin/bash

7.3.8 查看容器的元数据

语法:docker inspect 容器id

[[email protected] bin]# docker inspect 6a9fe6a924ea[    {        "Id": "6a9fe6a924eafffd7b71ff739a5cc24203d936d2a6459ddb8ce4166a003e3a5e",        "Created": "2021-09-19T05:49:00.433068635Z",        "Path": "/bin/bash",        "Args": [],        "State": {        ......

7.3.9 进入以后正在运行的容器

语法:docker exec -it 容器id /bin/bashdocker attact 容器id

#形式一:docker exec -it 容器id /bin/bashdocker exec -it 6a9fe6a924ea /bin/bash#形式二:docker attact 容器iddocker attach 6a9fe6a924ea#两种形式区别docker exec:进入容器后会开启一个新的终端,应用`exit`退出后,容器依旧会持续运行docker attach: 进入容器正在执行的终端,应用`exit`退出后,容器也会被进行

7.3.10 容器与主机文件拷贝

从容器拷贝到主机:docker cp 容器id:容器文件门路 主机文件门路

从主机拷贝到容器:docker cp 主机文件门路 容器id:容器文件门路

文件的拷贝只有容器存在就能够,无论容器是否正在运行
#从容器中拷贝文件到主机docker cp 6a9fe6a924ea:/root/Person.java /root/#从主机拷贝文件到容器docker cp 

7.3.11 制作提交本人的镜像

  1. 启动镜像为容器
  2. 批改容器,退出本人的货色
  3. 执行上面命令将批改后的容器变为本人的镜像

    语法:docker commit -a="作者名" -m="备注" 容器id 新镜像名:版本号

    #-a为作者 -m为备注 docker commit -a="BernardoLi" -m="add webapps app" 292b149a9bcd mytomcat:1.0

7.4 Docker命令案例演示

7.4.1 部署nginx

#拉取最新版的nginx镜像docker pull nginx#运行nginx,用本机3380对应docker80端口,起名为nginx01docker run -d --name nginx01 -p 3380:80 nginx#拜访nginxcurl localhost:3380

7.4.2 部署tomcat

#运行tomcat,用本机3366对应docker8080端口,起名为tomcat02docker run -d --name tomcat02 -p 3366:8080 tomcat:9.0

8. Docker可视化面板Portainer

8.1 介绍

Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer能够轻松构建,治理和保护Docker环境。 而且完全免费,基于容器化的装置形式,不便高效部署。

官网地址:https://www.portainer.io/

8.2 装置

#间接拉取运行protainerdocker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true  portainer/portainer

8.3 应用

浏览器输出:你的外网ip:9000 (前提是你的阿里云平安组的8088端口曾经凋谢),如下是登录页面

9. Docker镜像详解

9.1 UnionFS(联结文件系统)

联结文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它反对对文件系统的批改作为一次提交来一层层的叠加,同时能够将不同目录挂载到同一个虚构文件系统下。联结文件系统是 Docker 镜像的根底。镜像能够通过分层来进行继承,基于根底镜像(没有父镜像),能够制作各种具体的利用镜像。

个性:一次同时加载多个文件系统,但从里面看起来只能看到一个文件系统。联结加载会把各层文件系统叠加起来,这样最终的文件系统会蕴含所有底层的文件和目录。

9.2 镜像加载原理

Docker的镜像理论由一层一层的文件系统组成:

bootfs(boot file system)次要蕴含bootloader和kernel。bootloader次要是疏导加载kernel,实现后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,零碎卸载bootfs。能够被不同的Linux发行版专用。

rootfs(root file system)蕴含典型Linux零碎中的/dev,/proc,/bin,/etc等规范目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,Centos等)。因为底层间接用Host的kernel,rootfs只蕴含最根本的命令,工具和程序就能够了。

所有的Docker镜像都起始于一个根底镜像层,当进行批改或减少新的内容时,就会在以后镜像层之上,创立新的容器层。容器在启动时会在镜像最外层上建设一层可读写的容器层(R/W),而镜像层是只读的(R/O)。

10. Docker容器数据卷

10.1 概述

简略来说:用来实现容器于宿主机之间数据共享

数据卷就是数据(一个文件或者文件夹)。数据卷是非凡的目录,能够绕过联结文件系统,为一个或多个容器提供拜访。

数据卷设计的目标是数据的永久化,是齐全独立于容器的生命周期,不会在容器删除时删除其挂载的数据卷,也不会存在相似垃圾收集机制,对容器援用的数据卷进行解决。

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保留下来,那么当容器删除后,数据天然也就没有了。为了能保留数据在docker中咱们应用卷。

10.2 特点

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改能够间接失效
  3. 数据卷中的更改不会蕴含在镜像的更新中
  4. 数据卷即便容器被删除也是存在的

10.3 增加数据卷

10.3.1 全门路挂载

语法:docker run [参数] -v /宿主机绝对路径目录:/容器内目录 镜像名

默认权限是可读可写,即容器对于挂载的数据卷有读写的权限,这样就可能会产生数据安全问题。

咱们能够只给容器只读的权限:docker docker run [参数] -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

这样容器就只能读取主机的数据,而不能批改主机的数据。

如果指定挂载的容器目录不存在,会主动创立。

#默认是可读可写docker run -id -v /root/test:/usr/local/tomcat/webapps tomcat#ro只读docker run -id -v /root/test:/usr/local/tomcat/webapps:ro tomcat  #rw可读可写docker run -id -v /root/test:/usr/local/tomcat/webapps:rw tomcat

10.3.2 匿名挂载和具名挂载

所谓匿名挂载(匿名卷),即在进行数据卷挂载的时候不指定宿主机的数据卷目录,-v命令之后间接跟上容器内数据卷所在的门路

而具名挂载(命名卷)即在进行数据卷挂载的时候既指定宿主机数据卷所在门路,又指定容器数据卷所在门路

具名挂载时,如果挂载的卷不存在,会主动创立

先通过上面这种命令的形式感受一下两者的区别:

#匿名挂载(匿名卷)docker run -d -p 6379:6379 --name mycentos -v /src/volume01#具名挂载(命名卷) -v 卷名:容器数据卷所在门路docker run -d -p 6379:6379 --name mycentos -v volumename:/src/volume01

除此种形式之外,咱们也能够在在dockerfile构建docker镜像的时候应用VOLUME保留字来对数据卷进行挂载,此种挂载形式是匿名挂载的,咱们能够指定一个或多个数据卷,这样只有启动了该自定义容器镜像,则会主动进行数据挂载,不会呈现遗记挂载导致数据不平安的状况。

VOLUME ["容器内数据卷门路1","容器内数据卷门路2"……]

因为匿名挂载的时候只是指定了容器内数据卷的门路,至于该容器内数据卷的门路到底和宿主机中的哪个文件进行数据挂载,能够应用上面命令进行查看:

#查看以后正在运行的镜像容器id[[email protected] / ]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES38d2810685e1        fc67f9b77899        "/bin/sh -c /bin/bash"   2 hours ago         Up 2 hours          80/tcp              focused_williams#应用 inspect 查看镜像信息[[email protected] / ]# docker inspect 38d2810685e1(这是容器id)#在弹出来的信息中找到上面的数据:"Mounts": [            {                "Type": "volume",                "Name": "040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8",                "Source": "/var/lib/docker/volumes/040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8/_data",                "Destination": "volume01",                "Driver": "local",                "Mode": "",                "RW": true,                "Propagation": ""            },            {                "Type": "volume",                "Name": "b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c",                "Source": "/var/lib/docker/volumes/b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c/_data",                "Destination": "volume02",                "Driver": "local",                "Mode": "",                "RW": true,                "Propagation": ""            }        ],        ......

从下面的 Mounts 中能够看到 Destination 和 Source 别离就是 容器内的数据卷 和 宿主机内的容器卷

匿名卷和命名卷的区别?

命名卷在用过一次之后当前挂载容器的时候还是能够持续应用,所以个别在须要保留数据的时候应用命名卷的形式

匿名卷则是随着容器的建设而建设,随着容器的敞开而沦亡。匿名卷个别用来存储无关痛痒的数据。

10.4 查看数据卷

10.4.1 查看数据卷列表

语法:docker volume ls

[[email protected] temp]# docker volume lsDRIVER    VOLUME NAMElocal     4e5460a6a07395bf7c405aa5bbfbab8a11569380505eab3bdfc61f11f5f8b7f4local     08a0de95cb8e7f5f0e6c549ac1038049a283fd39d6084f0b5fce2a4b0f1085d0local     64f7a5e1ca5aa70671db2bad270e436878d7905c35edbf11ab55e357d334808clocal     eb12d02c5b348a1b8ac64933e0801ca82f4313ed31bdb98d3591631c64e6001alocal     fb389ae87ffd75cdf9a2823d75ee1e6fddf66cbbe695fbd6113ec2e1b9b11a2f

10.4.2 创立指定数据卷

语法:docker volume create 数据卷名

[[email protected] temp]# docker volume create goodgood

10.4.3 查看指定数据卷信息

语法:docker volume inspect 数据卷名

[[email protected] temp]# docker volume inspect 4e5460a6a07395bf7c405aa5bbfbab8a11569380505eab3bdfc61f11f5f8b7f4[    {        "CreatedAt": "2021-09-19T17:27:03+08:00",        "Driver": "local",        "Labels": null,        "Mountpoint": "/var/lib/docker/volumes/4e5460a6a07395bf7c405aa5bbfbab8a11569380505eab3bdfc61f11f5f8b7f4/_data",        "Name": "4e5460a6a07395bf7c405aa5bbfbab8a11569380505eab3bdfc61f11f5f8b7f4",        "Options": null,        "Scope": "local"    }]

10.4.4 删除所有未被应用的数据卷

语法:docker volume prune

[[email protected] temp]# docker volume pruneWARNING! This will remove all local volumes not used by at least one container.Are you sure you want to continue? [y/N] yDeleted Volumes:64f7a5e1ca5aa70671db2bad270e436878d7905c35edbf11ab55e357d334808ceb12d02c5b348a1b8ac64933e0801ca82f4313ed31bdb98d3591631c64e6001afb389ae87ffd75cdf9a2823d75ee1e6fddf66cbbe695fbd6113ec2e1b9b11a2ftemp08a0de95cb8e7f5f0e6c549ac1038049a283fd39d6084f0b5fce2a4b0f1085d04e5460a6a07395bf7c405aa5bbfbab8a11569380505eab3bdfc61f11f5f8b7f4Total reclaimed space: 420.2kB

11. Dockerfile

11.2 什么是Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容蕴含了一条条构建镜像所需的指令和阐明。

11.3 疾速入门

这里仅解说如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只有晓得构建的流程即可。

  1. 创立并编写Dockerfile文件

    #来自centosFROM    centos    #进入/bin/bash目录CMD    /bin/bash#输入hello DockerfileCMD    echo Hello Dockerfile    
  2. 构建镜像

    docker build -f ./Dockerfile -t mydocker .
  3. 运行镜像

    [[email protected] test]# docker run mydockerHello Dockerfile

11.4 Dockerfile命令

保留字作用
FROM指定根底镜像
MAINTAINER镜像维护者姓名与邮箱地址(官网已不举荐应用)
RUN构建镜像时须要运行的指令
EXPOSE裸露的端口号
WORKDIR指定在创立容器后,终端默认登录进来的工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像(且会主动解决URL和解压tar包)
COPY相似于ADD,拷贝文件和目录到镜像中
将从构建高低目录中<原门路>的文件/目录复制到新的一层的镜像内的<指标门路>地位
VOLUME挂载匿名容器数据卷,所有启动此镜像的容器都会被主动挂载此数据卷
CMD指定一个容器启动时要运行的命令
Dockerfile中能够有多个CMD指令,但只有最初一个失效,CMD会被docker run之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令
成果与CMD差不多,区别是多个ENTRYPOINT会同时失效

11.5 构建实例演示(运行本人我的项目的springboot Jar包)

  1. 将springboot我的项目的Jar包上传的与dockerfile文件同级目录中(目录如果有其余无关文件,应用.dockerignore文件来设置疏忽)
  2. 编写dockerfile文件

    FROM openjdk:8-jdk WORKDIR /appADD 11-springboot-ssm-1.0.0.jar app.jarEXPOSE 8080ENTRYPOINT ["java","-jar"]CMD ["app.jar"]
  3. 构建镜像

    docker build -t springboot:1.0 .
  4. 运行镜像

    因为这个我的项目应用了mysql服务,所以咱们须要提前在docker 容器中运行mysql服务
#启动mysql容器docker run -itd --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=PassWord -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql/ mysql:5.7.35#启动springboot Jar包镜像docker run -d --name springboot -p 8081:8080 springboot:1.0
  1. 近程拜访springboot我的项目页面(关上防火墙端口),浏览器输出http://81.68.182.114:8081/user/queryUserById

12. 容器网络配置

12.1 概述

当 Docker 启动时,会主动在主机上创立一个 docker0 虚构网桥,实际上是 Linux 的一个 bridge,能够了解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机调配一个本地未占用的公有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比方典型的 172.17.42.1,掩码为 255.255.0.0。尔后启动的容器内的网口也会主动调配一个同一网段(172.17.0.0/16)的地址。

当创立一个 Docker 容器的时候,同时会创立了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也能够收到雷同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 结尾(例如 vethAQI2QT)。通过这种形式,主机能够跟容器通信,容器之间也能够互相通信。Docker 就创立了在主机和所有容器之间一个虚构共享网络。

12.2 命令

12.2.1 查看所有网桥

语法:docker network ls

[[email protected] test]# docker network lsNETWORK ID     NAME      DRIVER    SCOPE7e968f81f5d8   bridge    bridge    local#容器默认指向的网桥aea0bf59c9aa   host      host      local1ef8c4f65dec   none      null      local

12.2.2 创立自定义网桥

语法:docker network create 网桥名称

相当于docker network create -d bridge 网桥名称

#创立名为jason的网桥[[email protected] test]# docker network create jason

12.2.3 运行容器指定网桥

语法: docker run [参数] --network 网桥名 镜像名/镜像id

# 应用自定义网桥运行容器[[email protected] test]#docker run -d --name tomcat01 -p 8081:8080 --network jason tomcat:9.0# 应用默认网桥运行容器[[email protected] test]#docker run -d --name tomcat02 -p 8082:8080 tomcat:9.0
指定网桥之前,须要确保网桥曾经被创立

12.2.4 容器之间网络通信

  1. 查看须要通信的容器的IPAddress地址

    [[email protected] test]# docker inspect tomcat01......"Networks": {    "jason": {        "IPAMConfig": null,        "Links": null,        "Aliases": [            "8ff441759295"        ],        "NetworkID": "a4a13e686497e64c5d248d964234d69a0646c40a4844ac8a6c84d9d1f1469013",        "EndpointID": "d453ff59c434221c5e5d865482f17ad872c4a9a3773193c23eca16c3709c8902",        "Gateway": "172.18.0.1",    #理论主机调配挂载的IP        "IPAddress": "172.18.0.2",#容器内调配挂载的IP......
  2. 应用查问到的IPAddress地址于指标容器进行网络通信(前提要进去容器)

    [email protected]:/usr/local/tomcat# curl http://172.18.0.2:8080
    如果两个相互通信的容器在一个网桥中,则还能够间接应用容器名来代替IPAddress

12.2.5 删除指定网桥

语法:docker network rm 网桥名

#删除名为bernardo的网桥[[email protected] test]# docker network rm bernardo

12.2.5 查看网桥配置信息

语法:docker inspect 网桥名

#查看名为jason的网桥配置信息[[email protected] test]# docker inspect jason

13. 应用Docker装置常见服务

13.1 应用Docker装置MySQL

  1. 进入docker hub官网搜寻MySQL,找到对应的版本

  2. 拉取MySQL镜像

    [[email protected] ~]# docker pull mysql:5.7.355.7.35: Pulling from library/mysqla330b6cecb98: Pull complete......51a9a9b4ef36: Pull completeDigest: sha256:d9b934cdf6826629f8d02ea01f28b2c4ddb1ae27c32664b14867324b3e5e1291Status: Downloaded newer image for mysql:5.7.35docker.io/library/mysql:5.7.35
  3. 运行MySQL容器,后盾运行、指定容器名字、映射端口、指定root用户明码、挂载数据卷、批改配置文件启动

    [[email protected] ~]# docker run -itd --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=PassWord -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql/ mysql:5.7.355137dc9337af350c26e9605a7c07651e80eca7db3c4dd130e8bf8f17b4e5ceeb

    局部配置信息,须要在咱们批改后,重启MySQL容器才能够失效

    又有局部配置信息,如端口,须要咱们从新创立一个容器来使其失效

  4. 近程连贯Docker中的MySQL服务

    须要提前关上装置Docker服务器的防火墙和安全策略组
    ❯ mysql -uroot -p -h81.68.182.114 -P3307Enter password:Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 5Server version: 5.7.35 MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>

13.2 应用Docker装置Tomcat

  1. 进入docker hub官网搜寻Tomcat,找到对应的版本

  2. 拉取Tomcat镜像

    [[email protected] ~]# docker pull tomcat:9.0-jre89.0-jre8: Pulling from library/tomcat955615a668ce: Pull complete......daf564b3b156: Pull completeDigest: sha256:10dcb321d65b8ab6d10a8e8b083392e04bcbfef1df1af15572f41c789c669e2aStatus: Downloaded newer image for tomcat:9.0-jre8docker.io/library/tomcat:9.0-jre8
  3. 运行Tomcat容器,后盾运行、指定容器名字、映射端口、挂载数据卷、批改配置文件启动

    [[email protected] ~]# docker run -d --name tomcat -p 8081:8080 -v tomcatapps:/usr/local/tomcat/webapps -v tomcatconfs:/usr/local/tomcat/conf tomcat:9.0-jre8
  4. 近程拜访Docker中的Tomcat服务

    须要提前关上装置Docker服务器的防火墙和安全策略组

    在浏览器输出http://81.68.182.114:8081/test/test.html(页面是我提前退出的),查看成果

13.3 应用Docker装置Redis

  1. 进入docker hub官网搜寻Redis,找到对应的版本

  2. 拉取Redis镜像

    [[email protected] test]# docker pull redis:5.0.135.0.13: Pulling from library/redisa330b6cecb98: Already exists......fe842fc77a96: Pull completeDigest: sha256:6aa31467e60f57a15427ab847752cc075d3218f70ba5fb6c913c4b9c09b61c95Status: Downloaded newer image for redis:5.0.13docker.io/library/redis:5.0.13
  3. 运行Redis容器,后盾运行、映射端口、挂载数据卷、指定容器名字、长久化

    docker run -d -p 6380:6379 -v redisdata:/data --name redis redis:5.0.13 redis-server --appendonly yes

    留神点:

    • 在指定redis镜像名,须要加上须要启动的命令服务器redis-server,否则redis不算齐全启动
    • --appendonly yes示意开启长久化,默认长久化的文件存储到了容器中的/data目录中,所有咱们能够挂载此目录,将数据同步到主机上。

    运行Redis容器,后盾运行、映射端口、挂载数据卷、指定容器名字、长久化、以指定配置文件启动

    docker run -d -p 6380:6380 -v redisdata:/data -v /root/myredis/conf:/usr/local/etc/redis --name redis redis:5.0.13 redis-server /usr/local/etc/redis/redis.conf --appendonly yes 

    如果须要以自定义配置文件启动Redis,须要咱们本人手动下载redis.conf文件到本机/root/myredis/conf门路中(与下面命令对应即可),并挂载到容器的/usr/local/etc/redis/目录中,因为Redis的Docker镜像是没有conf配置文件的。最初启动时,还要指定咱们本人的配置文件门路/usr/local/etc/redis/redis.conf,来通过配置文件启动redis

    这里为了测试,咱们在配置文件中将redis启动端口改为了6380,并且批改protected-mode nobind 0.0.0.0

  4. 近程拜访Docker中的Redis服务

    须要提前关上装置Docker服务器的防火墙和安全策略组
    ❯ redis-cli -h 81.68.182.114 -p 638081.68.182.114:6380>

13.4 应用Docker装置Nginx

  1. 进入docker hub官网搜寻Redis,找到对应的版本

  2. 拉取Nginx镜像

    [[email protected] conf]# docker pull nginx:1.12.11.12.1: Pulling from library/nginxbc95e04b23c0: Pull complete37e52b416fab: Pull complete641ecf99554d: Pull completeDigest: sha256:d92bebac6f0fcf80804744aa2ce630bb293cbb8d25bfa4e8bf3d6de1a08166b7Status: Downloaded newer image for nginx:1.12.1docker.io/library/nginx:1.12.1
  3. 运行Nginx容器,后盾运行、映射端口、指定容器名字

    docker run -d --name nginx -p 81:80 nginx:1.12.1
  4. 近程拜访Docker中的Nginx服务

    须要提前关上装置Docker服务器的防火墙和安全策略组

    浏览器输出http://81.68.182.114:81/

13.5 应用Docker装置Elasticsearch

  1. 进入docker hub官网搜寻Elasticsearch,找到对应的版本

  2. 拉取Elasticsearch镜像

    [[email protected] ~]# docker pull elasticsearch:6.8.0
  3. 运行Elasticsearch容器

    docker run -d --name elasticsearch \    -p 9200:9200 \    -p 9300:9300 \    -v esdata:/usr/share/elasticsearch/data \    -v esconfig:/usr/share/elasticsearch/config \    -v esplugins:/usr/share/elasticsearch/plugins \    --net es \    elasticsearch:6.8.0 

    -d # 后盾运行

    --name elasticsearch #指定容器名字

    -p 9200:9200 #映射web端口

    -p 9300:9300 #映射Java端口

    -v esdata:/usr/share/elasticsearch/data #挂载长久化数据

    -v esconfig:/usr/share/elasticsearch/config #挂载配置文件

    -v esplugins:/usr/share/elasticsearch/plugins #挂载插件

    --net es #指定网桥

    elasticsearch:6.8.0 #抉择镜像

    正告:WARNING: IPv4 forwarding is disabled. Networking will not work

    解决办法:

    1. 批改/etc/sysctl.conf文件,文件最初增加上面内容

      net.ipv4.ip_forward=1
    2. 重启network服务

      systemctl restart network
    3. 查看是否批改胜利

      sysctl net.ipv4.ip_forward

      若返回net.ipv4.ip_forward = 1,示意胜利

    4. 重启容器即可
  4. 装置插件elasticsearch-analysis-ik(版本要与elasticsearch保持一致)

    1. 找到容器中es插件目录`/usr/share/elasticsearch/plugins`挂载的本机卷目录    {      "Type": "volume",      "Name": "esplugins",      "Source": "/var/lib/docker/volumes/esplugins/_data", #本机卷挂载目录      "Destination": "/usr/share/elasticsearch/plugins",      "Driver": "local",      "Mode": "z",      "RW": true,      "Propagation": ""  }2. 上传`elasticsearch-analysis-ik-6.8.0.zip`文件到`/var/lib/docker/volumes/esplugins/_data`目录中3. 进入`/var/lib/docker/volumes/esplugins/_data`目录,创立一个`ik`目录,将`elasticsearch-analysis-ik-6.8.0.zip`解压到`ik`目录中4. 重启启动es的docker容器,应用`docker logs -f elasticsearch`,能够看`loaded plugin [analysis-ik]`,插件即装置胜利
  5. 近程拜访ES,浏览器输出http://81.68.182.114:9200/

  6. 装置kibana(版本要与elasticsearch保持一致)

    #拉取kibana镜像docker pull kibana:6.8.0#连贯es,运行kibanadocker run -d --name kibana -p 5601:5601 --net es -e ELASTICSEARCH_URL=http://172.23.0.2:9200 kibana:6.8.0> -e ELASTICSEARCH_URL值通过查看elasticsearch挂载的网桥的ipaddress地址失去(当然kibana也要与elasticsearch挂载到同一网桥上)> docker inspect elasticsearch> "Networks": {                "es": {                    "IPAMConfig": null,                    "Links": null,                    "Aliases": [                        "01c1faa01c17"                    ],                    "NetworkID": "b46c192a40eb534a59006ca5f2815bfc1220bd83a15c0cb0ac5554a8f19b09bc",                    "EndpointID": "1297e13dce251b386a029dc003d01f15dc296e1956c03d141a16dc7c0c21d3ba",                    "Gateway": "172.23.0.1",                    "IPAddress": "172.23.0.2", #这里就是-e ELASTICSEARCH_URL的值                    "IPPrefixLen": 16,                    "IPv6Gateway": "",                    "GlobalIPv6Address": "",                    "GlobalIPv6PrefixLen": 0,                    "MacAddress": "02:42:ac:17:00:02",                    "DriverOpts": null                }#也能够通过配置文件批准连贯es,运行kibanadocker run -d --name kibana -p 5601:5601 --net es -v kibanaconf:/usr/share/kibana/config kibana:6.8.0> 首先运行一次容器,而后进入卷`kibanaconf`对应的目录中找到`kibana.yml`配置文件,将`elasticsearch.hosts`值为`http://172.23.0.2:9200`> 最初重新启动容器即可
  7. 近程拜访kibana,浏览器输出http://81.68.182.114:5601

14. Docker-compose

14.1 下载Docker-compose

下载Docker-compose

wget -c https://github.com/docker/compose/releases/download/1.25.5/docker-compose-Linux-x86_64

14.2 装置Docker-compose

docker-compose-Linux-x86_64挪动到usr/local/bin目录下,改名,并赋予执行权限

cp docker-compose-Linux-x86_64 /usr/local/bin/mv docker-compose-Linux-x86_64 docker-composechmod +x /usr/local/bin/docker-compose

测试是否装置胜利

[[email protected] bin]# docker-compose -vdocker-compose version 1.25.5, build 8a1c60f6

14.3 运行Docker-compose

创立编写一个docker-compose.yml文件

version: "3.0"services:  tomcat: #服务名惟一    image: tomcat:9.0-jre8 #指定镜像    ports:       - 8083:8080  tomcat02:     image: tomcat:9.0-jre8     ports:      - 8084:8080

docker-compose.yml文件同级目录中执行上面命令启动Docker-compose

docker-compose up

14.4 模版指令

14.4.1 docker-compose.yml模版文件

上面的docker-compose.yml文件共启动了四个服务——两个tomcat、一个mysql、一个redis

version: "3.8" #指定docker-compose版本services:  tomcat01: #服务名称    container_name: tomcat01 #指定容器名称 --name    image: tomcat:9.0-jre8 #指定应用的镜像    ports: #映射端口 -p      - "8084:8080"    volumes: #挂载数据卷 -v      - tomcatwebapps01:/usr/local/tomcat/webapps #这里的分号处不能用空格    networks: #指定网桥 --network      - hello    depends_on: #指定此服务在哪些服务后启动      - mysql #写的是服务名称      - redis    healthcheck: #心跳查看,避免服务假死(哪个服务须要,就增加此条目,不须要不增加)      test: [ "CMD", "curl", "-f", "http://localhost" ]      interval: 1m30s      timeout: 10s      retries: 3      start_period: 40s    #sysctls: #配置容器内核参数,在某些容器启动失败时应用进行配置(可选,因为tomcat没有这个参数,我就正文了)      #- net.core.somaxconn=1024      #- net.ipv4.tcp_syncookies=0    ulimits: #批改容器的过程数限度,也是在某些容器启动失败时应用进行配置(可选)      nproc: 65535      nofile:          soft: 20000          hard: 40000  tomcat02: #服务名称    container_name: tomcat02 #指定容器名称 --name    image: tomcat:9.0-jre8 #指定应用的镜像    ports: #映射端口 -p      - "8085:8080"    volumes: #挂载数据卷 -v      - tomcatwebapp02:/usr/local/tomcat/webapps #这里的分号处不能用空格    networks: #指定网桥 --network      - hello  mysql: #服务名称    container_name: mysql01 #容器名称 --name    image: mysql:5.7.35 #指定应用的镜像    ports: #映射端口 -p      - "3308:3306"    volumes: #挂载数据卷 -v      - mysqldata:/var/lib/mysql #长久化数据库数据      - mysqlconfig:/etc/mysql/ #挂载配置文件    #environment: #配置环境变量      #- MYSQL_ROOT_PASSWORD=PassWord #间接设置root用户明码    env_file: #配置环境变量      - /root/test/MYSQL_ROOT_PASSWORD.env #读取指定门路配置文件来设置root用户明码    networks: #挂载网桥 --net      - hello  redis: #服务名称    container_name: redis01 #容器名称 --name    image: redis:5.0.13 #指定应用的镜像    ports: #映射端口 -p      - "6380:6379"    volumes: #挂载数据卷 -v      - redisdata:/data #长久化数据库数据    networks:      - hello    command: "redis-server --appendonly yes" #启动容器后执行的命令volumes: #创立下面volumes标签应用的数据卷  tomcatwebapps01: #申明须要创立的数据卷的名称(compose会主动创立改名的数据卷,但会退出我的项目名)    external: #应用自定义卷名,不应用下面主动创立的数据卷名      true #true示意应用自定义的卷名,然而须要提前手动创立好  tomcatwebapp02:  mysqldata:  mysqlconfig:  redisdata:networks: #创立下面networks标签应用到的网桥  hello: #申明须要创立忙的网桥名称,默认创立的就是bridge    external: #应用内部指定网桥(如果不须要应用指定网桥,则不须要写)      false #true示意确定应用内部指定网桥,但网桥必须提前手动创立好

14.4.2 Image

作用:

指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取这个镜像。

示例:

version: "3.2"services:  tomcat:    image: tomcat:8.0-jre8

14.4.3 build

作用:

该命令和image有殊途同归之妙,如果应用image,个别是先编辑Dockerfile,而后再将Dockerfile手动构建成镜像到本地库,最初再应用image引入本地库中的镜像。

应用了build,编辑完Dockfile之后就不须要手动构建成镜像了,Compose帮忙咱们参照Dockerfile主动构建镜像到本地库,再引入本地库中的镜像。

示例:

version: "3.2"services:  postilhub:    build:      # 上下文目录(相对路径)      context: ./postilhub      # Dockerfile文件名(默认为Dockerfile)      dockerfile: Dockerfile    # 镜像打包后运行的容器名    container_name: postilhub    # 映射容器内9000端口    ports:       - "9000:9000"    # 该服务依赖于tomcat服务    depends_on: "tomcat"  tomcat:    image: tomcat:8.0-jre8

14.4.4 ports

作用:

裸露端口信息。

同时指定宿主机端口和容器端口(HOST : CONTAINER格局),或者仅仅指定容器的端口(宿主将会随机抉择端口)。

相当于 -p

当应用HOST:CONTAINER格局来映射接口时,如果你应用的容器端口小于60并且没放到引号里,可能会失去谬误后果,因为YAML会主动解析xx:yy这种数字格局为60进制。为避免出现这种问题,倡议数字串都采纳引号包起来的字符串格局.

示例

version: "3.2"services:  tomcat01:    image: tomcat:8.0-jre8      ports:      - "8080:8080"  tomcat02:    image: tomcat:8.0-jre8      ports:    - "8081:8080"    - "5672:5672"

14.4.5 volumes

作用:

设置数据卷挂载门路," : "前能够设置为宿主机门路(HOT : CONTAINER)或者数据卷名称(VOLUME : CONTAINER),并且最初还能够设置拜访模式(HOST : CONTAINER : ro),该指令中所有门路反对相对路径。

相当于 -v

示例:

version: "3.2"services:  tomcat:    image: tomcat:8.0-jre8    volumes:      - /app/postilhub:/usr/local/tomcat/webapps

下面是应用宿主机门路来映射的,如果应用数据卷名称映射,如下

version: "3.2"services:  tomcat:    image: tomcat:8.0-jre8    volumes:      - postilhub:/usr/local/tomcat/webapps      # 申明            volumes:  postilhub:

数据卷名称shampooApp必须要独自申明,然而数据卷名称和咱们指定的数据卷名称并不一样,Compose首先会看 docker_compose.yml 文件在哪个门路中,比方在 /home 目录中,那么Compose就会 docker_compose.yml 所在目录名和自定义数据卷名称组合起来:shampoo_postilhub。

如果想不加目录名,能够增加如下配置:

version: "3.2"services:  tomcat:    image: tomcat:8.0-jre8    volumes:      - postilhub:/usr/local/tomcat/webapps            # 申明数据卷        volumes:  postilhub:    # 是否应用自定义数据卷名    external:      true

然而这种设置Compose就不会给咱们主动创立数据卷了,咱们须要应用如下命令,手动创立数据卷,再去启动Project。

docker volume create postilhub

14.4.6 networks

作用:

配置容器连贯网桥,不配置默认就是bridge网桥。

相当于 --network

示例:

version: "3.2"services:  tomcat01:    image: tomcat:8.0-jre8    # 指定tomcat01服务应用postilhub网桥    networks:      - postilhub  tomcat02:    image: tomcat:8.0-jre8    # 指定tomcat02服务应用postilhub网桥    networks:      - postilhub            # 申明网桥networks:  postilhub:

该网桥创立时,网桥名也是docker_compose.yml 所在目录名和自定义网桥名称的组合。

如果想不加目录名,能够增加如下配置:

version: "3.2"services:  tomcat01:    image: tomcat:8.0-jre8    # 指定tomcat01服务应用postilhub网桥    networks:      - postilhub  tomcat02:    image: tomcat:8.0-jre8    # 指定tomcat02服务应用postilhub网桥    networks:      - postilhub            # 申明网桥networks:  postilhub:    # 是否应用自定义数据卷名    external:      true

然而这种设置Compose就不会给咱们主动创立网桥了,咱们须要应用如下命令,手动创立网桥,再去启动Project。

docker network create -d bridge postilhub

14.4.7 container_name

作用:

指定容器名称。

相当于 --name

示例:

version: "3.2"services:  tomcat01:    container_name: tomcat01    image: tomcat:8.0-jre8  tomcat02:    container_name: tomcat02    image: tomcat:8.0-jre8            # 申明网桥networks:  postilhub:

14.4.8 environment

作用:

设置环境变量。你能够应用数组或字典两种格局。

相当于 -e

示例:

version: "3.2"services:  mysql:    container_name: mysql    image: mysql:8.0    environment:      - MYSQL_ROOT_PASSWORD=123456

下面应用数组示意,也能够应用字典示意:

version: "3.2"services:  mysql:    container_name: mysql    image: mysql:8.0    environment:      MYSQL_ROOT_PASSWORD: 123456

14.4.9 env_file

作用:

从文件中获取环境变量,能够为独自的文件门路或文件门路列表。

示例:

依照之前 environment 命令的配置

version: "3.2"services:  mysql:    container_name: mysql    image: mysql:8.0    # environment:    # - MYSQL_ROOT_PASSWORD=123456    env_file:      - ./mysql.env

这些明码都属于敏感信息,不应该放在 docker-compose.yml 中明文配置。

docker-compose.yml 目录中创立环境变量配置文件 mysql.env

Docker Compose中创立的配置文件必须以 env 结尾,文件中必须遵循 key=value 的格局,同时反对 # 正文。
MYSQL_ROOT_PASSWORD=123456

14.4.10 command

作用:

笼罩容器启动后默认执行的命令。

示例:

version: "3.2"services:  redis:    image: redis:5.0.10      command: "redis-server --appendonly yes"

等价于:

docker run redis:5.0.10 redis-server --appendonly yes

14.4.11 depends_on

作用:

解决容器的依赖、启动先后的问题。

示例:

version: "3.2"services:  postilhub:    image: postilhub:01    depneds_on:      - mysql      - redis  mysql:    image: mysql:8.0  redis:    image: redis:5.0.10        

以上配置示意postilhub服务依赖于mysql和redis服务,postilhub会在mysql和redis我的项目启动到肯定水平后再启动(不是在mysql和redis服务齐全启动时才启动)。

depends_on配置的是服务名,不是容器名(container_name)。

依赖能够有级联效应,比方A依赖于B,B依赖于C,那么A也依赖于C。

14.4.12 healthcheck

作用:

心跳检测,通过命令查看容器是否衰弱运行。

示例:

version: "3.2"services:  postilhub:    image: postilhub:1.0    # 对postilhub服务做心跳检测    healthcheck:        # 向以后Docker引擎发curl申请      test: [ "CMD", "curl", "-f", "http://localhost" ]      # 规定响应工夫      interval: 1m30s      # 超时工夫      timeout: 10s      # 重试次数      retries: 3
如果部署的是近程Docker,须要将localhost改为近程Docker的IP。

14.4.13 sysctls

作用:

配置容器内核参数。

示例:

并不是必须配置,有些服务启动受容器内操作系统参数限度可能会无奈启动,必须通过批改容器中参数能力启动(例如ES)。

version: "3.2"services:  postilhub:    image: postilhub:1.0    # 对运行postilhub服务的容器做零碎内核配置    sysctls:      - net.core.somaxconn=1024       - net.ipv4.tcp_syncookies=0 

14.4.14 ulimits

作用:

指定容器运行的过程数。

示例:

并不是必须配置,依据某些非凡服务进行配置。

version: "3.2"services:  postilhub:    image: postilhub:1.0    # 对运行postilhub服务的容器做过程数配置    ulimits:      nproc: 65535      nofile:        soft: 20000        hard: 40000

14.4.15 文件结尾版本定义的问题

docker-composedocker的版本对应关系如下图:

14.4.16 healthcheck报错问题

须要将docker-compose.yml文件结尾的version指定为3.8

14.5 Compose指令

docker-compose.yml 文件编辑结束后运行的指令,作用对象是Compose中的Project,也就是说Project中的所有Services都会受到影响。

14.5.1 up

作用: 启动Project的所有Service。

示例:

启动所有Service。

docker-compose up

该命令还能够启动若干个Service,必须传入Service名

docker-compose up 服务名1 服务名2 ...

默认状况,docker-compose up 启动的容器都在前台,如果想要后盾启动(Ctrl + C 进行所有容器)

docker-compose up -d

14.5.2 down

作用: 进行Project的所有Service,同时移除由模板文件主动创立的网桥(external创立的内部网桥不会被移除),然而不会移除数据卷。

示例:

进行所有Service。

docker-compose down

14.5.3 exec

作用: 进入Project中某个Service所在的容器。

示例:

docker-compose exec 服务名

14.5.4 ps

作用: 列出Project中目前的所有容器。

示例:

docker-compose ps

14.5.5 restart

作用: 重启Project中的所有Service。

示例:

docker-compose restart

该命令还能够重启若干个Service,必须传入Service名

docker-compose restart 服务名1 服务名2 ...

14.5.6 rm

作用: 删除Project中的所有Service。

示例:

docker-compose rm

该命令还能够删除若干个Service,必须传入Service名

docker-compose rm 服务名1 服务名2 ...

如果须要强制删除

docker-compose rm -f 服务名1 服务名2 ...

如果须要连带数据卷一起删除

docker-compose rm -v 服务名1 服务名2 ...

14.5.7 stop

作用: 敞开Project中的所有Service,仅仅是敞开,不会删除Service或者网桥。

示例:

docker-compose stop

该命令还能够敞开若干个Service,必须传入Service名

docker-compose stop 服务名1 服务名2 ...

14.5.8 top

作用: 查看Project中各个Service容器内运行的过程。

示例:

docker-compose top

该命令还能够查看若干个Service容器,必须传入Service名

docker-compose top 服务名1 服务名2 ...

14.5.9 pause

作用: 暂停Project中所有Service,应用ps会查看到该Service的State是pause而不是up或者down。

示例:

docker-compose pause

该命令还能够暂停若干个Service,必须传入Service名

docker-compose pause 服务名1 服务名2 ...

14.5.10 unpause

作用: 复原暂停Project中所有Service。

示例:

docker-compose unpause

该命令还能够暂停复原若干个Service,必须传入Service名

docker-compose unpause 服务名1 服务名2 ...

14.5.11 logs

作用: 查看Project中所有Service的日志。

示例:

docker-compose logs

该命令还能够查看若干个Service的日志,必须传入Service名

docker-compose logs 服务名1 服务名2 ...