docker基础及第一个helloworld

  • docker是什么
    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

  • 核心概念
    镜像(image)

Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

image

仓库(repository)

仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

容器(container)

Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

  • Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
docker

  • docker和virt-machine的区别
    doc-vir

  • docker安装

[root@docker ~]# vim /tmp/docker-ce-install.sh
#/bin/bash
yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-edge
yum-config-manager --enable docker-ce-test
yum makecache fast
yum install -y docker-ce 
#yum list docker-ce.x86_64  --showduplicates
systemctl enable docker
systemctl start docker
  • 镜像加速
    [root@docker ~]# vim /etc/systemd/system/multi-user.target.wants/docker.service
    ExecStart=/usr/bin/dockerd –registry-mirror=https://jxus37ad.mirror.aliyuncs.com

  • docker命令
    command

  • 命令举例

[root@docker-train ~]# docker info
[root@docker-train ~]# docker images
[root@docker-train ~]# docker run -d --hostname nginx --name nginx -p 80:80 10.10.84.110:5000/nginx
[root@docker ~]# docker run -d -it --name volume-test3 --volumes-from volume-test1 centos:7.2.1511 

实践一:单机部署helloworld

在单机环境下搭建一个6节点的Docker应用栈:
1个代理节点
2个web应用节点
1个主数据库节点
2个从数据库节点
helloworld

搭建过程:

1.获取镜像
[root@docker-train ~]# docker pull 10.10.84.110:5000/haproxy
[root@docker-train ~]# docker pull 10.10.84.110:5000/ubuntu
[root@docker-train ~]# docker pull 10.10.84.110:5000/redis
[root@docker-train ~]# docker pull 10.10.84.110:5000/django
2.应用栈容器节点启动和互联
[root@docker-train ~]# docker run -d --name redis-master 10.10.84.110:5000/redis:latest
[root@docker-train ~]# docker run -d --name redis-slave1 --link redis-master:master 10.10.84.110:5000/redis:latest
[root@docker-train ~]# docker run -d --name redis-slave2 --link redis-master:master 10.10.84.110:5000/redis:latest
[root@docker-train ~]# docker run -d --name APP1 --link redis-master:db -v ~/Projects/Django/APP1:/usr/src/app 10.10.84.110:5000/django:latest
[root@docker-train ~]# docker run -d --name APP2 --link redis-master:db -v ~/Projects/Django/APP2:/usr/src/app 10.10.84.110:5000/django:latest
[root@docker-train ~]# docker run -it --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:/tmp 10.10.84.110:5000/haproxy:latest /bin/bash
3.redis容器节点配置
  • 配置redis-master,将redis.conf放到/usr/local/bin,
    主要修改参数:
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis.pid

加载配置文件

redis-server /usr/local/binredis.conf
  • 配置redis-slave,将redis.conf放到/usr/local/bin,
    主要修改参数:
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis.pid
slaveof master 6379

加载配置文件
redis-server /usr/local/binredis.conf

4.redis主从访问测试
[root@docker-train ~]# docker exec -it redis-master/bin/bash
root@1e012869dd90:/data# redis-cli 
127.0.0.1:6379> set master hello
[root@docker-train ~]# docker exec -it redis-slave1/bin/bash
root@1e012869dd90:/data# redis-cli 
127.0.0.1:6379> get master
"hello"
5.app容器(Django)节点配置

以APP1为例

[root@docker-train ~]# docker exec  -it APP1 /bin/bash
root@0e306deca5c5:/# pip install redis
Collecting redis
  Downloading redis-2.10.6-py2.py3-none-any.whl (64kB)
    100% |████████████████████████████████| 71kB 27kB/s 
Installing collected packages: redis
Successfully installed redis-2.10.6
root@0e306deca5c5:/# python
Python 3.4.5 (default, Dec 14 2016, 18:54:20) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis
>>> print(redis.__file__)
/usr/local/lib/python3.4/site-packages/redis/__init__.py
root@0e306deca5c5:/# cd /usr/src/app/
root@0e306deca5c5:/usr/src/app# mkdir dockerweb
root@0e306deca5c5:/usr/src/app# cd dockerweb/
root@0e306deca5c5:/usr/src/app/dockerweb# django-admin.py startproject redisweb
root@0e306deca5c5:/usr/src/app/dockerweb# ls
redisweb
root@0e306deca5c5:/usr/src/app/dockerweb# cd redisweb/
root@0e306deca5c5:/usr/src/app/dockerweb/redisweb# ls
manage.py  redisweb
root@0e306deca5c5:/usr/src/app/dockerweb/redisweb# python manage.py startapp helloworld
root@0e306deca5c5:/usr/src/app/dockerweb/redisweb# ls
helloworld  manage.py  redisweb

