docker应用、搭建、container、image、搭建私有云docker registry、容器通信、端口映射、多机多容器通信、数据持久化、docker部署wordpress、docker compose使用、负载均衡、docker Swarm、docker云部署

docker

一、 容器技术和docker简介

1. 部署演变

在一台物理机部署Application

l 虚拟化技术

2. 容器的必要性

开发人员开发一个Application需要各种环境,各种依赖

运维人员部署Application时也需要搭建各种环境

3. 容器解决的问题

l 解决了开发和运维之间的矛盾

4. 容器是什么

l 对软件和其依赖的标准化打包

l 应用之间相互隔离

共享同一个OS Kernel

l 可以运行在很多主流操作系统上

5. 虚拟机与容器的区别

虚拟机是物理层面的隔离,容器是Application层面的隔离

6. docker是什么

l docker是目前最流行的容器技术的实现

l 2004~2008年Linux已经出现了LXC2013docker包装了LXC2013年三月开源,2016docker分为企业版和社区版

7. docker能做什么

l 简化配置

l 提高效率

8. dockerkubernates

l docker可以被k8s管理

l kubernetes,简称k8s

9. DevOps

l DevOps ——解决开发和运维间合作和沟通

不仅仅依赖docker,还需要版本管理,持续集成等

10. docker的应用

2015年的618大促中,京东大胆启用了基于Docker的容器技术来承载大促的关键业务(图片展现、单品页、团购页),当时基于Docker容器的弹性云项目已经有近万个Docker容器在线上环境运行,并且经受住了大流量的考验

l 2016618中,弹性云项目更是担当重任,全部应用系统和大部分的DB服务都已经跑在Docker上,包括商品页面、用户订单、用户搜索、缓存、数据库,京东线上将会启动近15万个Docker容器

l 京东弹性计算云通过软件定义数据中心与大规模容器集群调度,实现海量计算资源的统一管理,并满足性能与效率方面的需求,提升业务自助上线效率。应用部署密度大幅提升,资源使用率提升,节约大量的硬件资源

二、 docker环境的各种搭建方法

1. docker的安装介绍

l 官网:https://docs.docker.com/

l Docker 提供了两个版本:社区版 (CE) 和企业版 (EE)

2. dockermac系统上安装

3. dockerwindows系统上安装

4. dockerCentOS系统上安装

l 官方文档:https://docs.docker.com/install/linux/docker-ce/centos/#set-up-the-repository

防止有残留

yum remove docker

docker-client

docker-client-latest

docker-common

docker-latest

docker-latest-logrotate

docker-logrotate

docker-selinux

docker-engine-selinux

docker-engine

 

安装可能用到的依赖

yum install -y yum-utils

device-mapper-persistent-data

lvm2

 

添加位置

yum-config-manager

--add-repo

https://download.docker.com/linux/centos/docker-ce.repo

 

查询可以装什么docker版本

yum list docker-ce --showduplicates | sort -r

 

安装指定版本

yum -y install docker-ce-18.06.1.ce-3.el7

 

开启

systemctl start docker

 

设置开机自启动

systemctl enable docker

 

查看版本

 

装完docker,修改如下文件,写入内容,重启docker,配置国内镜像

vi /etc/docker/daemon.json

加入以下内容:

{

"registry-mirrors": [

"https://kfwkfulq.mirror.aliyuncs.com",

"https://2lqq34jg.mirror.aliyuncs.com",

"https://pee6w651.mirror.aliyuncs.com",

"https://registry.docker-cn.com",

"http://hub-mirror.c.163.com"

],

"dns": ["8.8.8.8","8.8.4.4"]

}

重启docker 

systemctl restart docker

5. dockerUbuntu系统上安装

6. docker-machine的使用

l Docker Machine Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker

可以通过 docker-machine 命令来管理这些虚拟机和 Docker

7. docker palyground

l 地址:https://labs.play-with-docker.com/

