GVKun编程网logo

Docker三剑客之Docker Machine(docker三剑客介绍)

11

如果您想了解Docker三剑客之DockerMachine和docker三剑客介绍的知识,那么本篇文章将是您的不二之选。我们将深入剖析Docker三剑客之DockerMachine的各个方面,并为您解

如果您想了解Docker三剑客之Docker Machinedocker三剑客介绍的知识,那么本篇文章将是您的不二之选。我们将深入剖析Docker三剑客之Docker Machine的各个方面,并为您解答docker三剑客介绍的疑在这篇文章中,我们将为您介绍Docker三剑客之Docker Machine的相关知识,同时也会详细的解释docker三剑客介绍的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

Docker三剑客之Docker Machine(docker三剑客介绍)

Docker三剑客之Docker Machine(docker三剑客介绍)

一、什么是Docker Machine

  Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https://github.com/docker/machine。

  Docker Machine 是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。

  使用docker-machine命令,可以启动、审查、停止、重启托管的docker 也可以升级Docker客户端和守护程序并配置docker客户端和宿主机通信。

  Docker Machine 也可以集中管理所以得docker主机。

 

二、为什么要使用Docker Machine

Docker Machine 使你能够在各种 Linux 上配置多个远程 Docker 宿主机。
此外,Machine 允许你在较早的 Mac 或 Windows 系统上运行 Docker,如上一主题所述。
Docker Machine 有这两个广泛的用例。

  • 我有一个较旧的桌面系统,并希望在 Mac 或 Windows 上运行 Docker

Docker(五):Docker 三剑客之 Docker Machine

如果你主要在不符合新的 Docker for Mac 和 Docker for Windows 应用程序的旧 Mac 或 Windows 笔记本电脑或台式机上工作,则需要 Docker Machine 来在本地“运行Docker”(即Docker Engine)。在 Mac 或 Windows box 中使用 Docker Toolbox 安装程序安装 Docker Machine 将为 Docker Engine 配置一个本地的虚拟机,使你能够连接它、并运行 docker 命令。

  • 我想在远程系统上配置 Docker 宿主机

Docker(五):Docker 三剑客之 Docker Machine

Docker Engine Linux 系统上原生地运行。如果你有一个 Linux 作为你的主系统,并且想要运行 docker 命令,所有你需要做的就是下载并安装 Docker Engine 。然而,如果你想要在网络上、云中甚至本地配置多个 Docker 宿主机有一个有效的方式,你需要 Docker Machine。

无论你的主系统是 Mac、Windows 还是 Linux,你都可以在其上安装 Docker Machine,并使用 docker-machine 命令来配置和管理大量的 Docker 宿主机。它会自动创建宿主机、在其上安装 Docker Engine 、然后配置 docker 客户端。每个被管理的宿主机(“machine”)是 Docker 宿主机和配置好的客户端的结合。

三、Docker和Docker Machine之间的区别

当人们说“Docker”时,他们通常是指 Docker Engine,它是一个客户端 - 服务器应用程序,由 Docker 守护进程、一个REST API指定与守护进程交互的接口、和一个命令行接口(CLI)与守护进程通信(通过封装REST API)。Docker Engine 从 CLI 中接受docker 命令,例如 docker run <image>、docker ps 来列出正在运行的容器、docker images 来列出镜像,等等。

Docker(五):Docker 三剑客之 Docker Machine

Docker Machine 是一个用于配置和管理你的宿主机(上面具有 Docker Engine 的主机)的工具。通常,你在你的本地系统上安装 Docker Machine。Docker Machine有自己的命令行客户端 docker-machine 和 Docker Engine 客户端 docker。你可以使用 Machine 在一个或多个虚拟系统上安装 Docker Engine。

这些虚拟系统可以是本地的(就像你在 Mac 或 Windows 上使用 Machine 在 VirtualBox 中安装和运行 Docker Engine 一样)或远程的(就像你使用 Machine 在云提供商上 provision Dockerized 宿主机一样)。Dockerized 宿主机本身可以认为是,且有时就称为,被管理的“machines”。

Docker(五):Docker 三剑客之 Docker Machine

四、安装

  Docker Mechine 可以在多种平台上安装使用,包括Linux 、MacOS已经windows

  Docker Mechine 安装非常的简单:GitHub地址:https://github.com/docker/machine/releases/ 里面有安装教程(在写这篇文章的时候最新版本是v0.15.0)

  安装 Docker Mechine

[root@operation ~]# curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    462      0 --:--:--  0:00:01 --:--:--   463
100 26.8M  100 26.8M    0     0  1000k      0  0:00:27  0:00:27 --:--:-- 1373k
[root@operation ~]# chmod +x /tmp/docker-machine 
[root@operation ~]# cp /tmp/docker-machine /usr/local/bin/docker-machine

# 查看版本确认是否安装成功
[root@operation ~]# docker-machine -v
docker-machine version 0.15.0, build b48dc28d

# 安装自动补全功能
[root@operation ~]# yum -y install bash-completion
[root@operation ~]# scripts=( docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash ); for i in "${scripts[@]}"; do wget https://raw.githubusercontent.com/docker/machine/v0.15.0/contrib/completion/bash/${i} -P /etc/bash_completion.d; done

# 添加以下
[root@operation ~]# cat ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm=''rm -i''
alias cp=''cp -i''
alias mv=''mv -i''

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

source /etc/bash_completion.d/docker-machine-wrapper.bash
source /etc/bash_completion.d/docker-machine-prompt.bash
source /etc/bash_completion.d/docker-machine.bash

PS1=''[\u@\h \W$(__docker_machine_ps1)]\$ ''

# 使之生效
[root@operation ~]# source ~/.bashrc

  到此位置docker-machine就安装完成了!

五、参数

  支持命令

命令 说明 active 查看当前激活状态的Docker主机 config 查看当前激活状态Docker主机的连接信息 creat  创建Docker主机 env 显示连接到某个主机需要的环境变量 inspect 以json格式输出指定Docker的详细信息 ip 获取指定Docker主机的地址 kill 直接杀死指定的Docker主机 ls 列出所有的管理主机 provision 重新配置指定主机 regenerate-certs 为某个主机重新生成TLS信息 restart 重启指定的主机 rm 删除某台Docker主机,对应的虚拟机也会被删除 ssh 通过SSH连接到主机上,执行命令 scp 在Docker主机之间以及Docker主机和本地主机之间通过scp远程复制数据 mount 使用SSHFS从计算机装载或卸载目录 start 启动一个指定的Docker主机,如果对象是个虚拟机,该虚拟机将被启动 status 获取指定Docker主机的状态(包括:Running、Paused、Saved、Stopped、Stopping、Starting、Error)等 stop 停止一个指定的Docker主机 upgrade 将一个指定主机的Docker版本更新为最新 url 获取指定Docker主机的监听URL version 显示Docker Machine的版本或者主机Docker版本 help 显示帮助信息

  支持的平台及驱动引擎

# 平台
1.常规Linux操作系统;

2.虚拟化平台-VirtualBox,VMware,Hyper-V

3.Openstack

4.公有云-Amazon Web Services,Microsoft Azure,Google Compute Engine,Digital Ocean等

Docker Machine为这些环境起了一个统一的名字:provider

对于特定的某个provider,Docker Machine使用相应的driver安装配置docker host

# 驱动引擎
amazonec2
azure
digitalocean
exoscale
generic
google
hyperv
none
openstack
rackspace
softlayer
virtualbox
vmwarevcloudair
vmwarefusion
vmwarevsphere

# 指定方式
使用参数 -d 或者 --driver 驱动引擎名称

  说白了都是虚拟化平台和云平台的驱动文件

六、使用

  通过Docker Machine 创建docker(我用了两台机器)

  • 192.168.31.43  安装docker machine的机器  主机名:operation
  • 192.168.31.188  被管理的机器       主机名:client1

  创建步骤:

  1. 配置主机间的SSH免密(在192.168.31.43上面创建)

# 生成keys并配置可以免密登录主机(这个是必须要做的)
[root@operation ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory ''/root/.ssh''.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0Fq7VlowSsDqSStOn4veIoTxFbW2RB059qXMSzLblKg root@operation
The key''s randomart image is:
+---[RSA 2048]----+
|   ...o..o       |
|    oo o=   .    |
|   . .*.=* +     |
|. o .+ *++O      |
|.= +  +.SBo.     |
|oo=   E .=o      |
|+.. .   +        |
|.ooo   .         |
|oo.o.            |
+----[SHA256]-----+

# 将keys拷贝到client1上去
[root@operation ~]# ssh-copy-id root@192.168.31.188
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host ''192.168.31.188 (192.168.31.188)'' can''t be established.
ECDSA key fingerprint is SHA256:6MKhx743bCMD3Ay+ELNpKnq1+3/wltcrPhbuyEclZj8.
ECDSA key fingerprint is MD5:e8:6d:14:7e:41:da:96:4b:2c:92:f8:61:cc:f4:7b:14.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.31.188''s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ''root@192.168.31.188''"
and check to make sure that only the key(s) you wanted were added.

# 测试是否可以免密登录
[root@operation ~]# ssh root@192.168.31.188
Last login: Fri Oct 12 15:27:45 2018 from 192.168.31.104
[root@client1 ~]# exit

  2. 使用docker machine创建docker host

# 使用docker machine 创建
# 对于docker machine来将,术语Machine就是运行docker daemon的主机,创建machine就是在host上安装docker
# 执行docker-macine ls查看当前的machine
[root@operation ~]# docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

# 当前还没有一个machine,接下来我们创建第一个machine:docker188-192.168.31.188   
[root@operation ~]# docker-machine create --driver generic --generic-ip-address=192.168.31.188 docker188
Running pre-create checks...
Creating machine...
(docker188) No SSH key specified. Assuming an existing key at the default location.
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env docker188

注意:这里会出现Error creating machine: Error running provisioning: error installing docker:  这样的错误 原因就是因为网络的原因,没有安装docker

# 创建成功执行ls查看
[root@operation ~]# docker-machine  ls
NAME        ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER        ERRORS
docker188   -        generic   Running   tcp://192.168.31.188:2376           v18.06.1-ce   

# 登录到client查看配置项
[root@operation ~]# ssh root@192.168.31.188
Last login: Fri Oct 12 16:19:10 2018 from 192.168.31.43
[root@docker188 ~]# cat /etc/systemd/system/docker.service.d/10-machine.conf 
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic 
Environment=

注:-H tcp://0.0.0.0:2376 使docker daemon接受远程连接

      --tls*对远程连接启用安全认证和加密

注:大家可能会发现这里的主机名变成了docker188 原因就是docker-machine创建的时候会把主机名也一起修改


# 查看docker188的环境变量
[root@operation ~]# docker-machine env docker188
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.31.188:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/docker188"
export DOCKER_MACHINE_NAME="docker188"
# Run this command to configure your shell: 
# eval $(docker-machine env docker188)

# 根据提示执行
[root@operation ~]# eval $(docker-machine env docker188)
[root@operation ~ [docker188]]# 

可以看到,命令提示符变成了docker188,其原因是我们之前在/root/.bashrc里面配置了 PS1=''[\u@\h \W$(__docker_machine_ps1)]\$ '',用于显示当前的docker host
注:如果我们输入eval $(docker-machine env docker1)没有显示出docker188的命令提示符,我们可以重新输入一遍 PS1=''[\u@\h \W$(__docker_machine_ps1)]\$ ''
在此状态下执行的docker命令其效果都相当于在docker188上执行

[root@operation ~ [docker188]]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@operation ~ [docker188]]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

  3. 其他命令操作

# 其他命令
# create 命令
选项包括:
·--driver,-d"none"                             指定驱动类型;
·--engine-install-url"https://get.docker.com"   配置Dokcer主机时候的安装URL;
·--engine-opt option                            以键值对格式指定所创建Docker引擎的参数;
·--engine-insecure-registry option              以键值对格式指定所创建Docker引擎允许访问的不支持认证的注册仓库服务;
·--engine-registry-mirror option                指定使用注册仓库镜像;
·--engine-label option                          为所创建的Docker引擎添加标签;
·--engine-storage-driver                        存储后端驱动类型;
·--engine-env option                            指定环境变量;
·--swarm                                        指定使用Swarm;
·--swarm-image"swarm:latest"                   使用Swarm时候采用的镜像;
·--swarm-master                                 配置机器作为Swarm集群的master节点;
·--swarm-discovery                              Swarm集群的服务发现机制参数;
·--swarm-strategy"spread"                       Swarm默认调度策略;
·--swarm-opt option                             任意传递给Swarm的参数;
·--swarm-host"tcp://0.0.0.0:3376"              指定地址将监听 Swarm master节点请求;
·--swarm-addr                                   从指定地址发送广播加入Swarm集群服务。

实例:
docker-machine create -d virtualbox \
--engine-storage-driver overlay \
--engine-label name=testmachine \
--engine-label year=2018 \
--engine-opt dns=8.8.8.8 \
--engine-env HTTP_PROXY=http://proxy.com:3128 \
--engine-insecure-registry registry.private.com \
mydockermachine


# active命令
[root@operation ~]# docker-machine ls
NAME        ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER        ERRORS
docker188   -        generic   Running   tcp://192.168.31.188:2376           v18.06.1-ce   

# 这里的状态是没有被激活
[root@operation ~]# docker-machine env docker188
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.31.188:2376"                           # 激活主机
export DOCKER_CERT_PATH="/root/.docker/machine/machines/docker188"
export DOCKER_MACHINE_NAME="docker188"
# Run this command to configure your shell: 
# eval $(docker-machine env docker188)

[root@operation ~]# export DOCKER_HOST="tcp://192.168.31.188:2376"
[root@operation ~]# docker-machine ls
NAME        ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER        ERRORS
docker188   *        generic   Running   tcp://192.168.31.188:2376           v18.06.1-ce   
[root@operation ~]# docker-machine active 
docker188

# config命令
[root@operation ~]# docker-machine config docker188
--tlsverify
--tlscacert="/root/.docker/machine/machines/docker188/ca.pem"
--tlscert="/root/.docker/machine/machines/docker188/cert.pem"
--tlskey="/root/.docker/machine/machines/docker188/key.pem"
-H=tcp://192.168.31.188:2376

# inspect命令
[root@operation ~]# docker-machine inspect docker188
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "192.168.31.188",
        "MachineName": "docker188",
        "SSHUser": "root",
        "SSHPort": 22,
        "SSHKeyPath": "",
        "StorePath": "/root/.docker/machine",
        "SwarmMaster": false,
        "SwarmHost": "",
        "SwarmDiscovery": "",
        "EnginePort": 2376,
        "SSHKey": ""
    },
    "DriverName": "generic",
    "HostOptions": {
        "Driver": "",
        "Memory": 0,
        "Disk": 0,
        "EngineOptions": {
            "ArbitraryFlags": [],
            "Dns": null,
            "GraphDir": "",
            "Env": [],
            "Ipv6": false,
            "InsecureRegistry": [],
            "Labels": [],
            "LogLevel": "",
            "StorageDriver": "",
            "SelinuxEnabled": false,
            "TlsVerify": true,
            "RegistryMirror": [],
            "InstallURL": "https://get.docker.com"
        },
        "SwarmOptions": {
            "IsSwarm": false,
            "Address": "",
            "Discovery": "",
            "Agent": false,
            "Master": false,
            "Host": "tcp://0.0.0.0:3376",
            "Image": "swarm:latest",
            "Strategy": "spread",
            "Heartbeat": 0,
            "Overcommit": 0,
            "ArbitraryFlags": [],
            "ArbitraryJoinFlags": [],
            "Env": null,
            "IsExperimental": false
        },
        "AuthOptions": {
            "CertDir": "/root/.docker/machine/certs",
            "CaCertPath": "/root/.docker/machine/certs/ca.pem",
            "CaPrivateKeyPath": "/root/.docker/machine/certs/ca-key.pem",
            "CaCertRemotePath": "",
            "ServerCertPath": "/root/.docker/machine/machines/docker188/server.pem",
            "ServerKeyPath": "/root/.docker/machine/machines/docker188/server-key.pem",
            "ClientKeyPath": "/root/.docker/machine/certs/key.pem",
            "ServerCertRemotePath": "",
            "ServerKeyRemotePath": "",
            "ClientCertPath": "/root/.docker/machine/certs/cert.pem",
            "ServerCertSANs": [],
            "StorePath": "/root/.docker/machine/machines/docker188"
        }
    },
    "Name": "docker188"
}


# ssh命令
[root@operation ~]# docker-machine ssh docker188 docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              196d12cf6ab1        4 weeks ago         4.41MB

[root@operation ~]# docker-machine ssh docker188    
Last login: Fri Oct 12 16:36:49 2018 from 192.168.31.43
[root@docker188 ~]# 

# url命令
[root@operation ~]# docker-machine url docker188                   
tcp://192.168.31.188:2376

# status命令
[root@operation ~]# docker-machine status docker188
Running

# version命令
[root@operation ~]# docker-machine version docker188
18.06.1-ce

  注:还有一些命令就不一一列出了,可以查看上面的参数命令表,具体命令的使用方法可以通过--help查看

  注:Machine安装docker环境中会因网络或其他情况造成安装失败,使用中发现,这种安装失败频率很高,感觉没有使用的价值,说白了,一个公司操作系统一般不会超过两个发行版,写个脚本一键安装也许会更方便!

七、总结

Docker Machine 最主要有两个作用:

  • 使用 Docker Machine 方便在不同的环境中使用 Docker ,比如:Win/Mac
  • 使用 Docker Machine 方便在云环境下批量部署 Docker环境,比如:私有云,公有云批量安装Docker环境

八、参考链接

官方地址:https://docs.docker.com/machine/

官方驱动详细使用方法:https://docs.docker.com/machine/drivers/

参考文档:https://www.cnblogs.com/lkun/p/7781157.html

 

CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose

CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose

CentOS 下 Docker 与.netcore (一) 之 安装 

CentOS 下 Docker 与.netcore (二) 之 Dockerfile

CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose

CentOS 下 Docker 与.netcore (四)之 三剑客之一 Docker-machine+jenkins 简单自动化部署

CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群 

1. 什么是 Docker-Compose

上一章我们讲了通过 Dockerfile 创建镜像,这在一个小项目中是没问题的,但如果在一个包含多个项目的情况下,我们每次部署都需要执行多次创建镜像与运行容器的命令,这样就比较麻烦,为了解决这种情况,Docker-Compose 出现了。Docker-Compose 主要就是为了解决在一台服务器创建镜像与运行容器复杂的问题,有了 Docker-Compose 我们就可以通过一条命令,生成多镜像与运行容器。

2.Docker-Compose 安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

查看安装是否成功

3. 创建两个.netcore 项目,不启用 https

ServerProvider 项目

新增 Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime
MAINTAINER yishi.chen

LABEL description="this is a serverprovider website"
LABEL version="1.0"

ARG serverport

WORKDIR /app
COPY bin/Release/netcoreapp2.1/publish/ .
EXPOSE $serverport
ENTRYPOINT ["dotnet","ServerProvider.dll"]

Program.cs 改动

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseUrls($"http://*:{Environment.GetEnvironmentVariable("serverport")}")
                .UseStartup<Startup>();

ValuesController.cs 改动

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace ServerProvider.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "this is serverprovider''s result" };
        }

    }
}

ServerConsumer 项目

新增 Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime
MAINTAINER yishi.chen

LABEL description="this is a serverconsumer website"
LABEL version="1.0"

ARG consumerport

WORKDIR /app
COPY bin/Release/netcoreapp2.1/publish/ .
EXPOSE $consumerport
ENTRYPOINT ["dotnet","ServerComsumer.dll"]

Program.cs 改动

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseUrls($"http://*:{Environment.GetEnvironmentVariable("consumerport")}")
                .UseStartup<Startup>();

ValueController.cs 改动

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace ServerComsumer.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public async Task<ActionResult<string>> Get(int id)
        {
            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            return await httpClient.GetAsync(Environment.GetEnvironmentVariable("serverurl")).Result.Content.ReadAsStringAsync();
        }
    }
}

新建 docker-compose.yml 编排文件

内容如下(docker-compose 的配置请见 https://www.cnblogs.com/chenyishi/p/9965479.html):

version: ''3''
services:
  s_provider:
    build:
      context: ./ServerProvider/
      dockerfile: Dockerfile
      args:
        serverport: 1000
    ports:
      - "1000:1000"
    environment:
      serverport: 1000
    container_name: c_provider
  s_consumer:
    build:
      context: ./ServerComsumer/
      dockerfile: Dockerfile
      args:
        consumerport: 2000
    ports:
      - "2000:2000"
    links:
      - s_provider:s_provider
    environment:
      consumerport: 2000
      serverurl: http://s_provider:1000/api/values/
    container_name: c_consumer

 4. 定位到 docker-compose 文件所在目录,运行 docker-compose

[root@cys-test-centos WebDocker]# docker-compose up

运行成功,状态如下:

5. 另起一个命令窗口,测试接口

[root@cys-test-centos ~]# curl http://localhost:1000/api/values
["this is serverprovider''s result"]
root@cys-test-centos ~]# curl http://localhost:2000/api/values
["value1","value2"]
[root@cys-test-centos ~]# curl http://localhost:2000/api/values/1
["this is serverprovider''s result"]

以上是通过 docker-compose 新建镜像,并运行容器,如果镜像已存在,则可以去掉构建的过程,我们稍微对 docker-compose 文件做一下调整

6. 在上面步骤的前提下,先 CtrlC 停止容器,然后 docker-compsoe down 删除容器

[root@cys-test-centos WebDocker]# docker-compose down
Removing c_consumer ... done
Removing c_provider ... done
Removing network webdocker_default

7. 查看生成的镜像

[root@cys-test-centos WebDocker]# docker images
REPOSITORY             TAG                      IMAGE ID            CREATED             SIZE
webdocker_s_consumer   latest                   cc95654856e1        17 minutes ago      253MB
webdocker_s_provider   latest                   5b744758b56b        17 minutes ago      253MB
microsoft/dotnet       2.1-aspnetcore-runtime   db366d73508b        4 days ago          253MB

镜像名为:webdocker_s_provider 与 webdocker_s_consumer

8. 修改 docker-compose.yml 文件

version: ''3''
services:
  s_provider:
    image: webdocker_s_provider
    ports:
      - "1000:1000"
    environment:
      serverport: 1000
    container_name: c_provider
  s_consumer:
    image: webdocker_s_consumer
    ports:
      - "2000:2000"
    links:
      - s_provider:s_provider
    environment:
      consumerport: 2000
      serverurl: http://s_provider:1000/api/values/
    container_name: c_consumer

9. 验证接口

[root@cys-test-centos ~]# curl http://localhost:2000/api/values/1
["this is serverprovider''s result"]

 

到此 Docker-Compose 介绍完毕,下一章讲 Docker 三剑客之 Docker-machine

CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群

CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群

 CentOS 下 Docker 与.netcore (一) 之 安装

CentOS 下 Docker 与.netcore (二) 之 Dockerfile

CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose

CentOS 下 Docker 与.netcore (四)之 三剑客之一 Docker-machine+jenkins 简单自动化部署

CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群

1. 什么是 docker-swarm

在公司网站流量爆发式增长的时候,一台服务器往往不能满足需求,之前我的解决办法是通过 nginx 来实现负载均衡,有了 docker-machine 之后,解决方案会更加简单。当流量增加时,我们按照需要往 docker-swarm 集群中添加主机就可以了。

2. 原理

我们把一组 docker-swarm 集群中的所有 docker 容器统称作一个 service,其中的每一个 docker 容器称做一个 task,如下图

3. 开始搭建环境

上一章我们讲了 docker-machine,在这里我们需要用到。我在我本地 Hyper-v 创建 4 个虚拟机

其中:

CentOS 设置静态 IP:  192.168.8.200,并在这个虚机上搭建好 docker-machine

CentOS2 设置静态 IP:192.168.8.201

CentOS3 设置静态 IP:192.168.8.202

CentOS3 设置静态 IP:192.168.8.203

然后通过 200 节点,分别在 201,202,203 上搭建好 docker

4. 创建集群(swarm 命令)

 1)docker-mashine  ssh 到 host1 上创建 leader

[root@localhost ~]# docker-machine ssh host1
[root@host1 ~]# docker swarm init --advertise-addr 192.168.8.201

2)docker-mashine  ssh 到 host2 加入集群

[root@localhost ~]# docker-machine ssh host2

3)docker-mashine  ssh 到 host1 上查看集群列表

到此,集群构建完毕,是一个最简单的集群

5. 新建.netcore 项目

 1)修改 ValueController.cs
// GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            var ip = HttpContext.Connection.LocalIpAddress;
            var port = HttpContext.Connection.LocalPort;
            return new string[] { ip.ToString(), port.ToString() }; }
2)修改 Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args).UseUrls("http://*:5000")
                .UseStartup<Startup>();
3)新建 dockerfile,并经属性设置为:始终复制到输出目录

FROM microsoft/dotnet:2.1-aspnetcore-runtime
MAINTAINER yishi.chen

LABEL description="DockerSwarmTest"
LABEL version="1.0"


WORKDIR /app
COPY . .
EXPOSE 5000
ENTRYPOINT ["dotnet","DockerSwarmTest.dll"]

4)构建 image 并上传到 docker-hub

5)创建 service

我们先只创建一个容器

测试接口

6)添加一个容器
[root@host1 ~]# docker service update --replicas 2 cys_web

查看运行状态

两个都已经启动

6. 模拟并发请求接口

