Docker学习

Docker教程

1. Docker是什么?

      Docker(Moby)诞生于2013年,是一款基于 Linux LXC 容器化技术的开源的容器引擎。需要注意的是,2013版原始的开源版本 “Docker” 现在其实不叫 “Docker” 了,而是 “Moby”。这一改变发生在 2017 年的 Docker Con 大会上,因此我们现在常说的 “Docker” 实际上代表的是 Docker 公司,现在市面上所能看到的 Docker 版本通常为 Docker EE(企业版)和 Docker CE(社区版),也就是收费版和免费版本的区别,而现在的 Docker CE 实际上就可以理解为 “Moby”。

2. Docker的基本组成

      docker三要素:镜像、容器、仓库。

3. Docker安装

      详细安装教程见:安装Docker

4. 配置Docker加速器

      由于 Docker 默认下载镜像的仓库是在国外的, 因此国内用户访问相对来说会较慢一些, 目前国内一些大公司与学校搭建了一些国内的镜像仓库, 可以让我们在下载镜像时更方便些。

阿里云镜像仓库配置

      注册阿里云账号,并登陆到阿里云后台,进入控制台面板
在这里插入图片描述
      进入控制台后,找到左侧上方菜单栏,找到容器服务-容器镜像服务ACR
在这里插入图片描述
      进入容器镜像服务页面后,点击左侧菜单栏中镜像中心下的镜像加速器菜单获取镜像加速器地址,在操作文档处选择 Docker 所在服务器的操作系统,并按照文档提示完成配置即可。
在这里插入图片描述

5. 基础命令

5.1 镜像基础命令

查找镜像: docker search nginx(镜像名称)
拉取镜像: docker pull nginx(镜像名称)
查看本地镜像: docker images
删除镜像: docker rmi nginx/605c77e624dd(镜像名称或镜像ID)

5.2 容器基本命令

创建并运行一个容器: 
docker run -d --rm -p 80:80 --name nginxdemo1 -e APP_ENV=dev nginx
docker run -d --restart=always -P --name nginxdemo2 -e JVM_EVM=test nginx
参数说明:
-d:后台运行
--rm: 退出时删除容器
-p: 将主机端口映射到容器内的某端口,左边是主机端口,右边是容器内的端口
-P: 同上也是主机与容器端口映射,区别在于不需要指定主机端口,将容器内端口映射到主机的随机端口
--name: 指定容器名称
-e: 设置容器内环境变量
--restart: 设置重启策略



查看容器:docker ps
停止容器:docker stop nginxdemo2/4475fd932a79(容器名称或镜像ID)
启动容器:docker start nginxdemo2/4475fd932a79(容器名称或镜像ID)
进入容器内部:docker exec -it nginxdemo2 /bin/bash (容器名称或镜像ID)
查看容器日志: docker logs -f -n 50 nginxdemo1/4475fd932a79(容器名称或镜像ID)
-f: 实时查看日志
-n: 查看多少行日志
删除容器:docker rm -f nginxdemo2/4475fd932a79(容器名称或镜像ID)
-f: 强制删除,删除当前正在运行的容器.
查看容器内部配置:docker inspect nginxdemo1/4475fd932a79(容器名称或镜像ID)

5. 数据卷Volume

5.1 数据卷概念

       数据卷相当于是容器的虚拟文件系统和主机的真实文件系统之间的一个桥梁,建立数据卷就相当于是打通了容器于主机之间的文件交互通道,可以让容器运行时所产生的数据变更被保存到主机中,能够更方便的对数据进行备份以及保护

5.2 数据卷作用

       你可以将数据卷理解为文件目录的映射,我们可以通过 Docker 提供的相关命令,来将主机中的某一个文件目录映射到容器中,此时当你在容器中操作该目录下的文件时,实际上操作的就是主机中的文件。

5.3 数据卷绑定方式