直接使用云端的docker

公共的,每个人用4小时

左侧点一下,就增加一个实例

 

三、 docker的镜像和容器

1. docker的底层技术实现架构

l docker提供了打包运行app的平台

app与底层基础设施隔离

2. docker engine

l docker engine是核心,里面有后台进程dockerd,提供了REST API接口,还提供了CLI接口,另外,docker就是一种C/S的架构

3. 整体架构

 

4. 底层技术支持

l Namespaces:网络隔离

l Control groups:资源限制

l Union file systems:系统分层

5. docker image概述

是文件和meta data的集合

6. 制作baseImage

l baseImage:基于系统的基础镜像

 

 

根据当前位置编译镜像

docker build -t gochaochao/hello-world .

 

可以查看编译后的镜像

docker image ls

 

运行镜像,成为一个容器

docker run gochaochao/hello-world

 

也可以官方直接拉取镜像

docker pull redis

 

查看镜像

 

7. container概念和使用

l container可以理解为运行时的实例,与image不同

查看所有运行过的container容器

 

如果没有就去官方下载

 

可以交互运行容器

 

此时,可以查到当期运行时的容器

 

删除某个镜像

 

还可以删除所有容器

 

查出所有没有在运行的实例

 

如下指令可以删除没有在运行的容器

 

 

8. 创建Image的两种方式

基于image创建container后,如果在container做了一些变化,例如安装了某个软件,可以将这些改变,commit成一个新的image,也可以简写为docker commit

交互运行一个centos实例,给里面装一个lrzsz

 

装完退出

 

可以查看到修改后的容器

 

将这个新的容器,打包成一个新的镜像

生成新的镜像

docker commit determined_hermann gochaochao/centos-lrzsz

 

查看镜像

 

还可以根据镜像id,查看到镜像分层信息

 

使用Dockerfile,通过build制作image,可以简写为docker build

通过定义文件,一样的效果

 

 

编译镜像

docker build -t gochaochao/centos-lrzsz2 .

 

 

可以查看到多出个镜像

再次启动:docker container start 470671670cac

 

9. Dockerfile详解

l FROM:从哪开始,从一个系统开始

FROM scratch         # 最小系统

FROM centos         

FROM ubuntu:14.04

l LABEL:注释

LABEL version=”1.0”

LABEL auther=”sjc”

l RUN:执行命令,每RUN一次,会多一个系统分层,尽量少一些层

RUN yum -y update && install lrzsz

net-tools

l WORKDIR:进入或创建目录,尽量不要用相对路径

WORKDIR /root     # 进入 /root 目录

WORKDIR /test     # 会在根下,创建 /test 并进入

WORKDIR demo    # 创建demo,进入

RUN pwd          # /test/demo

l ADD and COPY:将本地的文件,添加到image里,COPYADD区别是不会解压

ADD hello /  # 将当前目录下hello,添加到容器的根下

ADD tt.tar.gz /  # 压缩包扔进去,并解压

l ENV,增加Dockerfile的可读性,健壮性

 

l CMD and ENTRYPOINT:执行命令或运行某个脚本

10. Dockerfile——CMD vs ENTRYPOINT

l ShellExec格式

 

l ENTRYPOINTCMD:容器启动时,运行什么命令

 

ENTRYPOINTCMD用的多,因为CMD有可能执行完前面的,把后面定义的CMD给忽略不执行了

11. 分享docker image

l image名字一定要以自己docker hub的用户名开头

登录

 

上传镜像到docker hub

docker image push gochaochao/centos-lrzsz2:latest

 

下载镜像到本地

 

若想从docker hub删镜像

 

 

 

12. 分享Dockerfile

l docker image不如分享Dockerfile,更加安全

13. 搭建私有docker registry

l github是公开的,也可以创建自己的私有仓库

docker官方给提供了私有仓库的镜像

 

准备第二台机器,作为私有仓库

第二台运行如下