新建一个控制台程序

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace Client { class Program { static HttpClient httpClient = new HttpClient(); static void Main(string[] args) { Parallel.For(1, 10000, i => { HttpResponseMessage response = httpClient.SendAsync(new HttpRequestMessage { Method = new HttpMethod("GET"), RequestUri = new Uri("http://192.168.8.202:5000/api/values") }).Result; var result = response.Content.ReadAsStringAsync().Result; Console.WriteLine(result); }); } } }

运行测试,结果如下:

我们发现,请求 http://192.168.8.202:5000/api/values 时,是对 service 中的两个容器实现轮询调用的,因此,docker swarm 很简单的实现了负载,我们可以再把 host3 加进集群里,再测试一下有三个容器的情况的结果。

[root@host1 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
b6qt1dnbj4hnf2jks0rnxjm8y *   host1               Ready               Active              Leader              18.09.0
p9vfq9qt6dtv929an5hzmirn9     host2               Ready               Active                                  18.09.0
uy37l58v2ooux2tju89ex1o7q     host3               Ready               Active                                  18.09.0

运行控制台测试

三台机器完成负载!!

 

至此三剑客分享完毕

Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

在 Docker 容器里面使用 docker run/docker build

Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择。而在 DevOps 中,我们需要将各种后端/前端的测试/构建环境打包成 Docker 镜像,然后在需要的时候,Jenkins 会使用这些镜像启动容器以执行 Jenkins 任务。

为了方便维护,我们的 CI 系统如 Jenkins,也会使用 Docker 方式部署。 Jenkins 任务中有些任务需要将微服务构建成 Docker 镜像,然后推送到 Harbor 私有仓库中。 或者我们所有的 Jenkins Master 镜像和 Jenkins Slave 镜像本身都不包含任何额外的构建环境,执行任务时都需要启动包含对应环境的镜像来执行任务。

我们的 Jenkins Master、Jenkins Slaves 都是跑在容器里面的,该如何在这些容器里面调用 docker run 命令启动包含 CI 环境的镜像呢? 在这些 CI 镜像里面,我们从源码编译完成后,又如何通过 docker build 将编译结果打包成 Docker 镜像,然后推送到内网仓库呢?

答案下面揭晓。

一、原理说明:/var/run/docker.sock

Docker 采取的是 Client/Server 架构,我们常用的 docker xxx 命令工具,只是 docker 的 client,我们通过该命令行执行命令时,实际上是在通过 client 与 docker engine 通信。

我们通过 apt/yum 安装 docker-ce 时,会自动生成一个 systemd 的 service,所以安装完成后,需要通过 sudo systemctl enable docker.service 来启用该服务。 这个 Docker 服务启动的,就是 docker engine,查看 /usr/lib/systemd/system/docker.service,能看到有这样一条语句:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

默认情况下,Docker守护进程会生成一个 socket(/var/run/docker.sock)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。 sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。

因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了。具体的命令见后面的「示例」部分。

要记住的是,真正执行我们的 docker 命令的是 docker engine,而这个 engine 跑在宿主机上。所以这并不是真正的 "Docker in Docker".

二、示例

在容器内部使用宿主机的 docker,方法有二:

  1. 命令行方式:将 /usr/bin/docker 映射进容器内部,然后直接在容器内部使用这个命令行工具 docker
    • 需要的时候,也可以将 /etc/docker 文件夹映射到容器内,这样容器内的 docker 命令行工具也会使用与宿主机同样的配置。
  2. 编程方式:在容器内部以编程的方式使用 docker
    • 通过 python 使用 docker: 在 Dockerfile 中通过 pip install docker 将 docker client 安装到镜像中来使用

容器的启动方式也有两种,如下:

1. 直接通过 docker 命令启动

示例命令如下:

docker run --name <name> \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/bin/docker:/usr/bin/docker \
    --user root \
    <image-name>:<tag>

**必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock 的用户)**然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。

2. 使用 docker-compose 启动

docker-compose.yml 文件内容如下:

version: ''3.3''
services:
  jenkins-master:
    image: jenkinsci/blueocean:latest
    container_name: jenkins-master
    environment:
      - TZ=Asia/Shanghai  # 时区
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - ./jenkins_home:/var/jenkins_home  # 将容器中的数据映射到宿主机
      - /usr/bin/docker:/usr/bin/docker  # 为容器内部提供 docker 命令行工具(这个随意)
      - /var/run/docker.sock:/var/run/docker.sock  # 容器内部通过 unix socket 使用宿主机 docker engine
    user: root  # 必须确保容器以 root 用户启动!(这样它才有权限读写 docker.socket)
    restart: always

然后通过 docker-compose up -d 即可后台启动容器。

Docker 中的 uid 与 gid

通过上面的操作,我们在容器内执行 docker ps 时,还是很可能会遇到一个问题:权限问题

如果你容器的默认用户是 root,那么你不会遇到这个问题,因为 /var/run/docker.sock 的 onwer 就是 root.

但是一般来说,为了限制用户的权限,容器的默认用户一般都是 uid 和 gid 都是 1000 的普通用户。这样我们就没有权限访问 /var/run/docker.sock 了。

解决办法:

方法一(不一定有效):在构建镜像时,最后一层添加如下内容:

# docker 用户组的 id,通常都是 999
RUN groupadd -g 999 docker \
    && usermod -aG docker <your_user_name>

这样我们的默认用户,就能使用 docker 命令了。

P.S. 999 不一定是 docker 用户组,所以上述方法某些情况下可能失效。这时还是老老实实通过 docker run -u root 启动容器吧。(或者在 docker-compose.yml 中添加 user: root 属性)

参考

  • Docker in Docker - 王柏元

docker 三剑客 docker-compose、docker-machine、swarm

docker 三剑客 docker-compose、docker-machine、swarm

Docker 三大编排工具:

Docker Compose:是用来组装多容器应用的工具,可以在 Swarm 集群中部署分布式应用。
Docker Machine:是支持多平台安装 Docker 的工具,使用 Docker Machine,可以很方便地在笔记本、云平台及数据中心里安装 Docker。
Docker Swarm:是 Docker 社区原生提供的容器集群管理工具。
Docker Compose
Github 地址: https://github.com/docker/compose

简单来讲,Compose 是用来定义和运行一个或多个容器应用的工具。使用 compaose 可以简化容器镜像的建立及容器的运行。
Compose 使用 python 语言开发,非常适合在单机环境里部署一个或多个容器,并自动把多个容器互相关联起来。

Compose 中有两个重要的概念:

服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose 是使用 YML 文件来定义多容器应用的,它还会用 docker-compose up 命令把完整的应用运行起来。docker-compose up 命令为应用的运行做了所有的准备工作。从本质上讲,Compose 把 YML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,从而把应用以容器化的方式管理起来。它通过解析容器间的依赖关系来顺序启动容器。而容器间的依赖关系则可以通过在 docker-compose.yml 文件中使用 links 标记指定。

安装 Docker compose:
官方文档

pip 安装:
pip install docker-compose
    
从 github 安装:
curl -L --fail https://github.com/docker/compose/releases/download/1.17.0/run.sh -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

1
2
3
4
5
6
7
卸载:

rm /usr/local/bin/docker-compose # 使用 curl 安装的
pip uninstall docker-compose # 使用 pip 卸载

1
2
3
命令说明

docker-compose --help
1
Docker Machine
Github 地址: https://github.com/docker/machine/
Docker Machine 是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境。
Docker Machine 项目基于 Go 语言实现,目前在 Github 上进行维护。

安装:

curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
chmod +x /usr/local/bin/docker-machine

1
2
3
完成后,查看版本信息:

# docker-machine -v
docker-machine version 0.13.0, build 9ba6da9

1
2
3
为了得到更好的体验,我们可以安装 bash completion script,这样在 bash 能够通过 tab 键补全 docker-mahine 的子命令和参数。
下载方法:

base=https://raw.githubusercontent.com/docker/machine/v0.13.0
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
  sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done
1
2
3
4
5
确认版本将其放置到 /etc/bash_completion.d 目录下。
然后在你的 bash 终端中运行如下命令,告诉你的设置在哪里可以找到 docker-machine-prompt.bash 你以前下载的文件 。

source /etc/bash_completion.d/docker-machine-prompt.bash
1
要启用 docker-machine shell 提示符,请添加 $(__docker_machine_ps1) 到您的 PS1 设置中~/.bashrc。

PS1=''[\u@\h \W$(__docker_machine_ps1)]\$ ''
1
使用:

Docker Machine 支持多种后端驱动,包括虚拟机、本地主机和云平台等

创建本地主机实例:
使用 virtualbox 类型的驱动,创建一台 Docker 主机,命名为 test

安装 VirtualBox:

配置源:
# cat /etc/yum.repos.d/virtualbox.repo 
[virtualbox]
name=Oracle Linux / RHEL / CentOS-$releasever / $basearch - VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc

#安装 VirtualBox:
yum search VirtualBox
yum install -y VirtualBox-5.2
/sbin/vboxconfig    # 重新加载 VirtualBox 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
创建主机:

#  docker-machine create -d virtualbox test
Running pre-create checks...
Creating machine...
(test) Copying /root/.docker/machine/cache/boot2docker.iso to /root/.docker/machine/machines/test/boot2docker.iso...
(test) Creating VirtualBox VM...
(test) Creating SSH key...
(test) Starting the VM...
(test) Check network to re-create if needed...
(test) Found a new host-only adapter: "vboxnet0"
(test) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
也可以在创建时加上如下参数,来配置主机或者主机上的 Docker。

--engine-opt dns=114.114.114.114   #配置 Docker 的默认 DNS
--engine-registry-mirror https://registry.docker-cn.com #配置 Docker 的仓库镜像
--virtualbox-memory 2048 #配置主机内存
--virtualbox-cpu-count 2 #配置主机 CPU
1
2
3
4
更多参数请使用 docker-machine create --driver virtualbox --help 命令查看。

查看主机:

# docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
test   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.05.0-ce          
1
2
3
创建主机成功后,可以通过 env 命令来让后续操作目标主机:

docker-machine env test
1
可以通过 SSH 登录到主机:

docker-machine ssh test
1
官方支持驱动:

# 通过 -d 选项可以选择支持的驱动类型。
amazonec2
azure
digitalocean
exoscale
generic
google
hyperv
none
openstack
rackspace
softlayer
virtualbox
vmwarevcloudair
vmwarefusion
vmwarevsphere
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
第三方驱动请到 第三方驱动列表 查看

常用操作命令:

active   查看活跃的 Docker 主机
config   输出连接的配置信息
create   创建一个 Docker 主机
env      显示连接到某个主机需要的环境变量
inspect  输出主机更多信息
ip       获取主机地址
kill     停止某个主机
ls       列出所有管理的主机
provision 重新设置一个已存在的主机
regenerate-certs 为某个主机重新生成 TLS 认证信息
restart  重启主机
rm       删除某台主机
ssh SSH  到主机上执行命令
scp      在主机之间复制文件
mount    挂载主机目录到本地
start    启动一个主机
status   查看主机状态
stop     停止一个主机
upgrade  更新主机 Docker 版本为最新
url      获取主机的 URL
version  输出 docker-machine 版本信息
help     输出帮助信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
每个命令,又带有不同的参数,可以通过 docker-machine COMMAND --help 查看。

Docker Swarm
Docker Swarm 是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎,成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm 区分开来。

Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm 集群具备与 Mesos、Kubernetes 竞争的实力。

基本概念
Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。

节点:
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node)

节点分为管理 (manager) 节点和工作 (worker) 节点

管理节点:用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。
工作节点:是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。也可以通过配置让服务只运行在管理节点。
集群中管理节点与工作节点的关系如下所示:

服务和任务:
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务。
两种模式通过 docker service create 的 --mode 参数指定。
容器、任务、服务的关系如下所示:


swarm:
从 v1.12 开始,集群管理和编排功能已经集成进 Docker Engine。当 Docker Engine 初始化了一个 swarm 或者加入到一个存在的 swarm 时,它就启动了 swarm mode。没启动 swarm mode 时,Docker 执行的是容器命令;运行 swarm mode 后,Docker 增加了编排 service 的能力。
Docker 允许在同一个 Docker 主机上既运行 swarm service,又运行单独的容器。

node:
swarm 中的每个 Docker Engine 都是一个 node,有两种类型的 node:manager 和 worker。    
为了向 swarm 中部署应用,我们需要在 manager node 上执行部署命令,manager node 会将部署任务拆解并分配给一个或多个 worker node 完成部署。manager node 负责执行编排和集群管理工作,保持并维护 swarm 处于期望的状态。swarm 中如果有多个 manager node,它们会自动协商并选举出一个 leader 执行编排任务。woker node 接受并执行由 manager node 派发的任务。默认配置下 manager node 同时也是一个 worker node,不过可以将其配置成 manager-only node,让其专职负责编排和集群管理工作。work node 会定期向 manager node 报告自己的状态和它正在执行的任务的状态,这样 manager 就可以维护整个集群的状态。

service:
service 定义了 worker node 上要执行的任务。swarm 的主要编排任务就是保证 service 处于期望的状态下。
举一个 service 的例子:在 swarm 中启动一个 http 服务,使用的镜像是 httpd:latest,副本数为 3。manager node 负责创建这个 service,经过分析知道需要启动 3 个 httpd 容器,根据当前各 worker node 的状态将运行容器的任务分配下去,比如 worker1 上运行两个容器,worker2 上运行一个容器。运行了一段时间,worker2 突然宕机了,manager 监控到这个故障,于是立即在 worker3 上启动了一个新的 httpd 容器。这样就保证了 service 处于期望的三个副本状态。

默认配置下 manager node 也是 worker node,所以 swarm-manager 上也运行了副本。如果不希望在 manager 上运行 service,可以执行如下命令:

docker node update --availability drain master
1
创建 swarm 集群
Swarm 集群由管理节点和工作节点组成。现在我们来创建一个包含一个管理节点和两个工作节点的最小 Swarm 集群。

初始化集群:
使用 Docker Machine 创建三个 Docker 主机,并加入到集群中

首先创建一个 Docker 主机作为管理节点:

docker-machine create -d virtualbox manger
1
使用 docker swarm init 在管理节点初始化一个 Swarm 集群

docker-machine ssh manger

docker@manger:~$ docker swarm init --advertise-addr 192.168.99.101
Swarm initialized: current node (fwh0yy8m8bygdxnsl7x1peioj) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2acj2brip56iee9p4hc7klx3i6ljnpykh5lx6ea3t9xlhounnv-70knqo263hphhse02gxuvja12 192.168.99.101:2377

To add a manager to this swarm, run ''docker swarm join-token manager'' and follow the instructions.

docker@manger:~$

1
2
3
4
5
6
7
8
9
10
11
12
13
注意:如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP。

执行 docker swarm init 命令的节点自动成为管理节点。

增加工作节点:
在 docker swarm init 完了之后,会提示如何加入新机器到集群,如果当时没有注意到,也可以通过下面的命令来获知 如何加入新机器到集群。

# docker swarm join-token worker [--quiet]
# docker swarm join-token manager [--quiet]
1
2
根据 token 的不同,我们来区分加入集群的是 manager 节点还是普通的节点。通过加入–quiet 参数可以只输出 token,在需要保存 token 的时候还是十分有用的。

上一步初始化了一个 Swarm 集群,拥有了一个管理节点,下面继续创建两个 Docker 主机作为工作节点,并加入到集群中。

# docker-machine create -d virtualbox worker1

# docker-machine ssh worker1
docker@worker1:~$ docker swarm join --token SWMTKN-1-2acj2brip56iee9p4hc7klx3i6ljnpykh5lx6ea3t9xlhounnv-70knqo263hphhse02gxuvja12 192.168.99.101:2377
This node joined a swarm as a worker.
docker@worker1:~$                 


# docker-machine create -d virtualbox worker2
# docker-machine ssh worker2
docker@worker2:~$ docker swarm join --token SWMTKN-1-2acj2brip56iee9p4hc7klx3i6ljnpykh5lx6ea3t9xlhounnv-70knqo263hphhse02gxuvja12 192.168.99.101:2377
This node joined a swarm as a worker.
docker@worker2:~$ 
1
2
3
4
5
6
7
8
9
10
11
12
13
查看集群:
在 manager machine 上执行 docker node ls 查看有哪些节点加入到 swarm 集群。

# docker-machine ssh manger
docker@manger:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
fwh0yy8m8bygdxnsl7x1peioj *   manger              Ready               Active              Leader              18.05.0-ce
0v6te4mspwu1d1b4250fp5rph     worker1             Ready               Active                                  18.05.0-ce
mld8rm9z07tveu1iknvws0lr1     worker2             Ready               Active                                  18.05.0-ce        

1
2
3
4
5
6
7
部署服务
使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。

新建服务:
在上一节创建的 Swarm 集群中运行一个名为 nginx 服务:

docker@manger:~$ docker service create --replicas 3 -p 80:80 --name nginx nginx
khw3av021hlxs3koanq85301j
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
docker@manger:~$ 

1
2
3
4
5
6
7
8
9
使用浏览器,输入任意节点 IP , 即可看到 nginx 默认页面。

查看服务:
使用 docker service ls 来查看当前 Swarm 集群运行的服务。

docker@manger:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
khw3av021hlx        nginx               replicated          3/3                 nginx:latest        *:80->80/tcp
docker@manger:~$            

1
2
3
4
5
使用 docker service ps 来查看某个服务的详情。

docker@manger:~$ docker service ps nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR                   PORTS
6b900c649xyp        nginx.1             nginx:latest        worker1             Running             Running 5 minutes                                       
n55uhpjdurxs        nginx.2             nginx:latest        worker2             Running             Running 5 minutes ago                                   
l2uiyggbegsf        nginx.3             nginx:latest        manger              Running             Running 5 minutes ago                                   
docker@manger:~$    

1
2
3
4
5
6
7
使用 docker service logs 来查看某个服务的日志:

docker@manger:~$ docker service logs nginx
1
服务伸缩:
可以使用 docker service scale 对一个服务运行的容器数量进行伸缩

当业务处于高峰期时,我们需要扩展服务运行的容器数量

$ docker service scale nginx=5
1
当业务平稳时,我们需要减少服务运行的容器数量

$ docker service scale nginx=2
1
删除服务:
使用 docker service rm 来从 Swarm 集群移除某个服务。

$ docker service rm nginx
1
使用 compose 文件

管理敏感数据

管理配置信息

更多 swarm 的资料可以参考:《每天 5 分钟玩转 Docker 容器技术》Docker Swarm 部分

参考链接:
https://blog.csdn.net/wh211212/article/details/78686241
https://yeasy.gitbooks.io/docker_practice/content/swarm/

docker-compose

安装 compose
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
测试安装
$ docker-compose --version

docker-compose version 1.21.2, build 1719ceb

常用命令

命令:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

https://docs.docker.com/compose/overview/

https://blog.csdn.net/Dante_003/article/details/70160493

docker-machine

简介

docker-machine 是安装 docker 环境的一个工具,可以在一台机器上通过命令控制几台机器安装 docker 环境,运行 docker 命令,创建 docker swarm 集群的工具。
安装
docker-machine 和 compose 有点类似,都是一个可运行的 linux 二进制文件 (下面都是基于 linux 版本做的),下载下来这个文件后放到 /usr/local/bin 里面设置文件权限就可以直接使用了,docker-machine 的 github 地址
https://github.com/docker/machine

curl -L https://github.com/docker/machine/releases/download/v0.10.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
    chmod +x /tmp/docker-machine &&
    sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
使用
按照 docker-machine github 上的介绍,它是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装 Docker,比如 VirtualBox、 Digital Ocean、Microsoft Azure。根据他的描述和 github 上的例子可以看出他可以直接在指定平台上创建机器。
我们这里只测试已经创建好有 ip 的实体机或者虚拟机。
docker-machine 操作各个机器实际上用 ssh 无密码访问的,如果是在已经配置好 ip 的实体机或虚拟机上用就要手动或者使用脚本设置无密码访问了。

 无密码访问
ssh-keygen #一直回车
ssh-copy-id root@192.168.1.28 #ip 为 docker-machine 要操作的机器,输入密码
## 上面结束之后,每台机器上还得安装 net-tools,docker-machine 会用到 netstat 命令来检测端口使用情况,如果机器上没有安装会报错。如果你确定那台机器上的端口没问题,即使报错也没问题,最终那台机器还是会加入到 docker-machine 的管理中。
yum install net-tools

    连接机器
docker-machine create -d generic --generic-ip-address=192.168.1.28 node28

node28 为给机器的别名
-d generic 驱动类型
–generic-ip-address 要控制机器的 ip,必须
–generic-engine-port docker-engine 的远程访问端口,默认为 2376
–generic-ssh-key 远程访问机器的私钥,默认使用.ssh/ 下面的私钥
–generic-ssh-user 远程访问机器的用户名,默认为 root
–generic-ssh-port 远程 ssh 访问的端口,默认为 22
–engine-insecure-registry docker-engine 的 insecure-registry
–engine-install-url 安装 docker-engine 的地址,默认为”https://get.docker.com”
–engine-registry-mirror docker-engine 镜像的代理地址
上面的命令根据国内环境可以换为下面

docker-machine create \
-d generic \
--generic-ip-address=192.168.1.28 \
--engine-install-url=https://get.daocloud.io/docker/   \
--engine-registry-mirror=http://91c0cc1e.m.daocloud.io  \
node28 
通过 docker-machine 连接了各个机器后,就可以通过 docker-machine 来操作各个机器了,更多命令查看 docker-machine –help

https://docs.docker.com/machine/install-machine/

https://blog.csdn.net/vchy_zhao/article/details/70238472

swarm

简介
swarm 从 docker1.9 版本开始就有了,但功能不完善、性能不稳定,一直不能登入生产环境,从 1.12 版本内置到了 docker-engine 中,可以直接使用 docker swarm 命令来操作 swarm。
swarm 是 docker 集群的资源管理工具。简单点理解,在很多台机器上部署 docker,组成一个 docker 集群,并把整个集群的资源抽象成资源池,使用者部署 docker 应用的时候,只需要将应用交给 swarm,swarm 会根据整个集群资源的使用情况来分配资源给部署的 docker 应用,可以将这个集群的资源利用率达到最大。
类似的服务框架还有 mesos+marathon,kubernetes。
编者是从很早接触 docker 的,swarm 还没有出来,kubernetes 还不成熟没有人在生产环境使用。
①最早使用的是 mesos+marathon 那一套,优点是基于成熟的资源调度管理框架 mesos,缺点是部署起来还是很麻烦的,像服务发现、负载均衡等概念在里面也都有,但都是碎片化以插件的形式存在,整个体系感觉不是很完善、不像一个整体。
②kubernetes 从发布 1.0 版本以后在生产得到了很多实践,开始步入主流压过 swarm 和 mesos+marathon,kubernetes 针对 docker 应用集群的特点,概括出几个对象,pod、service、replication controller,pod 为运行的基本单元,service 则是专门来服务发现和服务代理的,replication controller 应用的副本做负载均衡。kubernetes 就是一个很专业很全面完善的 docker 集群管理工具。
③swarm 在很多方面很像 kubernetes,不知道是不是偷偷抄袭的。swarm 通过命令就可以很简单的在 docker 集群中创建应用设置副本数量,内置服务发现代理。swarm+compose≈kubernetes。swarm 由于现在内置于 docker 中,使用部署更简单,功能上和 kubernetes 很相似,轻量级。
常用命令
    swarm init
    swarm join
    service create
    service inspect
    service ls
    service rm
    service scale
    service ps
    service update

https://docs.docker.com/engine/swarm/#feature-highlights

https://blog.csdn.net/Dante_003/article/details/70171804
--------------------- 

前言

你是否曾经和我一样,想了解一个新的中间件,如 redis、kafka、zookeeper 等,发现无论是单点还是集群搭建过程都异常繁琐,甚至占用了一半以上的学习时间?很多中间件都是基于 linux 系统的,但是你却要在 windows 上做文章?作为一个后端程序员,我只想学习一下中间件怎么使用,却被这种繁琐的过程限制住了手脚,抑或是半途而废?
正所谓,工欲善其事,必先利其器。Docker 可以完美的解决我们以上的痛点,而且安装过程简单。
本文参照 Docker 官方文档 https://docs.docker.com/,基于 windows 系统,Linux 和 Mac 系统除了安装过程不同之外其余过程均相同。

一、安装 Docker

步骤一

下载安装 DockerToolBox: https://docs.docker.com/toolbox/overview/

image.png

 

步骤二

安装成功之后会有三个图标出现,Docker Quickstart 基本上不用,常用的是另两个,打开 VM 更新到最新版本(因为旧版本打开 Kitematic 的时候容易卡死)

 

image.png

步骤三

打开 Kitematic 软件,点击 hello-world-nginx 的 CREATE 按钮,创建一个容器,如果能正常跑起来就证明安装成功了。

 

image.png

二、Docker Machine

经过上面过程我们已经在 Windows 里面成功安装了 docker 环境,但本质上 Kitematic 软件底层利用的是 VirtualBox 虚拟机和 DockerMachine,那么什么是 Docker Machine?

1、Docker Machine 概念

Docker Machine 就是创建 Docker 环境的机器,简单说就是有了 Docker Machine 就可以在任何系统任何平台上快速的搭建 Docker 环境了。

2、利用 Docker Machine 快速创建 Docker 环境

创建 Docker 虚拟机

