2017-09-23
docker
00
请注意,本文编写于 2674 天前,最后修改于 168 天前,其中某些信息可能已经过时。

1. docker

docker 既指代docker这家了不起的公司,也指代docker这种容器化的技术。下文的docker均指后者。

2. docker run

docker run 只是单纯的基于镜像创建一个容器(container)。镜像是docker保存的基本单位,而容器是docker运行的基本单位。或者说容器是运行时候的镜像。比如下面额例子:

[root@centos3 ~]# docker run --name mongo1 -it -p 27017:27017 mongo 2019-12-19T20:31:53.474+0000 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none' 2019-12-19T20:31:53.476+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=89f75b73d448 2019-12-19T20:31:53.476+0000 I CONTROL [initandlisten] db version v4.2.2 2019-12-19T20:31:53.476+0000 I CONTROL [initandlisten] git version: a0bbbff6ada159e19298d37946ac8dc4b497eadf 2019-12-19T20:31:53.476+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.1.1 11 Sep 2018 2019-12-19T20:31:53.476+0000 I CONTROL [initandlisten] allocator: tcmalloc 2019-12-19T20:31:53.476+0000 I CONTROL [initandlisten] modules: none 2019-12-19T20:31:53.476+0000 I CONTROL [initandlisten] build environment: 2019-12-19T20:31:53.476+0000 I CONTROL [initandlisten] distmod: ubuntu1804

以上事例,是基于mongoDB的最新镜像(不带tag的镜像,默认拉去最新版本镜像),创建一个mongoDB容器。现简要说一下里面出现的参数:

--name : 新建容器的名称,此处为 "dockertest" -i : 交互模式 -t : 分配一个tty给新容器 -p: 将容器宿主机 27017端口 ,映射到容器的27017端口,这样mongoDB容器就内部都可(被)访问了

因为mongodb容器默认启动的命令是启动mongo,所以,我们会看到整个输出的数据,通过tty显示在屏幕上。

还有一个常用的参数 -d 表示容器启动之后在后台运行。如下面的示例,让mongodb容器在后台运行,会返回容器的id

[root@centos3 ~]# docker run --name mongo1 -it -d -p 27017:27017 mongo 9758ef62c03199fb1eb9c2bf853d78ab268a9583f6a92731815843d9f2e885bf [root@centos3 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9758ef62c031 mongo "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:27017->27017/tcp mongo1

小节: docker run 可以说是 docker 容器技术一个最基本的命令,其他高级的指令都是基于它,一些常用参数必须掌握

3. docker compose

  1. docker run 只是创建组件容器。但是当今的系统(服务)经常是好多组件组成。当然你可以通过脚本的形式实现多个容器组件的创建,但是这并不是很规范,尤其是从管理上。所以docker 出了一个很专业的应用管理部署工具-docker compose,通过声明式的yml文件。

  2. docker compose 是一个单独的组件,需要单独安装的奥,具体安装方式参考官网:

  3. 虽然随着docker swarm 和docker stack (两者都是docker自带,无需二外安装)的不断演进,docker compose 单独使用的机会越来越少,但是其理念跟docker stack是一脉相承的,docker-compose 文件是可以被docker stack运行的。或者说 docker stack是docker compose的一个超集。建议直接使用户docker stack.

  4. 非常典型的docker-compose.yml文件结构如下:

version: "3.7" services: service1: build: mongo ports: - 27017:27017 networks: - default1 service2: build: vue volumes: - ./xx:/ey/xc networks: default1

可以看到,整个系统被分成了一个一个的服务,每一个服务默认只创建一个实例(容器),运行命令示例如下所示:

docker-compose -f docker-compose.yml up

4. docker swarm

  1. 上面说到的docker compose,默认运行在单docker节点,无法跨主机进行服务部署。所以docker swarm(docker 集群)应运而生。
  2. docker swarm就是docker集群。就是可以把分立的docker主机连起来,实现服务的跨机部署。docker swarm机制很好理解,整个集群有管理节点,有工作节点,管理节点负责任务的分配和执行,工作节点只是负责执行。单台docker主机可以自己成群。跟Hadoop的HDFS等分布式框架有些类似。集群的创建方法,参见官网教程
  3. 有了集群,下面在集群上创建服务了。

5. docker service

  1. 有了集群,就可以在集群上部署服务了。docker sevice指令就是来干这个的。当然,现在创建的服务可以有很多实例(得益于集群)。比如,创建有10个副本的mongodb实例的命令如下:

    docker service create --name mongodb -p 27017:27017 --replcias 10 mongo

    是不是跟docker run 的参数很像?是的,这就是一脉相承,学习曲线极低。

  2. 如果我现在业务规模骤增,我需要20个mongodb实例怎么办呢?好办,docker service 支持热扩容,一个指令就可以了:

    docker srevice scale mongodb=20

    但是,docker srvice 默认不支持(执至少现在不支持)auto scale。如果你需要这个功能,可以去找一下第三方插件或工具,或者自己写自动化脚本实现。

  3. docker service 一个很重要的知识点: docker srevice 自带服务发现和负载均衡。它会基于overlay网络将服务名称和IP自动关联,类似于一个DNS,另外还会将流量按照某种策略 分发给不同的服务实例。

6. docker stack

上面讲的docker srvice 还是命令执行的方式,创建单服务(尽管会有多个容器实例),有点类似于docker run。docker stack就是用来方便的进行服务编排,可以看成是轻量级的K8s。

docker stack 编排通过一个 docker-stack.yml 文件,或者 docker compose 文件,或者其他可接受的文件类型。docker-stack.yml 文件机构内容跟前面介绍的docke-compose 文件很相似,多了一些只有在 docker swarm 模式下才有的功能。将这整个系统
的架构,通过一个文件解构。然后只要,执行 docker stack 命令,就可以创建编排好的系统:
docker stack deploy -c docker-stack.yml mystack
在上面的示例中,mystack是我要创建的示例的名称,docker-stack.yml 是我的系统编排文件。

docker stack deploy 执行前,需要将用到的镜像,pull到本地。

7. docker machine

docker machine 是一个可以选择的功能。主要用来快速批量部署docker主机。因为docker swarm 集群创建的前提是每一台主机是docker主机(docker软件安装在上面)。docker machine 就可以比较快的创建虚拟机并部署docker。具体可以参见官方文档

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:王海生

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!