在主机下修改views.py文件

[root@docker-train ~]# vim ~/Projects/Django/APP1/dockerweb/redisweb/helloworld/views.py
from django.shortcuts import render
from django.http import HttpResponse
import redis

def hello(request):
        str=redis.__file__
        str+="<br>"
        r = redis.Redis(host='db',port=6379,db=0)
        info = r.info()
        str+=("Set Hi <br>")
        # r.set('Hi','HelloWorld-APP2')
        str+=("Get Hi: HelloWorld-APP1 <br>")
        str+=("Redis Info: <br>")
        str+=("Key: Info Value")
        for key in info:
                str+=("%s: %s <br>" % (key,info[key]))
        return HttpResponse(str)

修改settings.py

[root@docker-train ~]# vim ~/Projects/Django/APP1/dockerweb/redisweb/redisweb/settings.py
ALLOWED_HOSTS = ['*']

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'helloworld',
]

修改urls配置文件
[root@docker-train ~]# vim ~/Projects/Django/APP1/dockerweb/redisweb/redisweb/urls.py

from django.conf.urls import url
from django.contrib import admin
from helloworld.views import hello

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^helloworld$',hello),

修改完以上配置文件后,需要再进入容器完成项目生成

[root@docker-train ~]# docker exec -it APP1 /bin/bash
root@0e306deca5c5:/# cd /usr/src/app/dockerweb/redisweb/
root@0e306deca5c5:/usr/src/app/dockerweb/redisweb# python manage.py makemigrations
No changes detected
root@0e306deca5c5:/usr/src/app/dockerweb/redisweb# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK

运行APP1

root@0e306deca5c5:/usr/src/app/dockerweb/redisweb# python manage.py runserver 0.0.0.0:8001
Performing system checks...

System check identified no issues (0 silenced).
September 25, 2017 - 12:27:06
Django version 1.10.4, using settings 'redisweb.settings'
Starting development server at http://0.0.0.0:8001/
Quit the server with CONTROL-C.
6.HA容器(haproxy)节点的配置

再主机上修改haproxy.cfg配置文件

[root@docker ~]# cd ~/Projects/HAProxy/
[root@docker HAProxy]# vim haproxy.cfg

global
       maxconn 20480                   #默认最大连接数 
       log 127.0.0.1 local0            #[err warning info debug] 
       chroot /usr/local/sbin             #chroot运行的路径 
       daemon                          #以后台形式运行haproxy 
       nbproc 4                        #进程数量(可以设置多个进程提高性能) 
       pidfile /usr/local/sbin/haproxy.pid    #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 
       ulimit-n 65535                  #ulimit的数量限制  
defaults
       log 127.0.0.1 local0
       mode http                       #所处理的类别 (#7层 http;4层tcp  ) 
       maxconn 20480                   #最大连接数 
       #option httplog                  #日志类别http日志格式 
       #option httpclose                #每次请求完毕后主动关闭http通道 
       option dontlognull              #不记录健康检查的日志信息 
       #option forwardfor               #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
       option redispatch               #serverId对应的服务器挂掉后,强制定向到其他健康的服务器  
       #option abortonclose             #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 
       #stats refresh 30                #统计页面刷新间隔 
       retries 3                       #3次连接失败就认为服务不可用,也可以通过后面设置 
       balance roundrobin              #默认的负载均衡的方式,轮询方式 
       #balance source                  #默认的负载均衡的方式,类似nginx的ip_hash 
       #balance leastconn               #默认的负载均衡的方式,最小连接 
       #contimeout 5000                 #连接超时 
       #clitimeout 50000                #客户端超时 
       #srvtimeout 50000                #服务器超时 
       #timeout check 2000              #心跳检测超时
       timeout connect 5000ms
       timeout client 50000ms
       timeout server 50000ms
       listen redis_proxy
       bind 0.0.0.0:6301
       stats enable
       stats uri /haproxy-stats
                server APP1 APP1:8001 check inter 2000 rise 2 fall 5
                server APP2 APP2:8002 check inter 2000 rise 2 fall 5

进入容器,将/tmp/haproxy.cfg复制到/usr/local/bin下,读取配置文件

[root@docker-train HAProxy]# docker exec -it HAProxy /bin/bash
root@029a0b1316ed:/# cp /tmp/haproxy.cfg /usr/local/bin/
root@029a0b1316ed:/# cd /usr/local/bin
root@029a0b1316ed:/usr/local/bin# haproxy -f haproxy.cfg

再浏览器中输入http://10.10.84.109:6301/helloworld 测试
url

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值