打开 cmd 窗口,执行命令 docker-machine create --driver=virtualbox machine1
该命令以 virtualbox 为介质快速创建一个包含有 docker 环境的虚拟机。命令执行完成之后打开 virtualbox 界面如下:
可以看到 machine1 正在运行,双击进入该虚拟机可以执行 docker 的所有命令。
你可以利用上面的命令继续创建多个含有 Docker Engine 的多个虚拟机

 

image.png

进入 Docker 虚拟机

打开 cmd 窗口,执行命令 docker-machine ssh machine1
该命令可以通过 cmd 窗口进入到 machine1 环境,因为 virtualbox 的复制粘贴操作没有 cmd 窗口那么便捷,所以我一般复制命令的时候都使用 cmd 窗口 ssh 进入

其他 Docker machine 命令

docker-machine start/stop 可以删除容器关闭和不删除容器关闭虚拟机
更多命令请参考 https://docs.docker.com/machine/reference/

三、Docker Compose

1、Dcoker Compose 概念

Docker Compose 可以有组织的启动同属于一个服务的多个容器
换句话说 当一个服务包含多个容器的时候,docker compose 可以通过 yaml 文件预先配置,然后统一启动

2、Docker Compose 安装

三步走:进入 machine1、切换 root 用户、安装及更改 compose 权限
1.21.1 为版本,可以到 https://github.com/docker/compose/releases 去查看可更换的 compose 版本

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

3、Compose 的使用

以三节点的 zookeeper 伪集群为例,最重要的就是 yaml 文件,这个是构建服务的蓝图
首先:随便在哪个目录下创建一个 docker-compose.yml 文件(注意名称必须为 docker-compose),内容如下
然后:进入 docker-compose.yml 目录,执行 docker-compose up -d (-d 表示后台运行)结果如图

version: ''3.1''

services:
  zoo1:
    image: zookeeper
    restart: always
    hostname: zoo1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

  zoo2:
    image: zookeeper
    restart: always
    hostname: zoo2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888

  zoo3:
    image: zookeeper
    restart: always
    hostname: zoo3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888

 

image.png


再次:检查 zookeeper 伪集群是否安装成功,使用 docker ps 查看正在运行的容器,记下 ID
然后:通过 docker exec -it id /bin/bash 进入 zookeeper 下,进入 bin 目录,执行 zkCli.sh 就可以执行 zookeeper 命令了!

image.png


就这样伪集群瞬间搭建好,跟谁说理去?

 

4、yml 模板说明:

  • version 对应 compose 和 Engine 版本

     

    image.png

  • services 对应多个容器
  • zoo1/2/3 为容器名称
  • image 表示基于的镜像为 zookeeper
  • environment 表示环境变量
  • ports 前面的端口号表示容器宿主机的端口号,后面的端口号表示容器的端口号
  • 其他顾名思义

4、Compose yml 其他语法

https://docs.docker.com/compose/compose-file/


四、Docker Swarm

上面两位剑客完成了 Docker 环境搭建和容器的编排工作,swarm 则用来完成多台机器(可物理可虚拟)之间容器集群的管理,Swarm 是 docker 自带的一种模式,内嵌到 docker 里,不用额外安装。

1、Swarm 中的重要概念

  • 节点:NODE,一个节点本质上是一个包含 Docker Engine 环境的机器,可以是物理机也可以是虚拟机,我们这里可以是自己构建的 docker machine。Node 分为两种,一种为 leader,一种为 worker,前者负责分派工作,后者负责执行工作,同一个 NODE 可以同时有两种角色。
  • 服务:Service,运行在节点上包含一个或者多个 task 的综合体,每个 task 都由一个容器和容器内部运行的一些命令共同代表。
  • 负载均衡:使用内部负载均衡,访问任何节点端口都会通过负载均衡找到服务,即便当前 node 没有服务

    image.png

2、快速搭建一个 Swarm 集群

步骤一:

打开 cmd 窗口,使用 docker-machine create xxx 创建一个 manager 环境和两个 worker 环境,创建完成可以打开 virtualbox 查看

 

image.png

步骤二:

在 manager 节点即图中的 machine1 节点内,执行命令
docker swarm init --advertise-addr 192.168.99.101 注意后边的 IP 为当前机器的 IP 可以通过 cmd 窗口的 docker-machine ip machine1 查看。--advertise-addr 表示设置 mannager

$ docker swarm init --advertise-addr 192.168.99.101
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377

To add a manager to this swarm, run ''docker swarm join-token manager'' and follow the instructions.

步骤三:

上一步中其实已经给出了加入 swarm 的命令了,如果没记住可以在 mananger 节点执行 docker swarm join-token worker 命令查看

docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.99.101:2377
执行完上述命令后会有成功的提示

在 Manager 节点执行 docker node ls 可以查看当前节点

 

image.png

步骤四:

至此 Docker swarm 集群搭建完成,该集群包含三个节点,一个 Manager 和两个 worker,Manager 本质上也是一个 worker,都可以执行任务。

3、在 Swarm 上操作服务

  • 发布:
    随便在哪个节点上执行命令
    docker service create
    --replicas 3
    --name redis
    --update-delay 10s
    redis:3.0.6
    就可以发布一个 3.0.6 版本的 Redis 了,replicas 表示有三个副本,update-delay 表示当升级的时候,一个节点升级成功之后的 10 秒后才升级另一个节点
  • 升级:
    docker service update --image redis:3.0.7 redis
    这个过程是滚动的,即一个接一个升级
  • 查看:
    docker service inspect --pretty redis
    或者 docker service ps redis
  • 删除:
    docker service rm redis
  • 停止 / 重启节点:
    docker node update --availability drain worker1
    该命令停止了节点 worker1,停止之后不接受新的请求,不接受 manager 分派
    docker node update --availability active worker1
    该命令重启了节点,使其恢复 active 状态
  • 指定端口:
    docker service create
    --name my-web
    --publish published=8080,target=80
    --replicas 2
    nginx
    该命令指定了访问端口为 8080,映射 docker80 端口,可以通过任何节点访问到如 192.168.99.101:8080

4、Swarm && Compose

上面 Swarm 发布的 Service 都是单个容器的,多个容器如何操作呢?首先我们会联想到 Compose,但是 Comopse 旧版本只支持在单个 Host 上发布,在集群里就需要 Compose 新版本了!先保证 Compose 是 v3 以上吧!
去这个网址 https://github.com/docker/compose/releases/ 查看 compose 版本和 compose yml 版本的对应关系

image.png


Swarm 发布 Compose 编排的 Service 过程:

 

步骤一:

编排 docker-compose.yml 模板文件,此处命名可以随便起,与 Compose 不同
下面的 yml 文件来自官方 https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md

  • version 必须是 3 及以上
  • 该服务包含 redis、db、vote 服务(投票功能)、result 服务(统计结果)等等
version: "3"
services:
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:

步骤二:

执行命令 docker stack deploy --compose-file docker-compose.yml vote 启动基于 yml 文件的名称为 vote 的服务
注意 docker stack 不支持 build,需要事先指定镜像

 

image.png

步骤三:

这样多个容器就以服务的形式发布到集群里面了!通过 192.168.99.101:5000 访问即可看到页面!
docker stack services vote:可以查看服务状态
docker stack rm vote:可以删除服务

image.png


Docker-Compose 所有命令参数可以参考:https://docs.docker.com/compose/compose-file/

 

五、Docker 基础

docker 主要由仓库、镜像、容器三个概念组成!下图中显示了三者之间的关系

  • 把镜像理解为软件安装包
  • 把容器理解为使用的软件
  • 把仓库理解为安装包下载网站

image.png

一:对于镜像:

1: 增加镜像:
A:从仓库下载:docker pull NAME:TAG
A1: 例子:docker pull ubuntu:latest
A2: 例子:docker pull ubuntu 同上
A3: 例子:docker pull ubuntu:14.04
B:创建镜像:
B1: 基于已有镜像的容器创建:docker commit 已经修改过的容器,如 docker 容器里创建了文件的镜像
B11:docker commit -m “消息” -a “作者信息” a925948cb23d(容器 ID) test:0.1(标签)
B2: 基于本地模板导入
B3: 基于 Dockerfile 创建
C:存出镜像:docker save -o xxx.tar xxx:latest 即可保存成 tar 文件
D:载入镜像:docker load < xxx.tar 即可载入 tar 文件
2: 删除镜像:
A:删除镜像:docker rmi image image 可以为标签也可以为 id
A1:-f 强行删除
3: 修改镜像:
A:给镜像打标签:docker tag ubuntu:latest myubuntu:latest

4: 查看镜像:
A:列出镜像:docker images
A1:-a 列出所有的镜像文件
A2:-q 仅输出 ID 信息
B:详细信息:docker inspect ubuntu:latest
C:查看历史:docker history ubuntu:latest
5: 搜索镜像:
A:搜索镜像:docker search -s 3 —automated ubuntu 搜索 3 星以上自动创建的 ubutnu 镜像
6: 上传镜像:
A:先加标签:docker tag xxx:14.04 user/test:latest
再往上推:docker push user/test:latest
B:上传到 docker hub 里面,跟 git 很类似

7:Dockerfile 详解:
构建:
Kind1:在 dockerfile 所在目录执行:docker build -t nginx:v3 .
Kind2: 直接用 gitRepo 构建:docker build git 路径:版本
解释:BS 架构,dockerfile 所在目录应该为空目录,所有需要复制或者添加的文件都应该复制到该目录下,这个路径是一个上下文 Context,构建过程中会把上下文发送给 Docker 引擎
A:FROM 命令:以什么为基础,可以是已经存在的镜像,也可以是虚拟镜像 scratch
B:RUN 命令:与直接在容器内命令行中输入的命令一样的效果,为了减少层数,可以使用 \ 和 && 结合的方式,换行并继续的意思
C:COPY 命令:COPY package.json /usr/src/app,前者为上下文中的路径,后者可以为绝对路径,也可以为 WORKDIR 目录的相对路径
D:ADD 命令:与 COPY 一至,源路径可以为 url,可以为 tar 文件,只在自动解压缩的场合使用 ADD,其余一律用 RUN
E:CMD 命令:制定容器启动时所要执行的命令,只能执行一次,多次会覆盖,CMD 【“可执行程序”,“param1”,“parma2”】
F:ENTRYPOINT 命令:格式与 RUN 相同,给容器配置一个可执行程序格式与 CMD 相同,docker run 指令不会覆盖 ENTRYPOINT 命令而会覆盖 CMD 命令,比如 - i
G:ENV 命令:设 dockerfile 的环境变量 ENV key value,之后的命令可以使用 ENV 定义的环境变量,容器内也可以使用
H:VOLUME 命令:VOLUME /data,匿名卷容器内的/data 映射入主机了
I:EXPOSE 命令:声明端口 EXPOSE 80 8080
J:WORKDIR:指定工作目录,或者成为当前目录,如果目录不存在 WORKDIR 会帮你创建
K:USER 命令:制定当前用户

二:对于容器:
1: 创建容器:
A:创建容器:docker create -it ubuntu:latest
保持标准输入打开:-i
后台运行容器:-d
分配一个伪终端:-t
B:创建并启动容器:docker run ubuntu /bin/bash
2: 删除容器:
A:docker rm 命令删除:
B:删除所有:sudo docker rm $(docker ps -a -q)
3: 停止容器:
A:优雅的停止:docker stop dockerID
B:直接杀死:docker kill id
4: 查看容器:docker ps
A:获取容器输出信息:docker logs id
5: 进入容器:
A:exec 命令:docker exec -it dockerID /bin/bash
B:nsenter 工具:可以去查
6: 容器互联:
A:docker run -d -P —name dockerName1 --link dockerName2:dockerName2Alias ubuntu:14.04
B:
7: 启动容器:
A:docker start af(容器 ID)
B:重启:docker restart id
C:启动容器会自动在镜像层外挂载一层可读写层
D:直接从镜像启动容器:docker run -i -t -d -p 8080:8080 --name myname ubuntu:latest
8: 导入导出容器:
A:导出容器:docker export -o xxx.tar dockerID
B:导入容器:docker import xxx.tar - dockerName

三:对于仓库:
1: 创建私有仓库:
A:创建本地/tmp/registry 位置的仓库 docker run -d -p 5000:5000 registry
B:创建制定路径仓库 docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
2: 从国内镜像下载镜像:
A:从时速云下载镜像:docker pull index.tenxcloud.com/docker_library/ 镜像:标签

四:对于数据:
1: 数据卷:
A:容器内数据直接映射到本地主机环境
B:数据卷可以被多个容器共享和重用
C:对数据卷修改立马生效,并且更新数据卷不影响镜像
D:数据卷会一直存在,直到没有容器使用才可以安全卸载
E:挂载数据卷到容器内目录的两种方法:
E1:docker run -d -P --name web -v /webapp ubuntu:14.04 把容器的 webapp 目录映射到主机上
E2:挂载指定目录到容器:docker run -d -P --name web -v /src/webapp(主机目录):/opt/webapp(容器内目录):ro ubuntu:14.04 加上:ro 后容器对锁挂在的数据卷内数据就无法修改了
E3:可以挂载单个文件到容器内目录作为数据卷,不推荐
F:删除数据卷:docker rm -v
2: 数据卷容器:
A:使用特定容器维护数据卷
B:操作流程:
B1: 创建数据卷容器:docker run -v /dbdata —name dbdata ubuntu
B2: 在其他容器使用 —volumes-from dbdata 即可挂载改容器,可以寄连挂在,也可以挂载多个数据卷容器