docker run -d -p 5000:5000 --restart always --name registry registry:2

 

查看进程,运行没问题

 

浏览器可以看到第二台机器仓库里,没东西

 

测试端口,第一台可以下个telnet

yum -y install telnet

 

输入q退出

 

编写dockerfile,编译要求的镜像名

 

按dd删除整行

 

编译镜像,IP是私有仓库的IP

docker build -t 192.168.190.131:5000/centos .

 

编写文件,加一行

"insecure-registries":["192.168.190.131:5000"],

 

 

重启docker

 

上传到私有仓库

 

刷新页面,私有仓库有内容了

 

若从私有仓库下东西,如下:

docker pull 192.168.190.131:5000/centos

14. Dockerfile案例

创建一个pythonweb应用,然后打包成docker image运行

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello():

    return "hello docker"

if __name__ == '__main__':

    app.run()

创建目录,创建个app.py,拷贝上面代码

 

 

创建Dockerfile

 

FROM python:3.6

LABEL auth="sun"

RUN pip install flask

COPY app.py /app/

WORKDIR /app

EXPOSE 5000

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

构建镜像

docker build -t gochaochao/flask-hello-world .

 

运行镜像

docker run gochaochao/flask-hello-world

 

此时可以查看到进程

 

15. 运行中对container操作

l exec命令用于调用并执行指令的命令

后台运行

 

可以交互运行里面的机器,根据运行时的container ID

 

交互运行容器里面机器的python shell

docker exec -it e8517231ecd8 python

 

后台运行一个容器,并指定容器名字

docker run -d --name=demo gochaochao/flask-hello-world

 

可以根据名字停止启动

 

可以查看运行时的容器的运行日志

 

查看运行时容器详细信息

 

ping一下里面的地址

 

16. 对容器资源限制

l 对内存的限制

CPU的限制

可以指定开启容器占用的内存和CPU

 

四、 docker的网络

1. 网络分类

l 单机

n Bridge Network:相当于VMware的桥接,默认跑这个

n Host Network:类似于VMNAT

n None Network:没网

l 多机

n Overlay Network:集群网络

可以查看网卡信息

 

2. Linux网络命名空间namespace

命名空间是docker底层重要的概念

3. Bridge详解

l 进行多容器通信

4. 容器通信

有时写代码时,并不知道要请求的IP地址

运行一个最小系统

docker run -d --name test1 busybox /bin/sh -c "while true;do sleep 3600;done"

 

起第二个最小系统,链接第一个

链接类似于配置主机名和映射

docker run -d --name test2 --link test1 busybox /bin/sh -c "while true;do sleep 3600;done"

 

假设此时,test2部署了项目,test1部署了项目用的mysql,那么项目访问mysql时,编写项目就可以不指定IP,指定成test1,就可以通,因为是linke了

5. 端口映射

l 实现外界访问

运行一个nginx,可以查到进程

 

 

通过桥接网卡,查看到容器的IP

 

 

从本机,可以访问到nginx启动了的主页

 

此时外界是无法访问到的,可以通过端口映射解决

停止并删除前面的容器

 

端口映射启动容器

docker run --name web -d -p 80:80 nginx

 

此时,外界浏览器可以通过虚拟机IP,访问到容器内的内容

 

6. 网络的nonehost

l none应用场景:安全性要求极高,存储绝密数据等

l host网络类似于NAT

7. 多容器部署和应用

可以清理下前面的容器

 

 

2个容器,一个用flaskweb服务,另一个redis做自增

首先,跑起来一台redis

 

 

创建目录,编写代码

 

l app.py

from flask import Flask

from redis import Redis

import os

import socket

 

app = Flask(__name__)

redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)

 

@app.route('/')

def hello():

    redis.incr('hits')

    return 'Hello Container World! I have been seen %s times and my hostname is %s. ' % (redis.get('hits'),socket.gethostname())

 

