(第2章)Docker基础

1.Docker子命令的分类

子命令分类 子命令
Docker环境信息 info、version
容器生命周期管理 create、exec、kill、pause、restart、rm、run、start、stop、unpause
镜像仓库命令 login、logout、pull、push、search
镜像管理 build、images、import、load、rmi、save、tag、commit
容器运维操作 attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff
系统日志信息 events、history、logs

2.搭建Docker应用栈

  • Docker应用栈的含义
    (1)Docker希望保证一个容器只运行一个进程,即只提供一种服务
    (2)然而,用户通常需要利用多个容器,分别提供不同的服务,并在不同容器间互连通信,最后实现一个Docker集群。
    (3)基于Docker集群构建的应用,我们称之为Docker App Stack,即Docker应用栈
  • 所要搭建的6个节点的Docker应用栈架构如下所示:
    (1)包括:1个代理节点、2个Web应用节点、1个主数据库节点、2个从数据库节点
    (2)HAProxy是1个负载均衡的代理节点,Redis是非关系型的数据库,它由1个主数据库节点和2个从数据库节点组成,App是应用(Python,基于Django架构设计一个访问数据库的基础Web应用)
    在这里插入图片描述
  • 获取HAProxy、Redis、Djingo镜像
docker pull django
docker pull ubuntu
docker pull haproxy
docker pull redis
  • 应用栈容器节点互联
    (1)在同一个主机下搭建容器应用栈,只需要完成容器互联来实现容器间的通信,即使用:docker run命令的–link,作用:避免容器的 IP 和端口暴露到外网所导致的安全问题,还可以防止容器在重启后 IP 地址变化导致的访问失效
    (2)–link可以理解欸一条IP地址的单向记录信息,所以需要注意各容器节点的启动顺序
    启动redis-master容器;
    启动2个redis-slave容器节点要连接到redis-master容器;
    启动2个APP容器节点连接到redis-master容器;
    启动HAProxy容器节点要连接到2个APP节点上。

  • 应用栈容器的节点启动顺序

eg:--link
root@ubuntu:/home/jiwangreal# docker run --link redis:redis --name console ubuntu bash
在ubuntu镜像上启动一个容器,并命名为console,并将其连接到名为redis的容器上

(1)启动redis容器
root@ubuntu:/home/jiwangreal# docker run -it --name redis-master redis /bin/bash
root@ubuntu:/home/jiwangreal# docker run -it --name redis-slave1 --link redis-master:master redis /bin/bash
root@ubuntu:/home/jiwangreal# docker run -it --name redis-slave2 --link redis-master:master redis /bin/bash

在容器内查看/etc/hosts文件中记录了master的连接信息以及IP地址
root@c63515859e04:/data# cat /etc/hosts 
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.4	master 11c80d696b12 redis-master
172.17.0.5	c63515859e04

(2)启动Django容器
root@ubuntu:/home/jiwangreal# docker run -it --name APP1 --link redis-master:db -v ~/Projects/Django/App1:/usr/src/app django /bin/bash

root@ubuntu:/home/jiwangreal# docker run -it --name APP2 --link redis-master:db -v ~/Projects/Django/App2:/usr/src/app django /bin/bash3)启动HAProxy容器
-p参数:暴露端口给主机使用
root@ubuntu:/home/jiwangreal# docker run -it --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:/tmp haproxy /bin/bash

  • 应用栈容器节点的配置
1)Redis Master主数据库容器节点的配置
在容器启动时,利用-v参数挂载volume,主机和容器间共享数据,这样就可以在主机上创建和编辑相关文件,
可以省略在容器中安装各类编辑工具

volume在主机中的目录:/var/lib/docker/volumes/e662689e21f1d2b8ebe39e7012f78ab0197d6c556aad8996e351063514f3e166/_data
在容器中的目录:/data
root@ubuntu:/home/jiwangreal# docker inspect --format "{{.Config.Volumes}}" 058a1ff70ef1
map[/data:{}]
root@ubuntu:/home/jiwangreal# docker inspect 058a1ff70ef1 | grep Source
Error: No such object: bc8e
root@ubuntu:/home/jiwangreal# docker inspect 058a1ff70ef1 | grep Source
                "Source": "/var/lib/docker/volumes/e662689e21f1d2b8ebe39e7012f78ab0197d6c556aad8996e351063514f3e166/_data",

在主机上配置:
如果本机没有install redis,参考:https://blog.csdn.net/zstack_org/article/details/69951845,安装下即可
root@ubuntu:/tmp/redis-stable# cd /var/lib/docker/volumes/e662689e21f1d2b8ebe39e7012f78ab0197d6c556aad8996e351063514f3e166/_data
root@ubuntu:/var/lib/docker/volumes/e662689e21f1d2b8ebe39e7012f78ab0197d6c556aad8996e351063514f3e166/_data# cp /etc/redis/redis.conf redis.conf
修改的参数如下:下面的bind的地址要进入相应的容器中中/etc/hosts去查看
daemonize yes
pidfile /var/run/redis.pid
replica-read-only no
bind 172.17.0.2