总结:

本篇博客涵盖了 Docker 自家的所有内容,从 Docker 基础到 Docker 三剑客都有解析,可以作为入门指导。
有了 docker 之后我们就可以随便的安装那些安装过程复杂的软件了,如果你看懂了,请给我一点鼓励哦!


 

三剑客简介

docker-machine

docker 技术是基于 Linux 内核的 cgroup 技术实现的,那么问题来了,在非 Linux 平台上是否就不能使用 docker 技术了呢?答案是可以的,不过显然需要借助虚拟机去模拟出 Linux 环境来。
docker-machine 就是 docker 公司官方提出的,用于在各种平台上快速创建具有 docker 服务的虚拟机的技术,甚至可以通过指定 driver 来定制虚拟机的实现原理(一般是 virtualbox)。

docker-compose

docker 镜像在创建之后,往往需要自己手动 pull 来获取镜像,然后执行 run 命令来运行。当服务需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是令人感到十分厌烦的。
dcoker-compose 技术,就是通过一个.yml 配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行 docker-compose up 命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署。

docker-swarm

swarm 是基于 docker 平台实现的集群技术,他可以通过几条简单的指令快速的创建一个 docker 集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。

docker-compose 的工作流程

使用 Compose 仅需要三步:

1、用一个定义你的应用程序的环境,Dockerfile 这样它就可以在任何地方再现。
2、定义组成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
3、运行 docker-compose up 和撰写启动并运行您的整个应用程序。

参考文章:https://docs.docker.com/compose/overview/

docker-compose 安装布署

[root@docker ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    396      0 --:--:--  0:00:01 --:--:--   397
100 10.3M  100 10.3M    0     0   678k      0  0:00:15  0:00:15 --:--:-- 1876k
[root@docker ~]# chmod +x /usr/local/bin/docker-compose 
[root@docker ~]# docker-compose --version
docker-compose version 1.21.2, build a133471

docker-compose 管理命令介绍

Compose 具有管理应用程序整个生命周期的命令:

  • 启动,停止和重建服务
  • 查看正在运行的服务的状态
  • 流式传输运行服务的日志输出
  • 在服务上运行一次性命令
[root@docker ~]# docker-compose --help
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
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -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
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert deploy
                              keys in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

docker-compose 运行时是需要指定 service 名称,可以同时指定多个,也可以不指定。不指定时默认就是对配置文件中所有的 service 执行命令。

-f #用于指定配置文件
-p #用于指定项目名称

docker-compose build 
用来创建或重新创建服务使用的镜像
docker-compose build service_a
创建一个镜像名叫 service_a

docker-compose kill
用于通过容器发送 SIGKILL 信号强行停止服务

docker-compose logs
显示 service 的日志信息

docker-compose pause/unpause
docker-compose pause #暂停服务
docker-compose unpause #恢复被暂停的服务

docker-compose port
用于查看服务中的端口与物理机的映射关系
docker-compose port nginx_web 80 
查看服务中 80 端口映射到物理机上的那个端口

dokcer-compose ps
用于显示当前项目下的容器
注意,此命令与 docker ps 不同作用,此命令会显示停止后的容器(状态为 Exited),只征对某个项目。

docker-compose pull
用于拉取服务依赖的镜像

docker-compose restart
用于重启某个服务中的所有容器
docker-compose restart service_name
只有正在运行的服务可以使用重启命令,停止的服务是不可以重启

docker-compose rm
删除停止的服务(服务里的容器)

-f #强制删除
-v #删除与容器相关的卷(volumes)

docker-compose run
用于在服务中运行一个一次性的命令。这个命令会新建一个容器,它的配置和 srvice 的配置相同。
但两者之间还是有两点不同之处

1、run 指定的命令会直接覆盖掉 service 配置中指定的命令
2、run 命令启动的容器不会创建在 service 配置中指定的端口,如果需要指定使用 --service-ports 指定

docker-compose start/stop
docker-compose start 启动运行某个服务的所有容器
docker-compose stop 停止运行某个服务的所有容器

docker-compose scale
指定某个服务启动的容器个数

[root@docker ~]# docker-compose scale --help
Numbers are specified in the form `service=num` as arguments.
For example:

    $ docker-compose scale web=2 worker=3

This command is deprecated. Use the up command with the `--scale` flag
instead.

Usage: scale [options] [SERVICE=NUM...]

Options:
  -t, --timeout TIMEOUT      Specify a shutdown timeout in seconds.
                             (default: 10)

docker-compose 配置文件实例

一个 docker-compose.yml 的实例文件如下

version: "3"
services:
  nginx:
    container_name: web-nginx
    image: nginx:latest
    restart: always
    ports:
      - 80:80
    volumes:
    - ./webserver:/webserver
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf

下面将配置文件做个简单的解释说明

docker-compose的配置文件是一个.yml格式的文件
第一部分
version: "3"  #指定语法的版本
第二部分
services:     #定义服务
  nginx:      #服务的名称,-p参数后接服务名称
    container_name: web-nginx    #容器的名称
    image: nginx:latest          #镜像
    restart: always
    ports:                       #端口映射
      - 80:80
第三部分
volumes:       #物理机与容器的磁盘映射关系
    - ./webserver:/webserver
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf

整体的目录结构如下

[root@docker docker]# tree ./
./
├── docker-compose.yml
├── nginx
│?? └── nginx.conf
└── webserver
    └── index.html

2 directories, 3 files

配置文件如下

[root@docker docker]# cat webserver/index.html 
welcome to nginx server!!!!!!!!!
[root@docker docker]# cat nginx/nginx.conf
#user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  ''$remote_addr - $remote_user [$time_local] "$request" ''
                      ''$status $body_bytes_sent "$http_referer" ''
                      ''"$http_user_agent" "$http_x_forwarded_for"'';

    access_log  /var/log/nginx/access.log  main;
    client_max_body_size 10m;  
    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /webserver;
        index  index.html index.htm;
    }

}
    include /etc/nginx/conf.d/*.conf;
}

使用命令启动容器

[root@docker docker]# docker-compose up -d
Pulling nginx (nginx:1.14)...
Trying to pull repository docker.io/library/nginx ... 
1.14: Pulling from docker.io/library/nginx
f2aa67a397c4: Already exists
6160d1ac49e9: Pull complete
046b67408776: Pull complete
Digest: sha256:85ab7c44474df01422fe8fdbf9c28e497df427e8a67ce6d47ba027c49be4bdc6
Status: Downloaded newer image for docker.io/nginx:1.14
Creating nginx-server ... done
[root@docker docker]# lsof -i :80
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
docker-pr 891 root    4u  IPv6 1187080      0t0  TCP *:http (LISTEN)
[root@docker docker]# docker ps |grep nginx
07ca899cc44b   nginx:1.14   "nginx -g ''daemon ..."   29 seconds ago  Up 28 seconds  0.0.0.0:80->80/tcp  nginx-server
#如果启动时不指定里面的服务名称,就是直接启动配置文件里所有的服务

浏览器测试是否正常访问
容器技术|Docker三剑客之docker-compose
然后我们修改相应的首页文件如下

[root@docker docker]# cat webserver/index.html 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome to nginx web stie</title>
</head>
<body>
   <h2>欢迎来nginx站点</h2>
</body>
</html>

再次打开浏览器查看效果
容器技术|Docker三剑客之docker-compose
#是不是非常的方便

使用 Docker-Compose 部署 nginx 代理 Tomcat 集群,实现负载均衡

大体步骤分为以下四步

1、下载所需的文件 tomcat,jdk
2、编写 dockerfile 来布署 tomcat 与 java 环境,生成镜像文件
3、编写 docker-compose.yml 配置文件,启动所有容器服务
4、测试负载均衡

具体配置文件如下

#整个目录结构
[root@master java]# tree ./
./
├── docker-compose.yml
├── etc
│   └── localtime
├── nginx
│   └── nginx.conf
├── tomcat
│   ├── apache-tomcat-8.5.31.tar.gz
│   ├── Dockerfile
│   └── jdk-8u144-linux-x64.tar.gz
└── webserver
    ├── tomcatA
    │   └── index.jsp
    └── tomcatB
        └── index.jsp

6 directories, 8 files

两个测试首页文件

[root@master java]# cat webserver/tomcatA/index.jsp 
welcome to tomcat-A server
[root@master java]# cat webserver/tomcatB/index.jsp 
welcome to tomcat-B server

配置文件

[root@master java]# cat docker-compose.yml 
version: "3"
services:
  nginx:
    image: nginx:1.14
    restart: always
    ports:
      - 80:80
    links:
      - tomcat1:tomcat1
      - tomcat2:tomcat2
    volumes:
      - ./webserver:/webserver
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./etc/localtime:/etc/localtime
    depends_on:
      - tomcat1
      - tomcat2

  tomcat1:
    hostname: tomcat1
    build: ./tomcat
    volumes:
      - ./webserver/tomcatA:/usr/local/apache-tomcat-8.5.31/webapps/ROOT
      - ./etc/localtime:/etc/localtime

  tomcat2:
    hostname: tomcat2
    build: ./tomcat
    volumes:
      - ./webserver/tomcatB:/usr/local/apache-tomcat-8.5.31/webapps/ROOT
      - ./etc/localtime:/etc/localtime

安装 JAVA 环境

[root@master java]# cat tomcat/Dockerfile 
FROM centos

ADD jdk-8u144-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_144
ADD apache-tomcat-8.5.31.tar.gz /usr/local

EXPOSE 8080
ENTRYPOINT ["/usr/local/apache-tomcat-8.5.31/bin/catalina.sh", "run"]

启动所有容器服务

[root@master java]# docker-compose up
Building tomcat1
Step 1/6 : FROM centos
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
7dc0dca2b151: Pull complete
Digest: sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322
Status: Downloaded newer image for docker.io/centos:latest
 ---> 49f7960eb7e4
Step 2/6 : ADD jdk-8u144-linux-x64.tar.gz /usr/local
 ---> 8c9e14062a24
Removing intermediate container a499940235ac
Step 3/6 : ENV JAVA_HOME /usr/local/jdk1.8.0_144
 ---> Running in cefedfd97f61
 ---> 12528cd5a517
Removing intermediate container cefedfd97f61
Step 4/6 : ADD apache-tomcat-8.5.31.tar.gz /usr/local
 ---> 246fa08bea1c
Removing intermediate container a1aaaa2bf0b8
Step 5/6 : EXPOSE 8080
 ---> Running in 87c4b41f3c1e
 ---> fd207f27b830
Removing intermediate container 87c4b41f3c1e
Step 6/6 : ENTRYPOINT /usr/local/apache-tomcat-8.5.31/bin/catalina.sh run
 ---> Running in 9adaed8e3ab9
 ---> b6fc6d3925f7
Removing intermediate container 9adaed8e3ab9
Successfully built b6fc6d3925f7
WARNING: Image for service tomcat1 was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building tomcat2
Step 1/6 : FROM centos
 ---> 49f7960eb7e4
Step 2/6 : ADD jdk-8u144-linux-x64.tar.gz /usr/local
 ---> Using cache
 ---> 8c9e14062a24
Step 3/6 : ENV JAVA_HOME /usr/local/jdk1.8.0_144
 ---> Using cache
 ---> 12528cd5a517
Step 4/6 : ADD apache-tomcat-8.5.31.tar.gz /usr/local
 ---> Using cache
 ---> 246fa08bea1c
Step 5/6 : EXPOSE 8080
 ---> Using cache
 ---> fd207f27b830
Step 6/6 : ENTRYPOINT /usr/local/apache-tomcat-8.5.31/bin/catalina.sh run
 ---> Using cache
 ---> b6fc6d3925f7
Successfully built b6fc6d3925f7
WARNING: Image for service tomcat2 was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Pulling nginx (nginx:1.14)...
Trying to pull repository docker.io/library/nginx ... 
1.14: Pulling from docker.io/library/nginx
f2aa67a397c4: Already exists
6160d1ac49e9: Pull complete
046b67408776: Pull complete
Digest: sha256:85ab7c44474df01422fe8fdbf9c28e497df427e8a67ce6d47ba027c49be4bdc6
Status: Downloaded newer image for docker.io/nginx:1.14
Creating java_tomcat2_1 ... done
Creating java_tomcat1_1 ... done
Creating java_nginx_1   ... done

查看启动情况

[root@master java]# docker-compose ps
     Name                   Command               State         Ports       
----------------------------------------------------------------------------
java_nginx_1     nginx -g daemon off;             Up      0.0.0.0:80->80/tcp
java_tomcat1_1   /usr/local/apache-tomcat-8 ...   Up      8080/tcp          
java_tomcat2_1   /usr/local/apache-tomcat-8 ...   Up      8080/tcp  

检测负载均衡

[root@master java]# curl http://localhost
welcome to tomcat-A server
[root@master java]# curl http://localhost
welcome to tomcat-B server
[root@master java]# curl http://localhost
welcome to tomcat-A server
[root@master java]# curl http://localhost
welcome to tomcat-B server

浏览器访问测试负载均衡

容器技术|Docker三剑客之docker-compose

查看日志输出信息

nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:33 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:34 +0000] "GET / HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:34 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:36 +0000] "GET / HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:36 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:36 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:37 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:37 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:37 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:37 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:38 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:38 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:38 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:38 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:38 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:14:39 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx_1    | 172.19.0.1 - - [08/Jun/2018:02:18:30 +0000] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
nginx_1    | 172.19.0.1 - - [08/Jun/2018:02:18:31 +0000] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
nginx_1    | 172.19.0.1 - - [08/Jun/2018:02:18:32 +0000] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
nginx_1    | 172.19.0.1 - - [08/Jun/2018:02:18:33 +0000] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
nginx_1    | 192.168.22.170 - - [08/Jun/2018:02:19:32 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"

容器技术|Docker三剑客之docker-compose

CentOS7 安装最新版 Docker、compose、swarm、machine

最新版 Docker 安装

1.卸载 Docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest  docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
 
2.安装所需的包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
 
3.设置稳定的存储库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
 
4.可选:启用边缘和测试存储库
sudo yum-config-manager --enable docker-ce-edge
sudo yum-config-manager --enable docker-ce-test
禁用边缘存储库
sudo yum-config-manager --disable docker-ce-edge
 
5.安装最新版本的 Docker CE
sudo yum install docker-ce
 
6.启动 Docker
sudo systemctl start docker
 
7.通过运行 hello-world 映像验证是否已正确安装
sudo docker run hello-world

docker-compose 安装

1.下载最新版本的 Docker Compose (第一次执行提示失败,就多执行几次这个命令试试)
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
 
2.对二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose
 
3.测试安装
docker-compose --version

docker-machine 安装

1.下载 Docker Machine 二进制文件并将其解压缩到 PATH (第一次执行提示失败,就多执行几次这个命令试试)
base=https://github.com/docker/machine/releases/download/v0.14.0 && curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && sudo install /tmp/docker-machine /usr/local/bin/docker-machine
 
2.通过显示机器版本来检查安装
docker-machine version

搭建 swarm 集群

1.新版 docker 已集成 swarm,无需单独安装
 
2.使用 docker swarm init 在管理节点初始化一个 Swarm 集群
docker swarm init --advertise-addr 192.168.153.150
# 如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP
# 执行 docker swarm init 命令的节点自动成为管理节点
 
3.将其他主机作为 管理节点 或 工作节点 加入 swarm 集群(以下命令在待加入节点执行)
docker swarm join --token [MANAGER-TOKEN||WORKER-TOKEN] [MANAGER-IP]:2377
# 示例:docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx 192.168.153.150:2377
--------------
注意:各机器之间要开启以下通信端口 或 关闭防火墙
# TCP端口2377集群管理端口
# TCP与 UDP端口7946节点之间通讯端口
# TCP与 UDP端口4789 overlay 网络通讯端口
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --reload
关闭防火墙:
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
--------------
 
4.在管理节点使用 docker node ls 查看集群
docker node ls
 
5.向集群中添加工作节点,通过以下命令获取加入集群的 WORKER-TOKEN
docker swarm join-token worker
向集群中添加管理节点,通过以下命令获取加入集群的 MANAGER-TOKEN
docker swarm join-token manager
 
6.退出集群
(1)如果是 manager 先降级为 worker 
docker node demote [HOSTNAME || ID] # ID前几位即可
(2)退出集群
docker swarm leave
(3)移除节点
docker node rm [HOSTNAME || ID] # ID前几位即可
# leave后该节点仍将出现在节点列表中,并将 STATUS标记为 down,已不影响 swarm操作;
# 要从列表中删除非活动节点,使用 node rm 命令即可。

使用 swarm+compose 部署集群服务

1.使用 swarm+compose 部署服务
docker stack deploy -c docker-compose.yml [JIQUN-NAME]
 
2.查看服务
docker stack ls
 
3.移除服务
docker stack down [JIQUN-NAME]
# 该命令不会移除服务所使用的 数据卷,如果你想移除数据卷请使用 docker volume rm

其他 Docker 常用命令

查看 swarm 集群中的服务:docker service ls
查看 swarm 集群中某个服务的运行状态信息:docker service ps mwp_db
查看 swarm 集群中某个服务的基础详细信息:docker service inspect mwp_db
查看 swarm 集群中某个服务的日志:docker service logs mwp_db
从 swarm 集群中移除某个服务:docker service rm mwp_db
 
搜索仓库镜像:docker search nginx
查找本地镜像:docker images nginx
查看本地镜像列表:docker images 或 docker image ls
删除本地镜像:docker rmi [IMAGE ID]
强制删除本地镜像:docker rmi -f [IMAGE ID] # 一般先停止相关容器,再 docker rmi [IMAGE ID] 正常删除镜像
 
列出本机容器 container:docker ps -a 或 docker container ls
删除 container:docker rm [CONTAINER ID] 或 docker container rm [CONTAINER ID]
清理所有处于终止状态的容器:docker container prune
进入后台运行的容器 container:docker exec -it [CONTAINER_NAME || CONTAINER_ID] /bin/sh
# docker exec 进入容器后 exit 不会导致容器停止
创建一个新的容器并运行:docker run --name web2 -d -p 81:80 nginx:v2
停止一个运行中的容器:docker stop [CONTAINER ID || NAMES]
 
查看所有数据卷:docker volume ls
删除指定数据卷:docker volume rm [VOLUME NAME]
清理所有无主数据卷:docker volume prune
 
查看 Image 或 Container 的信息:docker inspect [IMAGE || IMAGE ID || CONTAINER ID]
 
查看 CentOS 系统内核版本:uname -r
 
使用 Dockerfile 定制镜像:docker build -t nginx:v3 [DOCKERFILE PATH || URL]
# 其中 [DOCKERFILE PATH || URL] 为 Dockerfile 文件所在目录,例:docker build -t nginx:v3 .
 
更多命令可参考:http://www.runoob.com/docker/docker-command-manual.html

配置 Docker 加速器

参考:https://yeasy.gitbooks.io/docker_practice/install/mirror.html
对于使用 systemd 的系统,在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在则新建该文件)
{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}
之后重新启动服务。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
检查加速器是否生效:docker info
Registry Mirrors:
 https://registry.docker-cn.com/

Docker hub 地址:https://hub.docker.com/
Docker 官方文档地址:https://docs.docker.com/

ubuntu16.04 安装最新版 docker、docker-compose、docker-machine

安装前说明:

本文将介绍在 ubuntu16.04 系统下安装和升级 docker、docker-compose、docker-machine。

docker:有两个版本:docker-ce (社区版) 和 docker-ee (企业版)。

        笔者这里介绍安装或升级的是最新版 docker-ce(社区版)。

        参考官网地址:https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#os-requirements

docker-compse:可运行和管理多个 docker 容器。

docker-machine:docker 官方提供的 docker 管理工具。可管理多个 docker 主机,可搭建 swarm 集群。

一、docker 安装

1,卸载旧版本 docker

全新安装时,无需执行该步骤

$ sudo apt-get remove docker docker-engine docker.io

2,更新系统软件

$ sudo apt-get update

3,安装依赖包

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

4,添加官方密钥

执行该命令时,如遇到长时间没有响应说明网络连接不到 docker 网站,需要使用代 - 理进行。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

显示 OK, 表示添加成功.

5,添加仓库

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

6,再次更新软件

经实践,这一步不能够省略,我们需要再次把软件更新到最新,否则下一步有可能会报错。

$ sudo apt-get update

7,安装 docker

如果想指定安装某一版本,可使用 sudo apt-get install docker-ce=<VERSION>  命令,把 < VERSION > 替换为具体版本即可。

以下命令没有指定版本,默认就会安装最新版

$ sudo apt-get install docker-ce

8,查看 docker 版本

$ docker -v

显示 “Docker version 17.09.0-ce, build afdb6d4” 字样,表示安装成功。

二、docker-compose 安装

1,下载 docker-compose

$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

2,授权

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

3,查看版本信息

$ docker-compose --version

显示出版本信息,即安装成功。

三、docker-machine安装

说明:docker-machine 的使用是要基于 virtualBox 的。如果没有安装安装过,请先安装 virtualBox。

1,安装 virtualBox

登录 virtualBox 官网:https://www.virtualbox.org/wiki/Linux_Downloads

找到 "Ubuntu 16.04 ("Xenial")  i386 |  AMD64" 字样,点击 “AMD64” 进行下载。

下载后,执行以下命令进行安装:

$ sudo dpkg -i virtualbox-5.2_5.2.0-118431_Ubuntu_xenial_amd64.deb

2,下载并安装 docker-machine

$ curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

3,查看版本信息

$ docker-machine version

在 VirtualBox 中使用 Docker Machine 管理主机

大家好,今天我们学习在 VirtualBox 中使用 Docker Machine 来创建和管理 Docker 主机。Docker Machine 是一个可以帮助我们在电脑上、在云端、在数据中心内创建 Docker 主机的应用。它为根据用户的配置和需求创建服务器并在其上安装 Docker 和客户端提供了一个轻松的解决方案。这个 API 可以用于在本地主机、或数据中心的虚拟机、或云端的实例提供 Docker 服务。Docker Machine 支持 Windows、OSX 和 Linux,并且是以一个独立的二进制文件包形式安装的。仍然使用(与现有 Docker 工具)相同的接口,我们就可以充分利用已经提供 Docker 基础框架的生态系统。只要一个命令,用户就能快速部署 Docker 容器。

 

本文列出一些简单的步骤用 Docker Machine 来部署 docker 容器。

 

1. 安装 Docker Machine

Docker Machine 完美支持所有 Linux 操作系统。首先我们需要从 github 下载最新版本的 Docker Machine,本文使用 curl 作为下载工具,Docker Machine 版本为 0.2.0。

64 位操作系统

# curl -L https://github.com/docker/machine/releases/download/v0.2.0/docker-machine_linux-amd64 > /usr/local/bin/docker-machine

32 位操作系统

# curl -L https://github.com/docker/machine/releases/download/v0.2.0/docker-machine_linux-i386 > /usr/local/bin/docker-machine

下载完成后,找到 /usr/local/bin 目录下的 docker-machine 文件,让其可以执行:

# chmod +x /usr/local/bin/docker-machine

确认是否成功安装了 docker-machine,可以运行下面的命令,它会打印 Docker Machine 的版本信息:

# docker-machine -v

在 VirtualBox 中使用 Docker Machine 管理主机

运行下面的命令,安装 Docker 客户端,以便于在我们自己的电脑止运行 Docker 命令:

# curl -L https://get.docker.com/builds/linux/x86_64/docker-latest > /usr/local/bin/docker# chmod +x /usr/local/bin/docker

 

2. 创建 VirtualBox 虚拟机

在 Linux 系统上安装完 Docker Machine 后,接下来我们可以安装 VirtualBox 虚拟机,运行下面的就可以了。--driver virtualbox 选项表示我们要在 VirtualBox 的虚拟机里面部署 docker,最后的参数 “linux” 是虚拟机的名称。这个命令会下载 boot2dockeriso,它是个基于 Tiny Core Linux 的轻量级发行版,自带 Docker 程序,然后 docker-machine 命令会创建一个 VirtualBox 虚拟机(LCTT 译注:当然,我们也可以选择其他的虚拟机软件)来运行这个 boot2docker 系统。

# docker-machine create --driver virtualbox linux

在 VirtualBox 中使用 Docker Machine 管理主机

测试下有没有成功运行 VirtualBox 和 Docker,运行命令:

# docker-machine ls

如果执行成功,我们可以看到在 ACTIVE 那列下面会出现一个星号 “*”。

 

3. 设置环境变量

现在我们需要让 docker 与 docker-machine 通信,运行 docker-machine env <虚拟机名称> 来实现这个目的。

# eval "$(docker-machine env linux)"# docker ps

这个命令会设置 TLS 认证的环境变量,每次重启机器或者重新打开一个会话都需要执行一下这个命令,我们可以看到它的输出内容:

# docker-machine env linuxexport DOCKER_TLS_VERIFY=1export DOCKER_CERT_PATH=/Users/<your username>/.docker/machine/machines/devexport DOCKER_HOST=tcp://192.168.99.100:2376

 

4. 运行 Docker 容器

完成配置后我们就可以在 VirtualBox 上运行 docker 容器了。测试一下,我们可以运行虚拟机 docker run busybox,并在里面里执行 echo hello world 命令,我们可以看到容器的输出信息。

# docker run busybox echo hello world

在 VirtualBox 中使用 Docker Machine 管理主机

 

5. 拿到 Docker 主机的 IP

我们可以执行下面的命令获取运行 Docker 的主机的 IP 地址。我们可以看到在 Docker 主机的 IP 地址上的任何暴露出来的端口。

# docker-machine ip

 

6. 管理主机

现在我们可以随心所欲地使用上述的 docker-machine 命令来不断创建主机了。

当你使用完 docker 时,可以运行 docker-machine stop 来停止所有主机,如果想开启所有主机,运行 docker-machine start

# docker-machine stop# docker-machine start

你也可以只停止或开启一台主机:

$ docker-machine stop linux$ docker-machine start linux

 

总结

最后,我们使用 Docker Machine 成功在 VirtualBox 上创建并管理一台 Docker 主机。Docker Machine 确实能让用户快速地在不同的平台上部署 Docker 主机,就像我们这里部署在 VirtualBox 上一样。这个 virtualbox 驱动可以在本地机器上使用,也可以在数据中心的虚拟机上使用。Docker Machine 驱动除了支持本地的 VirtualBox 之外,还支持远端的 Digital Ocean、AWS、Azure、VMware 以及其它基础设施。

如果你有任何疑问,或者建议,请在评论栏中写出来,我们会不断改进我们的内容。谢谢,祝愉快。

Docker Engine

当人们提到 Docker,一般而言,大家说的是 Docker Engine,如下图: 

它是一个 client-server application。

Docker Engine 由三个部分组成:

Docker 进程(Docker Daemon)

REST API:指定了和进程交互的接口

CLI (command line interface):通过 REST API 和 daemon 通信,诸如:docker run <image>, docker ps...

Docker Machine

Docker Machine 是一种提供管理主机的 工具。常规,你会安装 Docker Machine 在你的本地机器上。

Docker Machine 有自己的命令 client:docker-machine

Docker Engine 则有 client:docker

 

我们可以使用 Docker Machine 来安装 Docker Engine 在一个或者多个虚拟系统上,这些虚拟系统可以是本地的(比如 Virtualbox 里),也可以是远程的(云)。

privileged 参数

 
  1.  
  2. $ docker help run

  3. ...

  4. --privileged=false Give extended privileges to this container

  5. ...

大约在 0.6 版,privileged 被引入 docker。
使用该参数,container 内的 root 拥有真正的 root 权限。
否则,container 内的 root 只是外部的一个普通用户权限。
privileged 启动的容器,可以看到很多 host 上的设备,并且可以执行 mount。
甚至允许你在 docker 容器中启动 docker 容器。

介绍:
    docker compose 是 docker 官方推出的一款单机容器编排工具,
         docker swarm, docker machine 并称为 docker 容器编排三剑客, 虽然其被 k8s 吊打,
        但是由于其简单易学在中小规模的集群中还是占有相当的一部分地位的

    使用Compose的步骤:
        1、定义您的应用程序环境,Dockerfile以便可以在任何地方进行复制
        2、定义构成应用程序的服务,docker-compose.yml 以便它们可以在隔离环境中一起运行
        3、运行 docker-compose up 和 Compose starts 运行整个应用程序

compose 的特性:
    1、单个主机上的多个环境隔离
    2、创建容器时保留卷数据
    3、仅重新创建已更改的容器
    4、变量和在环境之间移动合成

安装:
    docker compose 依赖所有的工作依赖于 docker, 在安装 compose 前请确保已在本地或远程主机中安装 docker

    二进制安装:
        curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
        chmod +x /usr/local/bin/docker-compose

    pip安装:
        pip install docker-compose

一个简单的例子:
    mkdir composetest && cd composetest             #创建一个专用目录,用于编写和保存 compose 文件
    cat app.py                                      #编写一个 flask web 应用作为测试
        import time
        import redis
        from flask import Flask

        app = Flask(__name__)
        cache = redis.Redis(host=''redis'', port=6379)        #连接 redis

        # 定义函数
        def get_hit_count():
            retries = 5
            while True:
                try:
                    return cache.incr(''hits'')
                except redis.exceptions.ConnectionError as exc:
                    if retries == 0:
                        raise exc
                    retries -= 1
                    time.sleep(0.5)

        @app.route(''/'')
        def hello():
            count = get_hit_count()
            # 每访问一次返回的 count 加 1
            return ''Hello World! I have been seen {} times.\n''.format(count)

        if __name__ == "__main__":
            #运行 web 应用
            app.run(host="0.0.0.0", debug=True)

    cat Dockerfile                                          #编写docker file 文件以便 compose 可以根据 docker file 动态构建镜像
        FROM python:3.4-alpine
        ADD . /code
        WORKDIR /code
        RUN pip install flask redis
        CMD ["python", "app.py"]

    cat docker-compose.yml                                  #编写 compose 文件定义容器间的关系
        version: ''3''
        services:
          web:
            build: .
            ports:
             - "5000:5000"
            volumes:
             - .:/code
          redis:
            image: "redis:alpine"

    docker-compose up                                       #启动 docker compose 定义的 docker 集群
    curl http://127.0.0.1:5000/                             #访问 Web APP

        # 示例来源
    # https://docs.docker.com/compose/gettingstarted/#step-5-edit-the-compose-file-to-add-a-bind-mount    

docker-compose 命令:
    介绍:
        1、docker-compose 命令的执行都必须指定或者在当前目录下存在 compose 文件, 且输出的内容都是这个 compose.yml 文件定义的集群内的信息
        2、每个集群中可以拥有多个 services, services 由 compose.yml 的 services 定义

    选项:
        -f      指定 compose 文件路径(可以指定多个)

    子命令:
        create             创建 compose 集群, 但不启动(已废弃, 使用 up --no-start 代替)
        down               停止或删除容器, 网络, 镜像和数据卷
        exec               运行容器中的命令或者连接容器
        help               查看帮助信息
        images             列出 compose 集群所用的镜像
        kill               kill 掉 compose 集群
        logs               获取 compose 集群日志
        pause              暂停 compose 集群
        ps                 列出正在运行的容器
        pull               拉取 compose.yml 文件中定义的所有 docker 镜像
        push               上传 compose.yml 文件中定义的所有 docker 镜像
        restart            重启 compose 集群
        rm                 删除一个停止的容器或者 compose 集群
        run                和 exec 相同
        scale              更改 compose 集群内指定的 services 的副本数量
        start              启动 compose 集群
        stop               停止 compose 集群
        top                显示 compose 集群中运行的进程及其状态
        unpause            恢复被暂停的 compose 集群
        up                 创建并启动一个 compose 集群
        version            输出 compose 版本

使用 Docker Machine、Swarm 和 Compose 进行 Docker 规划

机器 (Machine) 用一个命令就把你从 “零带到 Docker”。它可以让你轻松地部署 Docker 引擎到您的计算机上,云提供商上,以及自己的数据中心。Machine’s blog post 上有更多的信息并提供软件下载。

集群 (Swarm) 是 Docker 容器的本地集群。它将多个 Docker 引擎汇聚到一起组成一个虚拟主机。将 Docker 客户端或第三方工具(例如,Compose,Dokku,Shipyard,Jenkins,the Docker client,等)指向 Swarm, 并将会透明地扩展到多个主机。一个测试版本的 Swarm 已经可用,我们正在努力将其与亚马逊 Web 服务,IBM Bluemix,Joyent,Kubernetes,Mesos 和微软的 Azure。Machine’s blog post 上有更多的信息。

组合 (Compose) 是一种定义和运行包含 Docker 的多容器分布式应用程序。早在十二月,我们就向社区公开了它的设计。基于社区反馈,Compose 是基于 Fig。Fig 是一种在开发环境运行 Docker 的一个工具。 Compose’s blog post 上有更多的信息并提供软件下载。

现在在一起

Docker 引擎对单一容器的应用程序表现良好,使得它们在构建,部署和转移应用程序方面更加的容易。但是我们无时不知道你需要的是能够定义和部署复杂的由多个服务组成的应用程序。如果你现在希望用 Docker 来完成这件事,Docker 引擎还不清楚要做什么。你可能不得不拼凑一些 shell 脚本的东西使它工作。

这不是理想的方案。我们想与你分享一些我们的一些想法, 这些想法是有关如何在分布式的应用中使用 Docker,我们今天发布的工具都要帮助实现这些想法。

我们听说,你想要你的分布式应用程序是:

  • 在不同的环境中便携的使用:你可以定义你的应用程序将如何在开发环境运行,那么它们也应该无缝地在测试,准生产环境和生产环境运行。

  • 在不同的供应商中便携的使用:你可以在不同的云供应商和自己的服务器之间移动你的应用程序,或跨几个供应商运行它们。

  • 可组合的:你可以将你的应用分拆到多个服务。

我们今天发布的工具是一个平台的开始,这个平台将使这一切成为可能。

首先,你使用 Machine 创建已经安装了 Docker 引擎的主机。Machine 可以在您的计算机上,云服务提供商,和 / 或在您自己的数据中心上创建这些主机。

接下来,你将这些 Docker 引擎用 Swarm 汇集到一起。Swarm 将 Docker 引擎连接成一个单一的,虚拟引擎。这有点像运行了很多 Docker 容器的一个非常大的计算机。你不再担心管理服务器–它们都汇集在一起并由一个集群系统为你管理这些资源。

Swarm 带有一个内置的集群系统,但如果你想和现有的正在运行的系统整合,Swarm 将来也会运行在 Mesos 或 Kubernetes 之上。

另外,如果你想把 Swarm 部署到云上,而不是建立自己的 Swarm,为此,我们正和亚马逊 EC2 Container Service,IBM Bluemix Container Service, Joyent Smart Data Center 和微软的 Azure 合作,将他们的产品与 Swarm 整合。

一旦你有了一个 Swarm,你就可以在它上面运行你的应用程序。你用 Compose 来定义你的多容器应用程序(例如,一个 Web 服务器容器连接到一个数据库容器)。Compose 可以在任何可以调用 Docker API 的机器上运行这个应用。在开发阶段,你可以将 Compose 直接运行在你电脑上的的 Docker 主机上。当你需要把你的应用程序放到准生产和生产环境,你可以将 Compose 指向 Swarm 集群。

所以,如果你用 Compose 来定义你的应用程序,你可以在任何环境或供应方上运行它:在你的电脑上,在云上的一个 Swarm,在你自己的数据中心的一个 Swarm,一个运行在 Mesos 或 Kubernetes 之上运行的 Swarm 上。

参与

这种设计仍在完善当中,我们真的希望听到你们的意见。当我们在 Docker 上做了很大开发的时候,我们会把这些变化开放出来以供人们使用。这让我们看到用户如何使用它,这样我们可以快速地迭代开发。并且,因为它是开源的,你可以直接参与它的开发。

Machine, Swarm and Compose 的安装说明以及下载。它们可以作为独立的工具,但如果你敢于冒险的话,你可以将他们安装到一起(尽管这还是处在一个非常实验状态)。请参考有关 Machine+Swarm 以及 Compose+Swarm 的文档。

如果你对软件高层设计有任何的评论,可以发送你的评论到 docker-dev mailing list。项目会把每天完成的开发都更新到 Machine, Swarm 和 Compose 的 GitHub 仓库里去。

如果你就已经使用了一个 Docker1.0 之前的版本,那么你非常适合在这个时候参与这个项目。

了解更多关于 Machine, Swarm and Compose 的信息:

 

  • beta 版 Machine 公告 和安装指导

  • Swarm beta 版公告 和安装指导

  • Compose 公告和安装指导

  • 参与 GitHub 上的项目 Machine, Swarm and Compose

  • 在 #docker on Freenode 或 the Docker mailing list 上提问

  • 有关 Machine + Swarm + Compose 的 Demo 视频

  • 注册参加 关于 Machine, Swarm and Compose 的在线会议

了解更多有关 Docker

  • 刚接触 Docker? 试试我们的 10 分钟在线入门培训

  • 用一个免费的 Docker Hub 账号,分享 images,automate builds 和更多

  • 阅读 Docker Engine 1.5 发布说明

  • 订阅 Docker 每周新闻

  • 参加即将开始的 Docker 会议

  • 报名参加 DockerCon 2015

  • 开始给 Docker 做贡献

本文地址:https://www.oschina.net/translate/orchestrating-docker-with-machine-swarm-and-compose

原文地址:https://blog.docker.com/2015/02/orchestrating-docker-with-machine-swarm-and-compose/

 

关于Docker三剑客之Docker Machinedocker三剑客介绍的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose、CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、docker 三剑客 docker-compose、docker-machine、swarm等相关内容,可以在本站寻找。

本文标签: