Docker是一个开源的应用容器引擎,将应用以及依赖打包到一个可移植的镜像中,然后发布到服务器上,并且可以实现虚拟化,有助于快捷高效的交付应用。
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的白沙黎族网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
Docker三个核心概念:
l 镜像Image,应用和依赖打包生成的文件,类似安装包。
l 容器Container,镜像创建运行应用的示例。
l 仓库Repository,Docker存放镜像文件的地方。
资源编排Docker-compose定义和运行多个容器组成的应用系统,通过docker-compose.yml文件声明各个服务,作为一个整体来完成应用的创建和启动。
Swarm是Docker官方提供的集群管理工具,将Docker节点统一管理组织,以服务为调度单元,支持动态扩容等特性,和Kubernetes(k8s)相比,更加轻量。
内容目录:
l Docker常用命令:镜像、容器、网络、数据卷
l Dockerfile示例和常用指令
l 资源编排docker-compose常用命令
l docker-compose.yml示例和常用指令
l 集群部署Swarm常用命令
l 使用技巧
n logs命令结合grep格式化日志信息
n prune命令清理Docker系统垃圾
l 部署实例
n Docker启动nginx
n 资源编排Web服务
n 集群部署Web服务
Docker安装:
https://docs.docker.com/install/linux/docker-ce/ubuntu/
https://docs.docker.com/docker-for-windows/install/
代码下载:
https://github.com/rickding/HelloDocker
https://github.com/jextop/StarterDeploy
Docker常用命令:镜像、容器、网络、数据卷
Dockerfile示例:
Dockerfile是镜像描述文件,包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。Dockerfile基本结构:
- 基础镜像
- 维护者信息
- 镜像构建指令
- 容器启动时执行指令
FROM node:8
LABEL maintainer="Jext Community, https://github.com/rickding/HelloDocker"
# copy files
COPY . /usr/node/
WORKDIR /usr/node/
# launch service
CMD ["node", "hello.js"]
EXPOSE 8010
Dockerfile常用指令:
Docker-compose资源编排常用命令:
docker-compose.yml示例:
资源编排文件定义了版本信息、services服务配置、networks网络信息、volumes卷信息,包含每个服务启动的容器配置。
version:'3'
services:
db:
hostname:db
image:MySQL:5
command:--default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
environment:
MYSQL_DATABASE:starter
MYSQL_ROOT_PASSWORD:root
api:
image:starter_api:latest
build:.
ports:
- 8011:8011
depends_on:
- db
docker-compose.yml常用指令:
Swarm集群部署常用命令:
logs日志查看技巧
日志在系统运行中至关重要,开发测试以及运维通过系统日志分析查找故障原因。logs命令结合grep格式化日志信息:
docker-compose logs -ft | grep --color -i -e error -e warn -e version -e exception
Docker三剑客logs命令整理如下:
Docker prune清理系统垃圾
Docker基于Linux内核通过操作系统和虚拟容器调用CGroup, Namespace等系统接口完成资源的分配与相互隔离,基本架构如下:
Docker依赖系统资源运行,分配回收过程中会产生一些垃圾,比如docker stop容器后没有执行docker rm删除。运行docker system df查看资源信息,RECLAIMABLE是可回收比例:
增加选项-v将显示详情:docker system df -v
使用技巧:运行prune命令清理垃圾并释放资源:
docker system prune --volumes
Docker提供的prune命令整理如下:
实例1:Docker启动nginx
l 代码:https://github.com/rickding/HelloDocker/tree/master/nginx
配置和脚本文件:
├── docker-compose.yml
├── build.sh
├── run.sh
├── stop.sh
l Dockerfile基于nginx镜像添加网页和配置文件:
FROM nginx:stable
# web files
COPY ./web/ /usr/share/nginx/html
# config
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
COPY ./conf/conf.d /etc/nginx/conf.d
WORKDIR /etc/nginx
EXPOSE 80
l 构建镜像:执行脚本./build.sh或命令:docker build -t nginx:latest .
l 启动容器实例:执行脚本./run.sh或命令:docker run -it --name nginx -p 80:80 -d nginx:latest
l 访问http://localhost:80/,看到页面:
l 停止删除实例:执行脚本./stop.sh或命令:docker stop nginx && docker rm nginx
实例2:资源编排Web服务
l 代码:https://github.com/jextop/StarterDeploy
配置和脚本文件:
├── docker-compose.yml
├── pull.sh
├── up.sh
├── logs.sh
├── down.sh
l docker-compose.yml部署Web服务依赖的多个容器实例,数据库、缓存、消息队列、日志系统、API接口和Web管理后台:
version: '3'
services:
db:
hostname: db
image: mysql:5
command: --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
environment:
MYSQL_DATABASE: starter
MYSQL_ROOT_PASSWORD: root
cache:
hostname: cache
image: redis:4
command: redis-server --appendonly yes
ports:
- 6379:6379
mq:
hostname: mq
image: webcenter/activemq:latest
ports:
- 61616:61616
- 8161:8161
elasticsearch:
hostname: elasticsearch
image: elasticsearch:latest
ports:
- 9200:9200
- 9300:9300
log:
hostname: log
image: registry.cn-shanghai.aliyuncs.com/hellodock/logstash:7.5.2
ports:
- 9600:9600
- 9601:9601
depends_on:
- elasticsearch
db_admin:
image: adminer:latest
ports:
- 3006:8080
depends_on:
- db
api:
image: registry.cn-shanghai.aliyuncs.com/jext/starter_api:latest
ports:
- 8011:8011
depends_on:
- db
- cache
- mq
- log
admin:
image: registry.cn-shanghai.aliyuncs.com/jext/starter_admin:latest
ports:
- 8010:8010
depends_on:
- api
l 启动Web服务:执行脚本./up.sh或命令:docker-compose up -d
l 查看运行实例:docker-compose ps
l 查看日志:执行脚本./logs.sh或命令:docker-compose logs -ft
l 访问http://127.0.0.1:8010/,看到页面:
l 停止和删除服务:执行脚本./down.sh或命令,docker-compose down --remove-orphans
实例3:集群部署Web服务
l 代码:https://github.com/jextop/StarterDeploy
配置和脚本文件:
├── docker-compose.yml
├── pull.sh
├── deploy.sh
├── rm.sh
l docker-compose.yml增加deploy属性,replicas指定副本数量,placement指定docker节点:
deploy:
replicas: 1
# placement:
# constraints: [node.labels.group == api]
l 启动Swarm加入节点构建集群,首个节点自动成为管理员:docker swarm init
l 部署Web服务:执行脚本./deploy.sh或命令:docker stack deploy -c docker-compose.yml starter
l 查看Stack和服务:docker stack ls && docker service ls
l 停止删除服务:执行脚本./rm.sh或命令:docker stack rm starter