5.3.1 匿名绑定

       在启动容器时直接使用 -v /container_dir 即可完成匿名绑定,匿名绑定的方式将在 Docker 的 volumes 目录下生成一个 sha256 的字符串作为目录名,且指定的 /container_dir 中的文件或目录会被保存在该处。
匿名绑定的 volume 在容器被删除的时候,数据卷也会被删除

匿名绑定:docker run -d -P -v /www/test nginx
匿名绑定方式由于不知道名称,因此如果需要查看数据卷在主机的哪个位置,需要使用 docker inspect container_id 来查看

       注意:使用docker rm -f 容器id/容器名 强制删除容器时,对应的数据卷是不会被删除的

5.3.2 具名绑定

       同样是启动容器时绑定一个数据卷,不同的是可以为该数据卷起个名字 -v volume-name:container_dir,通过名字你可以快速的定位并管理这些 volume

具名绑定:docker run -d -P -v nginx-www:/www/test nginx
5.3.3 Bind Mount

       绑定并加载主机的某个文件目录到容器中,这种方式是平常最常用的。这种绑定方式与前面两种一样,也是在容器启动时使用 -v host_dir:container_dir 的格式来完成映射

Bind Mount: docker run -d -P -v /www/wolfcode:/usr/share/nginx/html nginx
5.4 数据卷管理

       Docker 为我们提供了一些专门用于管理数据卷的命令 docker volume,通过下面的 Usage 来查看相关命令的使用

Usage:	docker volume COMMAND
Manage volumes

Commands:
  create      创建一个数据卷
  inspect     显示一个或多个数据卷的详细信息
  ls          查看目前已有的数据卷列表
  prune       删除所有本地没有被使用的数据卷
  rm          删除一个或多个数据卷

6. 网络Network

6.1 网络Network是什么&用途?

       是 Docker 对容器网络隔离的一项技术,提供了多种不同的模式供用户使用,选择不同的网络模式来实现容器网络的互通以及彻底的隔离。
       用途:
        1. 提供了多种模式,可以定制化的为每个容器制定不同的网络; 2. 自定义网络模式: 划分不同的子网以及网关、dns等配置; 3. 网络互通: 实现不同子网之间的网络互通、基于容器名(主机名)的方式在网络内访问

6.1 网络模式
6.1.1 bridge(桥接)

       在主机中创建一个 Docker0 的虚拟网桥,在 Ddocker0 创建一对虚拟网卡,有一半在主机上 vethxxx,还有一半在容器内 eth0,默认模式
在这里插入图片描述

6.1.2 host

       容器不再拥有自己的网络空间,而是直接与主机共享网络空间,那么基于该模式创建的容器对应的 ip 实际就是与主机同一个子网,同一个网段。
在这里插入图片描述

6.1.3 none

       Docker 会拥有自己的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡、ip、路由等相关信息。
       特点:完全隔离,与外部任何机器都无网络访问,只有自己的 lo 本地网络 127.0.0.1
在这里插入图片描述

6.1.4 container

       就是不会创建自己的网络空间,而是与其他容器共享网络空间,直接使用指定容器的ip/端口等
在这里插入图片描述

6.1.5 自定义(推荐)

       不使用 Docker 自带的网络模式,而是自己去定制化自己特有的网络模式。

命令:
docker network COMMAND 
创建自定义网络:docker network create --driver bridge --subnet 192.168.114.0/24 --gateway 192.168.114.1 wolfcode
查看网络:docker network ls
创建容器时指定自定义网络:
docker run -d --rm -P --name net1 --net wolfcode centos ping 127.0.0.1
docker run -d --rm -P --name net2 --net wolfcode centos ping 127.0.0.1
使用自定义网络运行的容器可直接使用容器名称互相ping通,而使用默认bridge桥接模式运行的容器不能
通过容器名称实现网络互通,但可以使用--link实现单向ping通
创建使用默认网络容器:
docker run -d --rm -P --name centos11 centos ping 127.0.0.1
创建容器时间网络链接到centos11容器:
docker run -d --rm -P --name centos33 --link centos11 centos  ping 127.0.0.1

使用自定义网络运行的容器可直接使用容器名称互相ping通
在这里插入图片描述
使用默认网络运行的容器使用容器名称无法ping通
在这里插入图片描述
解决办法为使用–link 实现单向ping通
在这里插入图片描述
单向ping通原理如下图:
在这里插入图片描述

6.1.6 不同模式下的连接问题

       该情况出现在容器1使用默认网络运行容器,而容器2使用自定义网络运行容器,两个容器网络不在同一个局域网内,从而无法互通。
在这里插入图片描述
       解决办法:可使用docker网络的connect连接来实现网络互通,具体如下:

创建默认网络容器: docker run -d -P --rm --name containe1 centos ping 127.0.0.1
创建自定义网络容器: docker run -d -P --rm --name containe2 --net wolfcode centos ping 127.0.0.1
使用connect命令将自定义网络关联到containe1容器:docker network connect wolfcode containe1

在这里插入图片描述
解决办法:可使用docker网络的connect连接来实现网络互通,具体如下:
在这里插入图片描述
查看自定义网络wolfcode,发现containe1也加入了其网络,而containe1容器中增加了一个自定义的wolfcode网卡,从而实现不同模式下的网络连接问题。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/65e812f86720447296c3ce1ea6d40404.jpeg#pic_center
在这里插入图片描述

7. Dockfile

7.1 基本概念

       Docker 为我们提供的一个用于自定义构建镜像的一个配置文件:描述如何构建一个对象
       利用 Docker 提供的 build 命令,指定 Dockerfile 文件,就可以按照配置的内容将镜像构建出来
       Dockerfile用途:a. 可以自定义镜像内容;b. 构建公共基础镜像减少其他镜像配置; c. 开源程序的快速部署;d. 实现企业内部项目的快速交付。

7.2 常用指令
常用指令: 

FROM 指定以什么镜像作为基础镜像,在改进项的基础之上构建新的镜像。
如果不想以任何镜像作为基础:FROM scratch
语法:
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
以上为三种写法,后两者为指定具体版本,第一种则使用 latest 也就是最新版

MAINTAINER 指定该镜像的作者
语法:
MAINTAINER <name>

LABEL 为镜像设置标签,一个 Dockerfile 中可以配置多个 LABEL
语法:
LABEL <key>=<value>
如:
LABEL "example.label"="Example Label"
LABEL label-value="LABEL"
LABEL version="1.0.0"
LABEL description="可以写成多行,使用 \
符号可以拼接多行的 value"
PS:LABEL 指令会继承基础镜像(FROM)中的 LABEL,如果当前镜像 LABEL 的 key 与其相同,则会将其覆盖

ENV 设置容器的环境变量,可以设置多个
语法:
ENV <key> <value>
ENV <key>=<value> <key>=<value> ...
两种语法的区别为第一种一次只能设置一个环境变量,第二种可以一次设置多个

RUN 构建镜像的过程中要执行的命令
语法:
RUN <command>
RUN ["executable", "param1", "param2"]
第一种写法就是直接写 Shell 脚本即可
第二种写法类似函数调用,第一个参数为可执行文件,后面的都是参数

ADD 复制命令,把 src 的文件复制到镜像的 dest 位置
语法:
ADD <src> <dest>
ADD ["<src>", "<dest>"]

WORKDIR 设置工作目录,可以简单理解为 cd 到指定目录,如果该目录不存在会自动创建,对 RUN、CMD、ENTRYPOINT、COPY、ADD 生效,可以设置多次 WORKDIR
如:
WORKDIR <dir>
表示在容器内创建了 dir 目录,并且当前目录已经是 dir 目录了

VOLUME 设置挂载目录,可以将主机中的指定目录挂载到容器中
语法:
VOLUME ["<dir>"]
VOLUME <dir>
VOLUME <dir> <dir>
以上三种写法都可

