docker应用、搭建、container、image、搭建私有云docker registry、容器通信、端口映射、多机多容器通信、数据持久化、docker部署wordpress、docker co

一、 容器技术和docker简介

1. 部署演变

l 在一台物理机部署Application

l 虚拟化技术

2. 容器的必要性

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

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

3. 容器解决的问题

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

4. 容器是什么

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

l 应用之间相互隔离

l 共享同一个OS Kernel

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

5. 虚拟机与容器的区别

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

6. docker是什么

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

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

7. docker能做什么

l 简化配置

l 提高效率

8. dockerkubernates

l docker可以被k8s管理

l kubernetes,简称k8s

9. DevOps

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

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

10. docker的应用

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

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

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

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

1. docker的安装介绍

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

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

2. docker在mac系统上安装

3. dockerwindows系统上安装

4. dockerCentOS系统上安装

l 官方文档:Install Docker Engine on CentOS | Docker Documentation

防止有残留

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

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

7. docker palyground

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

l 直接使用云端的docker

公共的,每个人用4小时

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

三、 docker的镜像和容器

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

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

l 将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概述

l 是文件和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的两种方式

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

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

装完退出

可以查看到修改后的容器

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

生成新的镜像

docker commit determined_hermann gochaochao/centos-lrzsz

查看镜像

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

l 使用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里,COPY和ADD区别是不会解压

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

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

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

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

10. Dockerfile——CMD vs ENTRYPOINT

l Shell和Exec格式

l ENTRYPOINT与CMD:容器启动时,运行什么命令

ENTRYPOINT比CMD用的多,因为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案例

l 创建一个python的web应用,然后打包成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 对内存的限制

l 对CPU的限制

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

四、 docker的网络

1. 网络分类

l 单机

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

n Host Network:类似于VM的NAT

n None Network:没网

l 多机

n Overlay Network:集群网络

可以查看网卡信息

2. Linux网络命名空间namespace

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

3. Bridge详解

l 进行多容器通信

4. 容器通信

l 有时写代码时,并不知道要请求的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. 网络的none和host

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

l host网络类似于NAT

7. 多容器部署和应用

可以清理下前面的容器

有2个容器,一个用flask做web服务,另一个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.\n' % (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="[email protected]"

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机器互相不认识的情况

l 例如一台做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.\n' % (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="[email protected]"

COPY . /app

WORKDIR /app

RUN pip install flask redis

EXPOSE 5000

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

9. overlay网络和etcd通信

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

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

1. 数据持久化引入

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

2. 数据持久化方案

l 基于本地文件系统的Volume

l 基于plugin的Volume

3. Volume的类型

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

l 绑定挂载的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 安装后需要赋权限

查看版本号

创建文件夹

创建文件,写入以下内容

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/

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

2. docker cloud自动化构建

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

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

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

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

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

3. docker企业版的在线使用

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

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

l 点击申请使用

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

4. 阿里云部署容器

l 网址:阿里云-计算,为了无法计算的价值

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

l 点击立即开通

l 可以直接支付宝登录

l 授权

l 注册

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

l 成功开通

l 同意授权

5. 阿里云部署dockerEE

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

九、 容器编排Kubernetes

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

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

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

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

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

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

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

l swarm的架构

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

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

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

l k8s整体架构

转自https://www.cnblogs.com/zhang-da/p/13062671.html

猜你喜欢

转载自blog.csdn.net/lingshengxiyou/article/details/130369742