if __name__ == "__main__":

    app.run(host="0.0.0.0", port=5000, debug=True)

再编写一个dockerfile

 

l Dockerfile

FROM python:2.7

LABEL maintaner="1320685524@qq.com"

COPY . /app

WORKDIR /app

RUN pip install flask redis

EXPOSE 5000

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

构建一个镜像

docker build -t gochaochao/flask-redis .

 

运行构建好的镜像,外界访问,需要加个 -p 5000:5000

 

成功跑起2个容器

 

进入flask容器,访问运行的代码,可以看到调用了redis自增

 

8. 多机器多容器通信

可能出现容器IP一样,会出问题,可以加一个etcd去管理,防止IP冲突

 

2台机器,etcd安装包传到2台机器

 

都解压

 

第一台:进入解压后的etcd,运行如下,注意修改IP

运行.txt 找命令,拷贝进去

etcd启动命令(node01),注意修改IP

nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://192.168.83.128:2380

--listen-peer-urls http://192.168.83.128:2380

--listen-client-urls http://192.168.83.128:2379,http://127.0.0.1:2379

--advertise-client-urls http://192.168.83.128:2379

--initial-cluster-token etcd-cluster

--initial-cluster docker-node1=http://192.168.83.128:2380,docker-node2=http://192.168.83.130:2380

--initial-cluster-state new&

etcd启动命令(node02),注意修改IP

nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.83.130:2380

--listen-peer-urls http://192.168.83.130:2380

--listen-client-urls http://192.168.83.130:2379,http://127.0.0.1:2379

--advertise-client-urls http://192.168.83.130:2379

--initial-cluster-token etcd-cluster

--initial-cluster docker-node1=http://192.168.83.128:2380,docker-node2=http://192.168.83.130:2380

--initial-cluster-state new&

 

2台可以看到etcd是健康的状态

 

此时,停止docker

 

运行被etcd管理的docker

/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.83.128:2379 --cluster-advertise=192.168.83.128:2375&

 

第二台一样的,停止docker,然后 运行.txt里找命令启动

/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.83.130:2379 --cluster-advertise=192.168.83.130:2375&

查看网络docker network

 

查看网路详细信息docker network ls

 

上面搞定后,第一台机器创建个虚拟网卡

docker network create -d overlay demo

 

此时,第二台也可以看到这个网络

 

还可以第一台创建个容器

docker run -d --name test3 --net demo busybox sh -c "while true;do sleep 3600;done"

 

此时第二台运行一样的,会报错,已经存在,解决了集群间docker机器互相不认识的情况

 

例如一台做redis,一台做web处理

l app.py

from flask import Flask

from redis import Redis

import os

import socket

 

app = Flask(__name__)

redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)

 

@app.route('/')

def hello():

    redis.incr('hits')

    return 'Hello Container World! I have been seen %s times and my hostname is %s. ' % (redis.get('hits'),socket.gethostname())

 

if __name__ == "__main__":

    app.run(host="0.0.0.0", port=5000, debug=True)

l Dockerfile

FROM python:2.7

LABEL maintaner="sjc_job@126.com"

COPY . /app

WORKDIR /app

RUN pip install flask redis

EXPOSE 5000

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

9. overlay网络和etcd通信

l 多机多容器部署时,需要保证地址不冲突

五、 docker的持久化存储和数据共享

1. 数据持久化引入

l 容器中数据存在丢失的风险

2. 数据持久化方案

基于本地文件系统的Volume

基于pluginVolume

3. Volume的类型

受管理的data Volume:由docker后台自动创建

绑定挂载的Volume:具体挂载位置可以由用户指定

4. 数据持久化——data Volume

l https://hub.docker.com/mysql,可以看到官方的Dockerfile中也定义了VOLUME

官方mysql里定义的

 

前边的容器清一下

 

后台启动个mysql

docker run -d --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

 

查看docker所有的持久化到本地的数据文件

 