进入master redis容器进行配置:
root@058a1ff70ef1:/# cd /data
root@058a1ff70ef1:/data# cp redis.conf /usr/local/bin/
root@058a1ff70ef1:/data# cd /usr/local/bin
root@058a1ff70ef1:/usr/local/bin# redis-server redis.conf 22个Redis Slave从数据库容器节点的配置
Slave1的配置过程:

root@ubuntu:/# docker inspect 1ea3c524972c|grep -i source
                "Source": "/var/lib/docker/volumes/965a49088302ed9d16ee8ac148bac420fbeb48206c076346d850147aae9e9ed1/_data",
root@ubuntu:/# cd /var/lib/docker/volumes/965a49088302ed9d16ee8ac148bac420fbeb48206c076346d850147aae9e9ed1/_data
root@ubuntu:/var/lib/docker/volumes/965a49088302ed9d16ee8ac148bac420fbeb48206c076346d850147aae9e9ed1/_data# cp /etc/re
redis/       resolvconf/  resolv.conf  
root@ubuntu:/var/lib/docker/volumes/965a49088302ed9d16ee8ac148bac420fbeb48206c076346d850147aae9e9ed1/_data# cp /etc/redis/redis.conf redis.conf
root@ubuntu:/var/lib/docker/volumes/965a49088302ed9d16ee8ac148bac420fbeb48206c076346d850147aae9e9ed1/_data# vim redis.conf 
daemonize yes
pidfile /var/run/redis.pid
slaveof master 6379
bind 172.17.0.3

进入slave1 redis容器进行配置:
root@1ea3c524972c:/data# cp redis.conf /usr/local/bin
root@1ea3c524972c:/data# cd /usr/local/bin
root@1ea3c524972c:/usr/local/bin# redis-server redis.conf 


Slave2的配置过程:
root@ubuntu:/var/lib/docker/volumes/965a49088302ed9d16ee8ac148bac420fbeb48206c076346d850147aae9e9ed1/_data# docker inspect 8e9516b3495f | grep Source                "Source": "/var/lib/docker/volumes/a231453923c0f6cb680ff598a219fb59336b837ae5aeb9ce680e7e96e616a5f2/_data",
root@ubuntu:/var/lib/docker/volumes/965a49088302ed9d16ee8ac148bac420fbeb48206c076346d850147aae9e9ed1/_data# cd /var/lib/docker/volumes/a231453923c0f6cb680ff598a219fb59336b837ae5aeb9ce680e7e96e616a5f2/_data
root@ubuntu:/var/lib/docker/volumes/a231453923c0f6cb680ff598a219fb59336b837ae5aeb9ce680e7e96e616a5f2/_data# cp /etc/redis/redis.conf redis.conf
root@ubuntu:/var/lib/docker/volumes/a231453923c0f6cb680ff598a219fb59336b837ae5aeb9ce680e7e96e616a5f2/_data# vim redis.conf 
daemonize yes
pidfile /var/run/redis.pid
slaveof master 6379
bind 172.17.0.4

进入slave2 redis容器进行配置:
root@ubuntu:/# docker attach 8e9516b3495f
root@8e9516b3495f:/data# cp redis.conf /usr/local/bin/
root@8e9516b3495f:/data# cd /usr/local/bin/
root@8e9516b3495f:/usr/local/bin# redis-server redis.conf3)Redis数据库容器节点的测试
在redis-master容器内,启动redis客户端,存储一个数据:
root@0feab391c2f8:/usr/local/bin# redis-cli 
127.0.0.1:6379> set master 0feab391c2f8
OK
127.0.0.1:6379> get master
"0feab391c2f8"2个Redis slave容器内,查询在Master数据库中存储的数据:
root@ff8329b53fac:/usr/local/bin# redis-cli 
127.0.0.1:6379> get master
"c3c46778a8ac"

root@f9c829a376f5:/usr/local/bin# redis-cli 
127.0.0.1:6379> get master
"c3c46778a8ac"
  • APP容器节点Django的配置:即开发简单的web程序
1)在容器中,安装python语言的Redis支持包
参考:https://www.cnblogs.com/cymwill/p/10293205.html
root@d5ff3ca4e01f:~/.pip# mkdir ~/.pip
root@d5ff3ca4e01f:~/.pip# cd ~/.pip
root@d5ff3ca4e01f:~/.pip# touch pip.conf
root@d5ff3ca4e01f:~/.pip# echo "[global]">>pip.conf 
root@d5ff3ca4e01f:~/.pip# echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple">>pip.conf 
root@d5ff3ca4e01f:~/.pip# echo "trusted-host = pypi.tuna.tsinghua.edu.cn">>pip.conf

root@d5ff3ca4e01f:~/.pip# pip install --upgrade pip
root@d5ff3ca4e01f:/# pip install redis

root@d5ff3ca4e01f:~/.pip# 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





参考:<Docker+容器与容器云>

发布了556 篇原创文章 · 获赞 140 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/104158787