0

Docker 高级特性

 2 years ago
source link: https://yuechuanx.top/DevOps/docker-advanced-feature/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本次分享给大家介绍Docker 的高级特性与相应的工具。 它们就是Docker 三剑客,Compose、Machine和Swarm

Compose

Docker Compose 是Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。

Compose 定位是 「定义和运行多个Docker 容器的应用(Defining and running multi-container Docker applications)」

其前身是开源项目Fig。其代码目前在https://github.com/docker/compose 上开源。

pip install -U docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Dockerfile

FROM python:3.7-slim

WORKDIR /app

COPY . /app

RUN pip install flask -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

EXPOSE 80

ENV NAME World

CMD ["python", "app.py"]

app.py

from flask import Flask
import os
import socket

app = Flask(__name__)

@app.route("/")
def hello():
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}"
return html.format(name=os.getenv("NAME", "world"),
hostname=socket.gethostname())

if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)

docker-compose.yml

version: "3"
services:
myapp:
# build: .
image: friendlyhello:v2
container_name: myapp
ports:
- "5000:80"
environment:
NAME: World

redis:
image: redis
container_name: web

执行 docker-compose build 可生成镜像

执行 docker-compose up 启动容器运行

浏览器访问

Machine

Docker Machine 是Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装Docker环境。

使用 virtualbox 类型的驱动,创建一台Docker 主机,命名为 manager

docker-machine create -d virtualbox manager

可以在创建时加上如下参数,来配置主机或者主机上的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

更多参数请使用 docker-machine create —help 命令查看。

docker-machine ls 查看主机

docker-machine env manager 查看环境变量

切换 docker 主机 manager 为操作对象

eval $(docker-machine env manager)

或者可以 ssh 登录到 docker 主机

docker-machine ssh manager

Swarm

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

初始化集群

在上节介绍 docker-machine 的时候,我们创建了manager节点,而初始化集群需要在管理节点内执行

docker swarm init --advertise-addr=IP_ADDR

现在来创建两个工作节点worker1, worker2并加入集群

docker-machine create -d virtualbox worker1

eval $(docker-machine env worker1)

docker swarm join --token SWMTKN-1-59qol34ustn06wtqs6bnsgar4j170k5aj24weu5yegq8qp66cb-26aroyxll4zh9pl8cdwuo7vm4 192.168.99.101:2377

同理worker2 节点

进入manager 节点执行

docker node ls

由此,我们就得到了一个最小化的集群。

  • docker stack deploy –c docker-compose.yml 后,在docker ps 中无法看到端口映射?

关于docker swarm mode 部署后端口的问题,可以使用docker service ls来查看端口是否正确暴露,因为此时是通过service来暴露的,并不是直接在container上暴露,所以此时用docker ps是看不到的,但暴露的端口依旧可以访问,这样实现和k8s里的service实现是有些相似的。

  • 执行docker-compose -f docker-compose.yml up -d,返回
Pulling myapp (friendlyhello:v2)...

ERROR: Get https://registry-1.docker.i... net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

​ compose文件中如果已经build过,就用image直接指定这个image,注释掉build的指令。如果没有build过,就放开build指令,执行docker-compose的build它,当然也可以使用docker build来构建它。因为这一块在上一章节已经提到过,所以对于部分这次直接切入的同学可能会有疑惑。而到了docker stack时,已经不支持docker stack来build它了,需要统一使用docker build来构建镜像。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK