本文非小马原创,为学习总结笔记,作为日后复盘回顾,感谢原作者分享,文末已注明出处,侵删。
一、什么是docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
啥意思呢?其实docker的图标很是形象了。
大鲸鱼代表docker,背上的集装箱代表各个容器,跑着各种服务,互相不干扰。
二、docker基本命令
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
获取镜像,将ubuntu镜像拉取到本地
docker pull ubuntu
启动容器,以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
docker run -it ubuntu /bin/bash
参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
root@ed09e4490c57:/# exit
查看所有容器,得到容器ID:
docker ps -a
使用容器ID启动已停止运行的容器:
docker start b750bbbcfd88
后台运行模式:
我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
docker run -itd --name ubuntu-test ubuntu /bin/bash
注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec(下面会介绍到)。这里的name是对容器命名。
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
docker exec -it 243c32535da7 /bin/bash
停止容器:docker stop <容器 ID>
重启容器:docker restart <容器 ID>
删除容器:docker rm -f 1e560fca3906
三、docker容器直接拉取镜像到本地,运行一个web应用
怎么理解呢?先pull载入一个镜像(一个空的集装箱),然后run用容器把镜像跑起来(装什么),将docker的端口映射到主机上的端口就可以通过访问主机的端口访问容器的服务端口了(将牛奶的集装箱外贴上1号箱子,牛奶和一号进行了映射关系,车下的人说我要访问一号箱就代表要访问牛奶集装箱)。
容器自己的端口映射到外部(映射到宿主机端口,供外部通过宿主机端口调用)
这里谈到了端口映射。容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
我们可以在宿主机的 /etc/docker/daemon.json 文件中增加内容来设置全部容器的 DNS,也可以使用命令对指定的容器设置DNS。
创建docker网络容器互联
端口映射并不是唯一把 docker 连接到另一个容器的方法。docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。创建一个新的Docker网络。
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。我们可以使用 docker images 来列出本地主机上的镜像。
四、创建镜像和构建镜像
创建镜像:需要先使用旧镜像创建一个容器,改完后退出容器,通过命令docker commit提交容器副本,之后可以用这个副本名创建符合自己要求的容器了。
构建镜像:docker build + Dockerfile 文件创建一个自定义新的镜像。
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件(比如基于nginx镜像,复制web目录的文件,执行什么指令等等,然后bulid就得到一个镜像),其中包含一组指令来告诉 Docker 如何构建我们的镜像。
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
创建完Dockerfile 文件后开始构建镜像
在Dockerfile 文件的存放目录下,执行构建动作。
以下示例,通过目录下的 Dockerfile 构建一个 nginx:test(镜像名称:镜像标签)。
注:最后的 . 代表本次执行的上下文路径。
$ docker build -t nginx:test .
五、Docker Compose定义和运行多容器 Docker 应用程序
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。 docker-compose需要安装。
使用 Dockerfile 定义应用程序的环境(如上面我们提到的NGINX+web目录自定义镜像webserver)。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行(如yml文件中配置web需要的webserver和Redis,MySQL三个服务,配置时同时定义容器映射的端口等)。
最后,在目录中直接执行 docker-compose up 命令来启动并运行整个应用程序(启动所有服务)。如果你想在后台执行该服务可以加上 -d 参数:docker-compose up -d。
六、Docker Machine集中管理所有docker主机(如对100台主机的docker程序安装,不是容器节点)
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
七、Docker Swarm集群管理和节点扩容
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
支持的工具包括但不限于以下各项:
Dokku
Docker Compose
Docker Machine
Jenkins
原理
如下图所示,swarm 集群由管理节点(manager)和工作节点(work node)构成。
swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。
啥意思呢?就是组成一个集群来由swarm mananger统一管理,如果某个work node节点的服务如helloworld要扩容到两个节点,直接设置规模数量为2即可。非常方便。
docker@swarm-manager:~$ docker service scale helloworld=2
参考文献:













网友评论