EXPOSE 该镜像运行容器后,需要暴露给外部的端口,但仅仅表示该容器想要暴露某些端口,并不会与主机端口有映射关系,如果想将容器暴露的端口与主机映射则需要使用 -p 或 -P 参数来映射,可以暴露多个端口
语法:
EXPOSE <port>[/<tcp/udp>]

CMD 该镜像启动容器时默认执行的命令或参数
语法:
CMD ["executable", "param1", "param2"]
CMD ["param1", "param2"]
CMD <command> <param1> <param2>
以上为该命令的三种写法,第三种与普通 Shell 命令类似,第一、二两种都是可执行文件 + 参数的形式,另外数组内的参数必须使用双引号。
案例:
第一种:CMD ["sh", "-c", "echo $HOME"] 等同于 sh -c "echo $HOME"
第二种:CMD ["echo", "$HOME"] 等同于 echo $HOME

ENTRYPOINT 运行容器时的启动命令,感觉与 CMD 命令会很像,实际上还是有很大区别,简单对比一下:
相同点:
在整个 Dockerfile 中只能设置一次,如果写了多次则只有最后一次生效
不同点:
ENTRYPOINT 不会被运行容器时指定的命令所覆盖,而 CMD 会被覆盖
如果同时设置了这两个指令,且 CMD 仅仅是选项而不是参数,CMD 中的内容会作为 ENTRYPOINT 的参数(一般不这么做)
如果两个都是完整命令,那么只会执行最后一条
语法:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
拓展指令:
ARG 设置变量,在镜像中定义一个变量,当使用 docker build 命令构建镜像时,带上 --build-arg <name>=<value> 来指定参数值,如果该变量名在 Dockerfile 中不存在则会抛出一个警告
语法:
ARG <name>[=<default value>]

USER 设置容器的用户,可以是用户名或 UID,如果容器设置了以 daemon 用户去运行,那么 RUN、CMD 和 ENTRYPOINT 都会以这个用户去运行,一定要先确定容器中有这个用户,并且拥有对应的操作权限。
语法:
USER <username>
USER <PID>

ONBUILD 表示在构建镜像时做某操作,不过不对当前 Dockerfile 的镜像生效,而是对以当前 Dockerfile 镜像作为基础镜像的子镜像生效
语法:
ONBUILD [INSTRUCTION]
例:
当前镜像为 A,设置了如下指令 
ONBUILD RUN ls -al
镜像 B:
FROM 镜像A
......
构建镜像 B 时,会执行 ls -al 命令

STOPSIGNAL STOPSIGNAL 指令设置将发送到容器的系统调用信号以退出。此信号可以是与内核的系统调用表中的位置匹配的有效无符号数,例如 9,或 SIGNAME 格式的信号名,例如 SIGKILL。
默认的stop-signal是SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,通过--stop-signal可以设置自己需要的signal,主要的目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s。
STOPSIGNAL <signal>


HEALTHCHECK 容器健康状况检查,可以指定周期检查容器当前的健康状况,该命令只能出现一次,如果有多次则只有最后一次生效。
语法:
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
第一种:在容器内部按照指定周期运行指定命令来检测容器健康状况
第二种:取消在基础镜像
OPTIONS 选项:
--interval=DURATION 两次检查的间隔时间,默认30s
--timeout=DURATION 命令执行的超时时间,默认30s
--retries=N 当连续失败指定次数,容器会被认定为不健康,默认为3次
返回参数:
0:success => 健康状态
1:unhealthy => 不健康状态
2:reserved => 保留值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.3 构建镜像
7.3.1 构建spring-boot镜像
创建目录同时创建对应的Dockerfile文件及将对应的项目jar包上传到与Dockerfile文件同一目录
mkdir spring-boot-docker-demo
cd spring-boot-docker-demo
编写对应的Dockerfile文件:vim Dockerfile
# 关联基础镜像 ==> jdk
FROM openjdk:8

