一、Docker简介
1.1、什么是docker
docker的英文意思是 码头工人,意思就是搬运东西的意思,这和docker的特点是一样的,docker提供的就是一种容器化搬运东西(我们的软件、程序)的过程。docker自己本来是运行在操作系统上一个程序软件,它会提供一个容器环境,使我们的程序独立地运行在容器中。
当我们把我们的web网站做成分布式的时候,就需要加服务器,然后在各个服务器配置web所需要的配置,比如:数据库、web服务器。这样的我们的网站才能跑起来,但是每当我们加服务器的时候,我们都要再重新配置一下,很繁琐,有了docker,我们就可以把我们的网站和所需要的环境配置好,打成一个包(docker镜像),然后在服务器上安装docker,用docker拉取打包好的镜像,直接运行容器就行了,更加的便于管理,镜像中修改配置,重新更新,所有的容器就也能修改了,我们的网站也就修改更新了。
1.2、docker和虚拟机
docker是和虚拟机是类似的东西,我们应该知道虚拟机就是在我们的操作系统上虚拟出来一个电脑,然后里边可以安装、运行各种各样的软件,和我们真的电脑是差不多的,我们可以拿着这个虚拟好的电脑(其实是一个文件)在按了虚拟机的其他电脑上可以直接运行,里边的东西就不用我们来回安装和配置了,也是很方便的。docker其实提供的也是这么一种的技术,只不过它比虚拟机效率更加的高,启动快,占用资源小等一系列的优点,而且虚拟机比较笨重,这是因为虚拟机和docker来实现思想上有本质的区别,我们可以通过下边的两张图可以对比一下:
虚拟机的运作原理:是虚拟电脑的硬件资源,把硬件资源分配出来,然后虚拟出来多个操作系统,虚拟出来的是一个完整的电脑。
docker的运作原理:虚拟的软件资源,把电脑中的网络、存储啥的分成几份虚拟成容器,我们的软件运行在容器中,每个容易只占用电脑的部分所需要的资源,并不是一个完整的电脑。
二、Docker的安装
从网络上下载Docker的依赖库,使得docker可以在虚拟机上运行:
下载docker的镜像,这里采用的是阿里云镜像:
在虚拟机上安装docker镜像:
启动docker,准备进行操作:
三、Swarm试用
3.1、创建集群
使用 Docker Machine 创建一个虚拟机作为 manger 节点:
[root@ZhaiXin ~]docker-machine create --driver virtualbox manager1
Running pre-create checks...
(manager1) Unable to get the latest Boot2Docker ISO release version: Get https://api.github.com/repos/boot2docker/boot2docker/releases/latest: dial tcp: lookup api.github.com on [::1]:53: server misbehaving
Creating machine...
(manager1) Unable to get the latest Boot2Docker ISO release version: Get https://api.github.com/repos/boot2docker/boot2docker/releases/latest: dial tcp: lookup api.github.com on [::1]:53: server misbehaving
(manager1) Copying /home/zuolan/.docker/machine/cache/boot2docker.iso to /home/zuolan/.docker/machine/machines/manager1/boot2docker.iso...
(manager1) Creating VirtualBox VM...
(manager1) Creating SSH key...
(manager1) Starting the VM...
(manager1) Check network to re-create if needed...
(manager1) Found a new host-only adapter: "vboxnet0"
(manager1) 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 manager1
查看虚拟机的环境变量等信息,包括虚拟机的 IP 地址:
[root@ZhaiXin ~]docker-machine env manager1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/zuolan/.docker/machine/machines/manager1"
export DOCKER_MACHINE_NAME="manager1"
# Run this command to configure your shell:
# eval $(docker-machine env manager1)
然后再创建一个节点作为 work 节点:
[root@ZhaiXin ~]docker-machine create --driver virtualbox worker1
现在我们有了两个虚拟主机,但是目前这两台虚拟主机并没有什么联系,为了把它们联系起来,这时需要 使用Swarm 。执行 docker swarm 即可操作虚拟机。
把 manager1 加入集群:
[root@ZhaiXin ~]docker-machine ssh manager1 docker swarm init --listen-addr 192.168.99.100:2377 --advertise-addr 192.168.99.100
Swarm initialized: current node (23lkbq7uovqsg550qfzup59t6) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
用 --listen-addr 指定监听的 ip 与端口:
[root@ZhaiXin ~]docker swarm init --listen-addr <MANAGER-IP>:<PORT>
再把 work1 加入集群中:
[root@ZhaiXin ~]docker-machine ssh worker1 docker swarm join --token \
SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
192.168.99.100:2377
This node joined a swarm as a worker.
集群初始化成功,我们新建了一个有两个节点的“集群”,现在进入其中一个管理节点使用 docker node 命令来查看节点信息:
[root@ZhaiXin ~]docker-machine ssh manager1 docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
23lkbq7uovqsg550qfzup59t6 * manager1 Ready Active Leader
dqb3fim8zvcob8sycri3hy98a worker1 Ready Active
继续新建虚拟机 manger2、worker2、worker3,总共得到五个虚拟机,并把剩余的虚拟机也加到集群中。
查看集群信息:
[root@ZhaiXin ~]docker-machine ssh manager2 docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
16w80jnqy2k30yez4wbbaz1l8 worker1 Ready Active
2gkwhzakejj72n5xoxruet71z worker2 Ready Active
35kutfyn1ratch55fn7j3fs4x worker3 Ready Active
a9r21g5iq1u6h31myprfwl8ln * manager2 Ready Active Reachable
dpo7snxbz2a0dxvx6mf19p35z manager1 Ready Active Leader
3.2、建立跨主机网络
将宿主机加入集群得到六个虚拟机以便更加清晰地使用命令。
查看网络状态:
[root@ZhaiXin ~]docker network ls
NETWORK ID NAME DRIVER SCOPE
764ff31881e5 bridge bridge local
fbd9a977aa03 host host local
6p6xlousvsy2 ingress overlay swarm
e81af24d643d none null local
可以看到在 swarm 上默认已有一个名为 ingress 的 overlay 网络, 默认在 swarm 里使用,本例子中会创建一个新的 overlay 网络。
[root@ZhaiXin ~]docker network create --driver overlay swarm_test
4dm8cy9y5delvs5vd0ghdd89s
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
764ff31881e5 bridge bridge local
fbd9a977aa03 host host local
6p6xlousvsy2 ingress overlay swarm
e81af24d643d none null local
4dm8cy9y5del swarm_test overlay swarm
这个网络只是处于待机状态,下一小节我们会在这个网络上部署应用。
3.3、在跨主机网络上部署应用
在五个节点部署一组 Nginx 服务,部署的服务使用 swarm_test 跨主机网络:
[root@ZhaiXin ~]docker service create --replicas 2 --name helloworld --network=swarm_test nginx:alpine
5gz0h2s5agh2d2libvzq6bhgs
查看服务状态:
[root@ZhaiXin ~]docker service ls
ID NAME REPLICAS IMAGE COMMAND
5gz0h2s5agh2 helloworld 0/2 nginx:alpine
查看 helloworld 服务详情:
[root@ZhaiXin ~]docker service ps helloworld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
ay081uome3 helloworld.1 nginx:alpine manager1 Running Preparing 2 seconds ago
16cvore0c96 helloworld.2 nginx:alpine worker2 Running Preparing 2 seconds ago
进入两个节点,查看服务状态:
[root@ZhaiXin ~]docker-machine ssh manager1 docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
119f787622c2 nginx:alpine "nginx -g ..." 4 minutes ago Up 4 minutes 80/tcp, 443/tcp hello ...
$ docker-machine ssh worker2 docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5db707401a06 nginx:alpine "nginx -g ..." 4 minutes ago Up 4 minutes 80/tcp, 443/tcp hello ...
首先使用 Machine 进入 manager1 节点,然后使用 docker exec -i 命令进入 helloworld.1 容器中 ping 运行在 worker2 节点的 helloworld.2 容器。
[root@ZhaiXin ~]docker-machine ssh manager1 docker exec -i helloworld.1.ay081uome3eejeg4mspa8pdlx \
ping helloworld.2.16cvore0c96rby1vp0sny3mvt
PING helloworld.2.16cvore0c96rby1vp0sny3mvt (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: seq=0 ttl=64 time=0.591 ms
64 bytes from 10.0.0.4: seq=1 ttl=64 time=0.594 ms
64 bytes from 10.0.0.4: seq=2 ttl=64 time=0.624 ms
64 bytes from 10.0.0.4: seq=3 ttl=64 time=0.612 ms
^C
然后使用 Machine 进入 worker2 节点,然后使用 docker exec -i 命令进入 helloworld.2 容器中 ping 运行在 manager1 节点的 helloworld.1 容器。
[root@ZhaiXin ~]docker-machine ssh worker2 docker exec -i helloworld.2.16cvore0c96rby1vp0sny3mvt \
ping helloworld.1.ay081uome3eejeg4mspa8pdlx
PING helloworld.1.ay081uome3eejeg4mspa8pdlx (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.466 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.465 ms
64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.548 ms
64 bytes from 10.0.0.3: seq=3 ttl=64 time=0.689 ms
^C
可以看到这两个跨主机的服务集群里面各个容器是可以互相连接的。
四、Docker Swarm优点总结
通过以上操作,可以看到Docker Swarm有六大优点。
4.1、更高效的利用系统资源
docker对系统资源的利用率更高,无论是应用执行速度,内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机往往可以运行更多数量的应用。
4.2、更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级,甚至毫秒级的启动时间,大大的节约了开发测试,部署的时间。
4.3、一致的运行环境
开发过程中常见的一个问题是环境一致问题,由于开发环境,测试环境,生产环境不一致,导致有些bug并未在开发过程中发现。而docker的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会在出现“这段代码在我机器上没问题”这类问题。
4.4、持续支付和部署
对开发和运维人员来说,最希望就是一次创建和部署,可以在任意的地方运行。(定制应用镜像来实现集成、持续支付、部署。开发人员可以通过dockerfile来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署)。而且使用dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
4.5、更轻松的迁移
由于docker确保了执行环境的一致性,使得应用的迁移更加的容易。docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云、甚至是笔记本、其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
4.6、更轻松的维护和拓展
docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得十分简单。此外,docker团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。