乐趣区

关于docker:Docker入门学习

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 -r
    3.10.0-1160.11.1.el7.x86_64
    
    [[email protected] docker]# cat /etc/os-release
    NAME="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-reload
    sudo 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 images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   11 months ago   13.3kB

#解释:
1.REPOSITORY  镜像的仓库源

2.TAG  镜像的标签

3.IMAGE ID 镜像的 id

4.CREATED 镜像的创立工夫

5.SIZE 镜像的大小

# 可选参数
-a/--all 列出所有镜像

-q/--quiet 只显示镜像的 id

7.2.2 搜寻镜像

语法:docker search

[[email protected] ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             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                   86
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   79
centurylink/mysql                 Image containing mysql. Optimized to be link…   60                   [OK]


#可选参数
Search the Docker Hub for images

Options:
  -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=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     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 mysql
Using default tag: latest            #如果不写 tag 默认就是 latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete          #分层下载,docker image 的外围 - 联结文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #下载起源的实在地址  #docker pull mysql 等价于 docker pull docker.io/library/mysql:latest

#指定版本下载
[[email protected] ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec7b7d162b2: Already exists
fedd960d3481: Already exists
7ab947313861: Already exists
64f92f19e638: Already exists
3e80b17bff96: Already exists
014e976799f9: Already exists
59ae84fee1b3: Already exists
7d1da2a18e2e: Pull complete
301a28b700b9: Pull complete
529dc8dbeaf3: Pull complete
bc9d021dc13f: Pull complete
Digest: sha256:c3a567d3e3ad8b05dfce401ed08f0f6bf3f3b64cc17694979d5f2e5d78e10173
Status: Downloaded newer image for mysql:5.7
docker.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.tar
Loaded 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 ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[[email protected] ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
bca129320bb5   centos         "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago             optimistic_shtern
bd1b8900c547   centos         "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             cool_tesla
cf6adbf1b506   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 -f
docker 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 6a9fe6a924ea
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                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/bash
docker exec -it 6a9fe6a924ea /bin/bash

#形式二:docker attact 容器 id
docker 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 端口,起名为 nginx01
docker run -d --name nginx01 -p 3380:80 nginx

#拜访 nginx
curl localhost:3380

7.4.2 部署 tomcat

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

8. Docker 可视化面板 Portainer

8.1 介绍

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

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

8.2 装置

# 间接拉取运行 protainer
docker 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 ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
38d2810685e1        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 ls
DRIVER    VOLUME NAME
local     4e5460a6a07395bf7c405aa5bbfbab8a11569380505eab3bdfc61f11f5f8b7f4
local     08a0de95cb8e7f5f0e6c549ac1038049a283fd39d6084f0b5fce2a4b0f1085d0
local     64f7a5e1ca5aa70671db2bad270e436878d7905c35edbf11ab55e357d334808c
local     eb12d02c5b348a1b8ac64933e0801ca82f4313ed31bdb98d3591631c64e6001a
local     fb389ae87ffd75cdf9a2823d75ee1e6fddf66cbbe695fbd6113ec2e1b9b11a2f

10.4.2 创立指定数据卷

语法:docker volume create 数据卷名

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

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 prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
64f7a5e1ca5aa70671db2bad270e436878d7905c35edbf11ab55e357d334808c
eb12d02c5b348a1b8ac64933e0801ca82f4313ed31bdb98d3591631c64e6001a
fb389ae87ffd75cdf9a2823d75ee1e6fddf66cbbe695fbd6113ec2e1b9b11a2f
temp
08a0de95cb8e7f5f0e6c549ac1038049a283fd39d6084f0b5fce2a4b0f1085d0
4e5460a6a07395bf7c405aa5bbfbab8a11569380505eab3bdfc61f11f5f8b7f4

Total reclaimed space: 420.2kB

11. Dockerfile

11.2 什么是 Dockerfile?

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

11.3 疾速入门

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

  1. 创立并编写 Dockerfile 文件

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

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

    [[email protected] test]# docker run mydocker
    Hello 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 /app
    ADD 11-springboot-ssm-1.0.0.jar app.jar
    EXPOSE 8080
    ENTRYPOINT ["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 ls
NETWORK ID     NAME      DRIVER    SCOPE
7e968f81f5d8   bridge    bridge    local# 容器默认指向的网桥
aea0bf59c9aa   host      host      local
1ef8c4f65dec   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.35
    5.7.35: Pulling from library/mysql
    a330b6cecb98: Pull complete
    ......
    51a9a9b4ef36: Pull complete
    Digest: sha256:d9b934cdf6826629f8d02ea01f28b2c4ddb1ae27c32664b14867324b3e5e1291
    Status: Downloaded newer image for mysql:5.7.35
    docker.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.35
    5137dc9337af350c26e9605a7c07651e80eca7db3c4dd130e8bf8f17b4e5ceeb

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

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

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

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

    ❯ mysql -uroot -p -h81.68.182.114 -P3307
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5
    Server 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 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>

13.2 应用 Docker 装置 Tomcat

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

  2. 拉取 Tomcat 镜像

    [[email protected] ~]# docker pull tomcat:9.0-jre8
    9.0-jre8: Pulling from library/tomcat
    955615a668ce: Pull complete
    ......
    daf564b3b156: Pull complete
    Digest: sha256:10dcb321d65b8ab6d10a8e8b083392e04bcbfef1df1af15572f41c789c669e2a
    Status: Downloaded newer image for tomcat:9.0-jre8
    docker.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.13
    5.0.13: Pulling from library/redis
    a330b6cecb98: Already exists
    ......
    fe842fc77a96: Pull complete
    Digest: sha256:6aa31467e60f57a15427ab847752cc075d3218f70ba5fb6c913c4b9c09b61c95
    Status: Downloaded newer image for redis:5.0.13
    docker.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 6380
    81.68.182.114:6380>

13.4 应用 Docker 装置 Nginx

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

  2. 拉取 Nginx 镜像

    [[email protected] conf]# docker pull nginx:1.12.1
    1.12.1: Pulling from library/nginx
    bc95e04b23c0: Pull complete
    37e52b416fab: Pull complete
    641ecf99554d: Pull complete
    Digest: sha256:d92bebac6f0fcf80804744aa2ce630bb293cbb8d25bfa4e8bf3d6de1a08166b7
    Status: Downloaded newer image for nginx:1.12.1
    docker.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,运行 kibana
    docker 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,运行 kibana
    docker 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-compose

chmod +x /usr/local/bin/docker-compose

测试是否装置胜利

[[email protected] bin]# docker-compose -v
docker-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 ...
退出移动版