可以看到存到了本地的哪里详细信息

 

持久化的redis数据

 

持久化的mysql数据

 

存储的mysql库文件

 

可以清除不被引用的数据文件

docker volume prune

 

启动容器,指定持久化数据目录文件

docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

 

进入容器的mysql

 

随便写点东西退出

 

 

关闭并删除容器

 

指定数据同步位置,开mysql容器

docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

 

交互运行,可以查看到数据已经导入

 

 

5. 数据持久化——bind mouting

l 可以指定一个与容器同步的文件夹,容器变化,文件同步变化

找个目录,创建个文件,写点东西

 

 

编写dockerfile

FROM nginx:latest

WORKDIR /usr/share/nginx/html

COPY index.html index.html

 

构建镜像

 

启动容器,挂载目录

 

此时,修改本地index.html文件,里面访问的首页是直接变的

 

六、 docker Compose多容器部署

1. docker部署wordpress

l wordpress是一个博客网站,需要2个镜像,还需要一个mysql

查看所有的image

 

清理image

 

下载wordpress

 

5.5

 

5.5的,改成latest

docker tag mysql:5.5 mysql:latest

 

启动mysql镜像

 

启动wordpress镜像

 

浏览器查看下

 

上面wordpress部署,需要一个一个的下载和开启,比较麻烦,需要docker compose

2. docker compose介绍

l 多容器的APP很难部署和管理,docker compose就类似于批处理

3. docker compose安装和使用

先上传文件到目录

 

l 安装后需要赋权限

 

查看版本号

 

创建文件夹

 

创建文件,写入以下内容

 

docker-compose的方式部署wordpress

version: '3'

 

services:

 

  wordpress:

    image: wordpress

    ports:

      - 80:80

    environment:

      WORDPRESS_DB_HOST: mysql

      WORDPRESS_DB_PASSWORD: admin

    networks:

      - my-bridge

 

  mysql:

    image: mysql:5.5

    environment:

      MYSQL_ROOT_PASSWORD: admin

      MYSQL_DATABASE: wordpress

    volumes:

      - mysql-data:/var/lib/mysql

    networks:

      - my-bridge

 

volumes:

  mysql-data:

 

networks:

  my-bridge:

    driver: bridge

启动compose

 

浏览器查看

 

可以查看进程

 

对于很复杂的项目,只要编写好docker-compose,就可以很容易的运行起来

 

4. 容器扩展和负载均衡

l 容器扩展

stop停止容器,down是停止并删除

 

 

docker-compose结合Dockerfile使用

在前边例子里,编写一个docker-compose.yml ,加入如下内容

 

 

version: "3"

services:

  redis:

    image: redis

  web:

    build:

      context: .

      dockerfile: Dockerfile

    ports:

      - 8080:5000

    environment:

      REDIS_HOST: redis

运行

 

可以通过浏览器访问

 

停止docker-compose

 

docker-compose.yml 里如下2行删掉

 

进行容器扩展

 

加负载均衡:

首先修改 app.py

 

 

Dockerfile里面也改一下

 

 

docker-compose.yml文件,加入以下内容,负载均衡

lb:

image: dockercloud/haproxy

links:

- web

ports:

- 8080:80

volumes:

- /var/run/docker.sock:/var/run/docker.sock

version: "3"

services:

  redis:

    image: redis

  web:

    build:

      context: .

      dockerfile: Dockerfile

    environment:

      REDIS_HOST: redis

  lb:

    image: dockercloud/haproxy

    links:

      - web

    ports:

      - 8080:80

    volumes:

      - /var/run/docker.sock:/var/run/docker.sock

再次启动容器

docker-compose up --scale web=3 -d

 

启动后,访问代码,可以看出是不同的容器返回的信息

 

5. 复杂应用部署

l 6-5项目部署

七、 容器编排docker Swarm

k8s   管理所有的docker的

docker swarm k8s功能差不多

1. 编排swarm简介

 

l 服务创建和调度

l 在swarm manage做决策,决定将worker部署到哪里

 

2. 三节点swarm集群的搭建

3. 创建维护Service并扩展

4. 使用DockerStack部署VotingApp

5. 使用DockerStack部署可视化应用

6. 使用并管理DockerSecret

7. 更新service版本

八、 docker Cloud和docker企业版

1. docker公司业务介绍

l 2017年初,docker分为社区版和企业版

l docker公司还提供培训,网址:https://training.docker.com/

 

l docker公司还提供认证,网址:http://success.docker.com/

 

l 类似于苹果的AppStore,网址:https://store.docker.com/

 

可以通过web界面创建service,网址:https://cloud.docker.com/,这是收费的

 

2. docker cloud自动化构建

docker公司第一个CaaScontainer-as-a-service)产品,提供容器服务的,是在PaaS(类似于阿里云)之上的,就算在云上搭建docker服务

l 是提供容器的管理、编排、部署的托管服务

l docker公司2015年收购了tutum公司,将tutum改装成了docker cloud

l docker cloud提供的主要模块如下:

 

使用docker cloud时,需要与github账号关联

3. docker企业版的在线使用

l 网址:https://www.docker.com/products/docker-enterprise

使用docker公司提供的单节点的企业版试用,试用时间12小时

l 点击申请使用

 

l 在线试用时间太短,下面用本地试用的方式

4. 阿里云部署容器

l 网址:https://cn.aliyun.com/

 

l 往下拉,点击右侧容器服务

 

l 点击立即开通

 

l 可以直接支付宝登录

 

l 授权

 

l 注册

 

l 立即开通,可能需要实名认证

 

l 成功开通

 

l 同意授权

 

5. 阿里云部署dockerEE

l 网址:https://cn.aliyun.com/

九、 容器编排Kubernetes

l KubernetesGoogle开源的容器集群管理系统,可能被墙,所以要。。。

简称k8s2017年底,docker宣布支持k8s,宣布了k8s取得了阶段性胜利

l 20147月,Docker收购Orchard Labs,由此Docker公司开始涉足容器编排领域,Orchard Labs这家2013年由两位牛逼的年轻人创建的公司,有一个当时非常著名的容器编排工具fig,而这个fig就是docker-compose的前身

l 2015年初,Docker发布Swarm,开始追赶Kubernetes的脚步,正式进入容器编排领域,与k8s竞争

l 20173月,Docker公司宣布Docker企业版诞生,自此开始区分社区版和企业版,从2016年到2017年初,Docker公司的一些列动作充分展示了一个创业公司的盈利压力。Docker公司的一系列努力,并没有能让Docker Swarm走上容器编排的巅峰,相反,Kubernetes因为其优秀的架构和健康的社区环境,得到迅速发展,在生产环境中得到了广泛的应用,然后用户反馈,社区回应,良性循环了下去。2017年各大厂商都开始拥抱Kubernetes,亚马逊AWSMicrosoft AzureVMware, 有的甚至抛弃了自家的产品

l 2017年底,Docker宣布在自家企业版里支持Kubernetes,和Swarm一起作为容器编排的解决方案供用户选择

在容器底层技术领域,Docker还是老大,Kubernetes底层更更多的还是选择使用containerd

 

l swarm的架构

l k8s的架构,主称为master,从称为node

 

l k8smaster节点,API Server是对外的,可以通过UI访问,Scheduler是调度模块,Controller是控制模块,etcd就是分布式存储,存储k8s整个的状态和配置

 

l k8snode节点,pod是容器中调度的最小单位,指具有相同namespacecontainer的组合,kubelet类似于代理,可以做创建容器的管理,kube-proxy和网络有关,做端口代理和转发,Fluentd是做日志的采集、存储和查询

 

l k8s整体架构

 

十、 总结

原文地址:https://www.cnblogs.com/zhang-da/p/13062671.html