# 将项目jar包拷贝到容器中
ADD *.jar  app.jar

# 配置项目环境变量
ENV APP_OPTS=""
# 配置JVM环境变量
ENV JVM_OPTS="-Duser.timezone=Asia/Shanghai -Xms128m -Xmx256m"

EXPOSE 8080

# 设置启动时命令
ENTRYPOINT ["sh","-c","java $JVM_OPTS -jar /app.jar $APP_OPTS"]

~                                                                   
构建镜像: docker build -t spring-boot-docker:1.0.0 .
查看新构建镜像是否成功:docker images
根据新生成镜像运行容器:docker run -d --rm -P spring-boot-docker:1.0.0
浏览器测试接口访问是否成功。
7.3.2 构建Tomcat镜像
创建目录同时创建对应的Dockerfile文件及将对应的项目jar包上传到与Dockerfile文件同一目录
mkdir java-web
cd java-web
编写对应的Dockerfile文件:vim Dockerfile
# 关联基础镜像 ==> tomcat
FROM tomcat:9.0

WORKDIR /usr/local/tomcat/webapps

# 添加项目所需war包
ADD *.war ROOT.war

# 设置容器运行时命令
CMD ["sh","-c","../bin/catalina.sh run"]
构建镜像: docker build -t java-web:1.0.0 .
查看新构建镜像是否成功:docker images
根据新生成镜像运行容器:docker run -d --rm -P java-web:1.0.0
浏览器测试接口访问是否成功。
7.3.1 构建Nginx镜像(源码构建)
创建目录同时创建对应的Dockerfile文件及将对应的镜像所需上传到与Dockerfile文件同一目录
nginx-1.24.0.tar.gz  pcre-8.45.tar.gz
mkdir nginxdemo
cd nginxdemo
编写对应的Dockerfile文件:vim Dockerfile

# 设置基础镜像
FROM centos:7

# 设置维护者信息
MAINTAINER hhzz<hhzz@163.com>

# 添加构建镜像所需文件
ADD pcre-8.45.tar.gz /usr/local/src
ADD nginx-1.24.0.tar.gz /usr/local/src

# 安装gcc 源码编译的基础工具
RUN yum -y install wget gcc gcc-c++ make openssl-devel

# 创建www用户为nginx的启动用户
RUN useradd -s /sbin/nologin -M www

# 进入nginx解压后的源码目录
WORKDIR /usr/local/src/nginx-1.24.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.45
RUN make && make install

# 关闭nginx后台运行
RUN echo 'daemon off;' >> /usr/local/nginx/conf/nginx.conf

# 创建nginx命令快速访问环境变量
# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx 
ENV PATH /usr/local/nginx/sbin:$PATH

# 暴露端口
EXPOSE 80

# 使用自定义的html替换nginx原本的index页面
ADD index.html /usr/local/nginx/html

# 设置容器启动命令
CMD ["nginx"]

构建镜像: docker build -t mynginx .
查看构建镜像:docker images
运行容器:docker run -d --rm -P mynginx
测试:curl 127.0.0.1:32770

8. 仓库Registry

8.1 基本概念

       镜像仓库:用于管理 Docker 的镜像
       常见的仓库:Docker Hub 、Aliyun、自主搭建(私服仓库):Nexus、 Harbor 。

8.1 自主搭建(私服仓库)
8.1.1 Nexus
# 创建持久化目录
mkdir -p /opt/docker/nexus
# 开放权限
chmod 777 -R /opt/docker

# 启动 nexus 容器
docker run -d --restart=always -p 8868:8081 -p 5000:5000 -p 5001:5001 --name nexus -v /opt/docker/nexus:/nexus-data sonatype/nexus3

查看默认密码
docker exec -it nexus /nexus-data/admin.password

配置安全认证(原因:在docker中默认把除docker认证的服务以外所有的其他的一些非https服务(非认证服务)不让访问;如果不采取下列方法还可以将ip地址绑定域名,域名中加上tsl加密证书即可以不做如下配置):vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://gg5ax0ix.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.124.11:5000","192.168.124.11.5001"]
}
配置后需重新加载配置:systemctl daemon-reload
重启docker服务: systemctl restart docker.service
登录数据推送仓库:docker login -uadmin 192.168.124.11:5000
打标签:docker tag  d9b27c657c45 192.168.124.11:5000/mynginx
推送镜像: docker push 192.168.124.11:5000/mynginx

登录数据下载仓库:docker login -uadmin 192.168.124.11:5001
下载镜像: docker pull mynginx
8.1.3 Harbor

       除了 Docker Hub 以外最早的一个比较受欢迎的 Docker 企业级 Registry 服务器。
       使用 Harbor 必须要先安装 docker 以及 docker-compose
       harbor离线安装

1. 将下载好的harbor-offline-installer-v2.10.2.tgz包上传到服务器上
2. 将harbor压缩包解压:tar -zxvf harbor-offline-installer-v2.10.2.tgz
3. 进入到解压后的harbor文件路径,复制一份yml文件:cp harbor.yml.tmpl harbor.yml
4. 编辑harbor.yml文件:vim harbor.yml
   hostname: 192.168.124.22
   port: 8858
5. 做安装前准备: bash prepare
6. 开始安装: bash install.sh
7. 查看harbor服务是否正常启动:docker-compose ps

       harbor服务正常启动后,浏览器页面访问8858端口
在这里插入图片描述
       登录进去后,先添加用户,再添加项目
在这里插入图片描述
在这里插入图片描述
       然后再回到服务器上继续如下操作

添加harbor服务信任站点:vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://gg5ax0ix.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.124.11:5000","192.168.124.11:5001","192.168.124.22:8858"]
}
~    
重新加载并重启docker服务:
systemctl daemon-reload && systemctl restart docker
登录harbor:  docker login -uadmin 192.168.124.22:8858
对需要推送镜像打标签: docker tag d9b27c657c45 192.168.124.22:8858/wolfcode_nginx/nginx
推送镜像: docker push 192.168.124.22:8858/wolfcode_nginx/nginx
下载镜像: docker pull 192.168.124.22:8858/wolfcode_nginx/nginx

       到此,harbor镜像仓库安装完成

9. 容器编排

       容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理。
       需要容器编排的原因:1. 依赖管理:当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理; 2. 副本数控制,容器有时候也需要集群,快速的对容器集群进行弹性伸缩; 3. 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务。

9.1 Docker-compose(单机)
9.1.1 docker-compose安装

       Compose简介: Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
       Compose安装

sudo curl -L "http://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:sudo chmod +x /usr/local/bin/docker-compose
创建软链: sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功: docker-compose --version

在这里插入图片描述

9.1.2 配置文件

       版本概述:docker-compose 的 api 版本与大版本一致,compose 版本与 docker 版本之间存在一定关联。
       https://docs.docker.com/compose/compose-file/compose-file-v2/
       服务services: 需要运行的容器配置,可以理解为原先用 docker run 命令后面跟的一系列配置信息,都配在这个下面
       网络networks: docker-compose 公共自定义网络管理,配置好以后,可以直接在 services 中引用该网络配置,这个配置可以多个 service 使用
       数据卷volumes: docker-compose 下的统一数据卷管理,可以给多个 service 使用

9.1.3 常用命令
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)

Commands:
  build              构建或重新构建一个服务
  bundle             Generate a Docker bundle from the Compose file
  config             验证并查看 compose 文件
  create             创建一个服务
  down               停止并删除容器、网络、镜像和数据卷
  events             Receive real time events from containers
  exec               在一个运行中的容器执行命令
  help               获取帮助信息
  kill               关闭一个容器
  logs               显示服务的日志信息
  pause              暂停一个服务
  port               打印一个端口绑定的公开端口
  ps                 查看容器列表
  pull               拉取镜像
  push               推送镜像
  restart            重启容器
  rm                 删除已经停止的容器
  run                运行一个一次性执行的命令
  scale              设置服务的容器数量
  start              启动服务
  stop               停止服务
  unpause            恢复一个暂停的服务
  up                 创建并启动一个容器
  version            显示 compose 的版本信息

       使用docker-copose安装一个nginx

创建指定文件目录:mkdir -p /opt/docker/nginx
编写docker-compose.yml文件:vim docker-compose.yml
version: "2.1"
services:
  nginx-demo:
    image: "nginx"
    #    container_name: "nginx_compose"
    restart: "always"
    networks:
      - wolfcode_net
    volumes:
      - /www/wolfcode.cn:/usr/share/nginx/html
    environment:
      APP_ENV: dev
    ports:
      - 80

networks:
  wolfcode_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.111.0/24
          gateway: 192.168.111.1

检查docke-compose.yml文件是否存在问题:
创建服务:docker-compose create nginx-demo
运行服务:docker-compose up -d nginx-demo
停止服务:docker-compose stop
启动/重启服务:docker-compose start/restart
查看服务:docker-compose ps
弹性伸缩: docker-compose scale nginx-demo=3
查看日志:docker-compose logs -f nginx-demo

构建服务:可以选择基于已有的镜像或者 Dockerfile 进行重新构建,利用 docker-compose build 可进行构建操作,也可以指定 docker-compose build <service name> 来构建指定服务
拉取镜像: docker-compose pull 服务名
9.2 Swarm(分布式)

       Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用GO语言来完成的开发的, 它是将一群 Docker 宿主机变成一个单一的虚拟主机,Swarm 使用标准的 Docker API 接口作为其前端的访问入口,换言之,各种形式的DockerClient(compose, docker-py 等) 均可以直接与 Swarm 通信,甚至 Docker 本身都可以很容易的与 Swarm 集成,这大大方便了用户将原本基于单节点的系统移植到 Swarm 上,同时Swarm 内置了对 Docker 网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
       Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
       从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
       Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。https://github.com/docker/swarm
在这里插入图片描述

9.2.1 关键概念
Swarm: 集群的管理和编排是使用嵌入 docker 引擎的 SwarmKit,可以在docker 初始化时启动 swarm 模式或者加入已存在的 swarm
swarm 集群节点的管理命令:docker swarm --help
初始化集群节点
加入节点
退出节点

Node: 运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。

Task: 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。


Service:服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 --mode 参数指定。
9.2.1 实战应用

       在做swam集群前需对对应的服务器做时钟同步

主服务器master
安装时间同步包: yum -y install chrony
编辑时钟同步文件:vim /etc/chrony.conf
server 192.168.124.88 iburst

node节点服务器操作如上
安装时间同步包: yum -y install chrony
编辑时钟同步文件:vim /etc/chrony.conf
server 192.168.124.88 iburst  ## 这里以master为时间同步服务器进行同步

       搭建swarm集群

集群搭建
初始化集群:docker swarm init --advertise-addr 192.168.124.88
增加工作节点:docker swarm join --token SWMTKN-1-3n78i3o9zfgc9wh5uikrq78lz1d914wy128rocwmqnzmzduijd-6crdkjp0rle05sgjwettw4mw9 192.168.124.88:2377
查看集群: docker node ls
查看Swarm 集群下运行的所有服务:docker service ls
查看服务信息: docker service ps nginxswarm

部署服务
新建服务: docker service create --replicas 2 -p 80:80 --name nginxswarm nginx
监控集群状态:docker service inspect --pretty nginxswarm

弹性伸缩
调整实例个数:docker swarm leave 
调整集群大小:docker service update --replicas 1 nginxswarm

10. Portainer轻量级可视化工具

启动portainer容器: 
# 基于 docker 运行
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

# 基于 swarm 运行
docker service create -p 9000:9000 --replicas 1 --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer

       服务创建成功,浏览器访问

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值