linux服务器

虚拟环境

安装虚拟环境

使用Python进行项目开发时,由于不同的项目需要,可能会配置多个开发环境,不同开发环境之间的项目依赖包如果混合在一起,可能会引起意想不到的错误。

通过虚拟环境隔离不同开发环境,方便不同开发环境的共存。

#安装python虚拟环境 
sudo apt install -y virtualenv
 #vrtaulenvwrapper是virtualenv的扩展包,用于更方便管理虚拟环境 sudo apt install -y virtualenvwrapper 

配置虚拟环境

此时还不能使用virtualenvwrapper,实际上你需要运行virtualenvwrapper.sh文件才行。

配置步骤如下:

1、查看virtualenvwrapper的安装路径 sudo find / -name virtualenvwrapper.sh
2、创建目录用来存放虚拟环境 mkdir ~/.myvirtualenvs
3、在~/.bashrc中添加行 export WORKON_HOME=/home/yong/.myvirtualenvs source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
4、运行: source ~/.bashrc |

此时virtualenvwrapper就可以使用了。

virtualenvwrapper的功能

配置好virtualenvwrapper,就可以使用它的功能,方便管理虚拟环境

代码意义
workon列出虚拟环境列表
lsvirtualenv列出虚拟环境列表
mkvirtualenv新建虚拟环境
workon [虚拟环境名称]切换/进入虚拟环境
rmvirtualenv删除虚拟环境
deactivate离开虚拟环境

创建虚拟环境

进入本地虚拟环境的目录文件夹
	cd ~/.myvirtualenvs/
创建虚拟环境 根据需要选择3和2
	mkvirtualenv -p /usr/bin/python3  py3
mkvirtualenv -p /usr/bin/python  py2
进入虚拟环境
	workon virtualenv-django
查看虚拟环境中已经安装的包
	pip list
	pip freeze

uwsgi

UWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  • WSGI是一种通信协议。

  • uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。

  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of
information),每一个uwsgi
packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

安装

  • 安装依赖
sudo apt-get -y install build-essential python3-dev python-pip curl
  • pip命令安装,这里应该在python3的虚拟环境里安装
pip install uwsgi
  • 下载安装脚本,将uwsgi二进制安装到家目录下,你可以修改它。
sudo curl http://uwsgi.it/install | bash -s default /home/yong/uwsgi
sudo mv /home/yong/uwsgi /usr/local/sbin/

使用

def application(environ, start_response):
    body = '<h1>Hello,World!</h1>'
    start_response('200 OK', [('Content-Type', 'text/html')])
return body.encode('utf-8')

environ:请求信息组成的字典
start_response:处理响应

服务器会调用application函数,将参数赋值。

  • 运行
uwsgi --http :9090 --wsgi-file server.py

然后打开浏览器,访问”http://localhost:9090″,你就可以看到”Hello World!”字样了。

上面的命令中”- -http”参数指定了HTTP监听地址和端口,”-
-wsgi-file”参数指定了WSGI应用程序入口,uWSGI会自动搜寻名为”application”的应用对象并调用它。

更进一步,uWSGI可以支持多进程和多线程的方式启动应用,也可以监控应用的运行状态。我们将启动的命令改为:

uwsgi --http :9090 --wsgi-file server.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

执行它后,uWSGI将启动4个应用进程,每个进程有2个线程,和一个master主进程(监控其他进程状态,如果有进程死了,则重启)。同时,你可以访问”127.0.0.1:9191″来获取JSON格式的应用运行信息,uWSGI还提供了工具命令”uwsgitop”来像top一样监控应用运行状态,你可以用pip来安装它。

上面的命令参数太多了,我们可以将参数写在配置文件里,启动uWSGI时指定配置文件即可。配置文件可以是键值对的格式,也可以是XML,YAML格式,这里我们使用键值对的格式。让我们创建一个配置文件”myapp.ini”

[uwsgi]
http=:9090
wsgi-file=server.py
master=true
processes=4
threads=2
stats=127.0.0.1:9191

然后就可以将启动命令简化为:

uwsgi myapp.ini

使用uwsgi的时候需要进入python3的虚拟环境,默认是调用python2。

案例

完成电商里的商品管理模块。

http://ip:port/show 查询所有

http://ip:port/show/1 查询id=1

nginx

Nginx (engine x)
是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx
1.0.4发布。

Nginx是一款轻量级的Web
服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like
协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等,服务以epoll实现。

在这里插入图片描述

三大特点

  1. 反向代理

  2. 负载均衡

  3. 静态资源服务器

安装

安装方式有两种:

  1. 源码安装

下载源码,编译,安装,过程比较复杂。容易出错比如缺少依赖,编译报错等等。

  1. 在线安装
sudo apt install nginx

推荐使用。

启动和停止

可以使用如下命令启动/停止/重启nginx服务

sudo service nginx start
sudo service nginx stop
sudo service nginx restart

打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx
已经安装并运行成功。

一列命令如下所示。

#检查配置文件是否正确
sudo nginx -t 
#可以看到版本
sudo nginx -V
#重启Nginx
sudo nginx -s reload
#关闭Nginx
sudo nginx -s stop

配置访问静态资源

server {
	listen       80;
	server_name  localhost;
	location /static/images/ {
		root   /var/www/;
	}
}

192.168.0.228/static/images/1.jpg
/static/images/1.jpg
/var/www/static/images/1.jpg

映射到服务器文件
root的处理结果是:root路径+location路径。

在这里插入图片描述

在这里插入图片描述

nginx+uwsgi

静态请求nginx直接处理返回给用户,动态请求由nginx转给uwsig处理,处理后返回给nginx,返会给用户

首先,我们将uWSGI的HTTP端口监听改为socket端口监听,即将配置文件中的”http”项去掉,改为”socket”项:

[uwsgi]
socket=:9090
wsgi-file=server.py
master=true
processes=4
threads=2

然后,改写Nginx的配置文件,

location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:9090;
}

这段配置表明Nginx会将收到的所有请求都转发到”127.0.0.1:9090″端口上,即uWSGI服务器上。重启Nginx,并启动uWSGI服务器。

集群

什么是集群

集群(cluster),也称为群集,表示一群的意思,在服务器领域表示大量的服务器的集合体。

计算机性能扩展方案

你有一台API服务器,每天几百万次请求,吃不消了。现在要提升性能:

  • 横向扩展:多增加几台API服务器,一起服务。

  • 纵向扩展:把API服务器换成性能更好的机器。

横向扩展也叫水平扩展,用更多的节点支撑更大量的请求。如成千上万的蚂蚁完成一项搬运工作集群。

纵向扩展又叫垂直扩展,扩展一个点的能力支撑更大的请求。如利用1个人的能力,如蜘蛛侠逼停火车。纵向扩展相对成本大。

Linux集群主要分成3大类:

  1. 负载均衡集群

负载均衡系统:集群中所有的节点都处于活动状态,它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。

负载均衡集群一般用于相应网络请求的网页服务器,数据库服务器。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器上。从检查其他服务器状态这一点上看,负载均衡和容错集群很接近,不同之处是数量上更多。

  1. 高可用集群

常见的就是2个节点做成的HA集群,有很多通俗的不科学的名称,比如"双机热备",
“双机互备”, “双机”。

高可用集群解决的是保障用户的应用程序持续对外提供服务的能力。
(请注意高可用集群既不是用来保护业务数据的,保护的是用户的业务程序对外不间断提供服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度)。

  1. 科学计算集群

高性能计算(High Perfermance
Computing)集群,简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力。

高性能计算分类

  • 高吞吐计算(High-throughput Computing)

有一类高性能计算,可以把它分成若干可以并行的子任务,而且各个子任务彼此间没有什么关联。象在家搜寻外星人(
SETI@HOME – Search for Extraterrestrial Intelligence at Home
)就是这一类型应用。这一项目是利用Internet上的闲置的计算资源来搜寻外星人。SETI项目的服务器将一组数据和数据模式发给Internet上
参加SETI的计算节点,计算节点在给定的数据上用给定的模式进行搜索,然后将搜索的结果发给服务器。服务器负责将从各个计算节点返回的数据汇集成完整的
数据。因为这种类型应用的一个共同特征是在海量数据上搜索某些模式,所以把这类计算称为高吞吐计算。所谓的Internet计算都属于这一类。按照
Flynn的分类,高吞吐计算属于SIMD(Single Instruction/Multiple Data)的范畴。

  • 分布计算(Distributed Computing)

另一类计算刚好和高吞吐计算相反,它们虽然可以给分成若干并行的子任务,但是子任务间联系很紧密,需要大量的数据交换。按照Flynn的分类,分布式的高性能计算属于MIMD(Multiple
Instruction/Multiple Data)的范畴。

分布式与集群是什么 ? 区别是什么?

小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。

后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,两个厨师的关系是集群。

为了让厨师专心炒菜,把菜做到极致,再请了个配菜师负责切菜,备菜,备料 …
厨师和配菜师的关系是分布式。

一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群。

一个配菜师因故请假了,但是其余的配菜师还是该啥就干啥,只是没请假的配菜师任务均匀的加量了,但他们的任务和职责是不变的,这是集群。

集群:多个人在一起作同样的事。

分布式 :多个人在一起作不同的事。

负载均衡集群(LB)

在企业网站架构中,提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体能力。

例如“DNS轮询”“应用层交换”“反向代理”等都可做负载均衡群集。

LB负载分配依赖于主节点的算法,将来自客户机的访问请求分担给多个多个服务器节点,从而缓解整个系统的负载压力。

负载均衡集群实现方式

  1. 硬件方式:F5 A10 Citrix NetScaler array 梭子鱼 绿盟 …

  2. 软件方式:LVS haproxy nginx ats …

高可用集群(HA)

提高应用系统的可靠性,尽可能减少终端时间为目标,确保服务的连续的性,达到高可用(HA)的容错效果,例如“故障切换”“双机热备”“多机热备”等都属于高可用群集技术

HA工作方式包括双工和主从两种模式。双工即所有节点同时在线;主从则只有主节点在线,但当出现故障时从才切换为主节点。

HA软件实现方式:keepalived heartbeat corosync cman

负载均衡集群

目前Nginx服务器的upstream模块支持6种方式的分配:

轮询默认方式
weight权重方式
ip_hash依据ip分配方式
least_conn最少连接方式
fair(第三方)响应时间方式
url_hash(第三方)依据URL分配方式
  1. 轮询

最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

有如下参数:

fail_timeout与max_fails结合使用。
max_fails设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,
fail_time服务器会被认为停机的时间长度,默认为10s。
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down标记服务器永久停机了。

注意:

在轮询中,如果服务器down掉了,会自动剔除该服务器。

缺省配置就是轮询策略。

此策略适合服务器配置相当,无状态且短平快的服务使用。

  1. weight

权重方式,在轮询策略的基础上指定轮询的几率。例子如下:

#动态服务器组
upstream dynamic_zuoyu {
       server localhost:8080   weight=2; 
       server localhost:8081;  
       server localhost:8082   backup;
       server localhost:8083   max_fails=3 fail_timeout=20s; 
}

在该例子中,weight参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比,比如Tomcat
7.0被访问的几率为其他服务器的两倍。

注意:

权重越高分配到需要处理的请求越多。

此策略可以与least_conn和ip_hash结合使用。

此策略比较适合服务器的硬件配置差别比较大的情况。

  1. ip_hash

指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

#动态服务器组
upstream dynamic_zuoyu {
       ip_hash;    #保证每个访客固定访问一个后端服务器
       server localhost:8080   weight=2;
       server localhost:8081;  #tomcat 8.0
       server localhost:8082;  #tomcat 8.5
       server localhost:8083   max_fails=3 fail_timeout=20s;
}


注意:

在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。

ip_hash不能与backup同时使用。

此策略适合有状态服务,比如session。

当有服务器需要剔除,必须手动down掉。

  1. least_conn

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

#动态服务器组
upstream dynamic_zuoyu {
        least_conn;    #把请求转发给连接数较少的后端服务器
        server localhost:8080   weight=2;
        server localhost:8081;
        server localhost:8082 backup;
        server localhost:8083   max_fails=3 fail_timeout=20s;
}


注意:

此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况

  1. 第三方策略

第三方的负载均衡策略的实现需要安装第三方插件。

  1. fair

按照服务器端的响应时间来分配请求,响应时间短的优先分配。

#动态服务器组
upstream dynamic_zuoyu {
        server localhost:8080;
        server localhost:8081;
        server localhost:8082;
        server localhost:8083;
        fair;    #实现响应时间短的优先分配
}


  1. url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。

#动态服务器组
upstream dynamic_zuoyu {
        hash $request_uri;    #实现每个url定向到同一个后端服务器
        server localhost:8080;
        server localhost:8081;
        server localhost:8082;
        server localhost:8083;
}

总结

以上便是6种负载均衡策略的实现方式,其中除了轮询和轮询权重外,都是Nginx根据不同的算法实现的。在实际运用中,需要根据不同的场景选择性运用,大都是多种策略结合使用以达到实际需求。

下面使用weight权重方式完成负载均衡

在这里插入图片描述

配置如下:

#集群地址
upstream example.com{
    #单个服务地址及其权重,这个权重是默认负载均衡算法的值,越大越容易被访问
    server  ip:port  weight=1;
server  ip:port  weight=2;
server  ip:port  weight=10;
}

server {
        listen       80;
        server_name  localhost;
        location /static/ {
                root   /var/www/;
        }
        location / {
                proxy_pass http://example.com;
        }
}

keepalived

高可用集群

高可用:master/backup主节点和备节点,在主节点出现故障,能自动切换到备节点。

在高可用集群解决方案中,keepalived属于最为流行,轻量化的HA解决方案,需要经常辅助脚本进行运行工作。

高可用思路:

  1. 为了实现高可用,需要配置VIP,提供同一个访问接口地址。

  2. 主节点出现故障,备节点必须第一时间将VIP抢占过来,备节点必须时刻监控主节点的健康状态。

  3. 若不是负载均衡调度器,还需考虑共享资源的安全转移,而不仅仅是VIP。

  4. 若主节点健康并恢复服务,备节点需要将VIP还给主节点。

  5. 主节点需要定时向备节点通知自己的健康状态,让备节点实时了解主节点健康状态。

  6. 主节点、备节点包括整个网络架构时间必须是精确同步,需要基于ntp服务进行同步时间。

VRRP虚拟路由冗余协议

VRRP虚拟路由冗余协议。

是针对路由器冗余的一种解决方案,目的是为了解决局域网中配置默认网关的单点失效问题,

由于网关IP地址为唯一,将多个路由抽象为一个虚拟路由,使用一个IP地址。

此IP地址不是物理IP地址,而是虚拟的IP地址,即VIP。在某个路由器出现故障情况下,不影响正常的路由工作。

VRRP说白了就是实现IP地址漂移的,是一种容错协议

基于VRRP协议实现多路由同时工作可以实现多路(负载均衡)工作效果。

在这里插入图片描述

keepalived安装和使用

Keepalived程序由C语言开发,轻量、性能强大。

可以使用apt-get方式进行安装,也可以使用编译安装,区别不大,建议使用apt-get安装:

sudo apt-get -y install keepalived

配置文件:

  1. /etc/keepalived/keepalived.conf keepalived主配置文件,默认没有创建

  2. /etc/init.d/keepalived 服务启停脚本文件

新建配置文件:

sudo vim /etc/keepalived/keepalived.conf

master节点配置文件内容:

global_defs {
}
vrrp_instance VI_1 {
    state MASTER   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 51   #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 100   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    #指定虚拟IP, 两个节点设置必须一样
        192.168.33.60/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
}

backup节点配置文件内容:

global_defs {
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.33.60/24
    }
}

但这里有个小问题,如果本机或是网关偶尔出现一次故障,那么我们不能认为是服务故障。更好的做法是如果连续N次检测本机服务不正常或连接N次无法ping通网关,才认为是故障产生,才需要进行故障转移。另一方面,如果脚本检测到故障产生,并停止掉了keepalived服务,那么当故障恢复后,keepalived是无法自动恢复的。我觉得利用独立的脚本以秒级的间隔检查自身服务及网关连接性,再根据故障情况控制keepalived的运行或是停止。

这里提供一个思路,具体检测脚本内容请大家根据自己的需要编写即可:

#!/bin/bash      
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]  
then  
    sudo /usr/sbin/nginx
    sleep 5  
    if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]  
    then  
	sudo killall keepalived
    fi    
fi

修改master配置文件:

global_defs {
}
vrrp_script chk_nginx {
    script "/etc/keepalived/check.sh" #检测脚本
    interval 2 #每隔2秒
}
vrrp_instance VI_1 {
    state MASTER   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface ens33    #绑定虚拟IP的网络接口
    virtual_router_id 51   #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 100   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    #指定虚拟IP, 两个节点设置必须一样
        172.20.10.88/28    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    track_script {
        chk_nginx #运行检测
    }
}

slave配置文件也需要修改。

运行测试。

docker

docker
容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似
iPhone 的
app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

目标

  1. 了解什么是Docker

  2. 能够安装和使用Docker

  3. 学习Docker的三大组件:仓库、镜像、容器

  4. 学习Docker的数据管理

  5. 学习创建Docker镜像

什么是Docker

Docker名词(技术),通过该技术可以快速搭建环境(可以理解为VM软件)

PHP名词(语言),通过该技术可以快速开发网站

多学一招:Docker基于 Go 语言开发

Docker使用流程

在这里插入图片描述

安装

安装

sudo apt-get install -y docker.io

修改权限,执行完毕重启后生效

sudo usermod -aG docker 当前用户名

测试,查看版本

docker -v

初体验

通过Docker搭建开发环境流程

  1. 原搭建Python环境:安装VM软件 -> 获取镜像 -> 装系统 ->
    apt安装/源代码安装/一键安装包

  2. Docker搭建环境:安装Docker -> 获取镜像 -> 生成容器/带有环境的系统

通过Docker搭建nginx环境

  1. 获取nginx镜像
docker pull nginx
  1. 根据获取的nginx镜像,创建nginx-1容器(带有环境的系统)
docker run --name mynginx -p 80:80 -d nginx

通过127.0.0.1访问测试

  1. 进入容器(进入带有环境的系统)
docker  exec  -i -t  通过docker ps查看的name名  /bin/bash

切换阿里云镜像加速

发现:之前下载镜像慢

解决:使用阿里云镜像加速下载

  1. 配置下载使用阿里云镜像,执行下述命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lphmohiy.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

  1. 删除已下载的镜像,并重新下载测试(先删除容器,再删除镜像)
docker ps
docker rm -f xx
docker images
docker rmi yy
docker pull nginx

镜像管理

镜像简介

什么是镜像?

它是一个只读的文件,就类似于安装操作系统时所需的iso文件

语法

  1. 【增-自己创建】通过Dockerfile或commit(注:后面细说)

  2. 【增-直接下载】docker pull 镜像名

  3. 【删】docker rmi 镜像ID

  4. 【改】docker tag 旧名:旧版本 新名:新版本

  5. 【查】docker images(注:查看已下载的镜像)

  6. 导入镜像:docker save -o 导出镜像名 本地镜像名
    (注:导出镜像名推荐加后缀.tar)

  7. 导出镜像:docker load < 导出镜像名

容器管理

容器简介

容器可以简单理解为通过镜像创建的带有环境的系统

语法

  1. 启动容器:docker start 系统ID

  2. 停止容器:docker stop 系统ID

  3. 【增】docker create 镜像名

  4. 【删】docker rm 容器ID(注:remove缩写)

  5. 【改】常用于将更新后的容器保存为新的镜像时使用 (注:后面细说)

  6. 【查】docker ps(注:默认查看正在运行的容器,参数-a则显示全部)

  7. 创建并运行容器:docker run 参数

–name 自定义容器名称

-d 容器后台运行

-p 当前系统端口:容器端口 端口映射(容器内部端口映射外部)

-v 当前系统目录:容器目录 目录映射

  1. 进入容器

docker exec -i -t 通过dockerps查看的name名 /bin/bash

docker批量删除容器、镜像

删除所有容器

docker rm `docker ps -a -q

删除所有镜像

docker rmi `docker images -q

按条件删除镜像

没有打标签

docker rmi `docker images -q | awk '/^<none>/ { print $3 }'`

镜像名包含关键字,其中doss-api为关键字

docker rmi --force `docker images | grep doss-api | awk '{print $3}'`

数据管理

相关概念

数据卷:指将本机目录映射到容器(带有环境的系统)中作为存放数据的目录

目 的:实现数据共享&数据持久化(不用担心容器意外删除导致数据丢失)

数据卷实践

说明:在容器中创建文件后,当该容器意外删除后则意味着数据丢失

解决:数据卷

实现:本机目录映射到容器中作为存放数据的目录

实现

docker run -d -v /home/demo:/demo nginx

网络管理

概念

说明:默认本机和**容器(带有环境的“系统”)**和之间的网络是隔离的

思考:如何实现访问本机网络自动交个**容器(带有环境的“系统”)**处理

方案:端口映射

端口映射实战

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

仓库管理

仓库简介

  • 仓库:指集中存放镜像的地方

  • 学习知识点

1-加速镜像文件下载

2-自定义镜像并提交到仓库中让别人下载

镜像加速(简介)

说明:默认通过docker pull到官方仓库获取镜像,但国外服务器下载慢

解决:使用国内服务器供应商提供的仓库,如阿里云、网易、DaoCloud等

语法:Ubuntu系统

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  #Docker中国官方镜像加速
  "registry-mirrors": ["https://registry.docker-cn.com"]
  #阿里云
  "registry-mirrors": ["https://{your_id}.mirror.aliyuncs.com"]
  #网易
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
  #中国科技大
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
  #DaoCloud容器云平台
  "registry-mirrors": ["http://{your_id}.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

镜像加速(阿里云实践)

  1. 登录阿里云

  2. 访问https://cr.console.aliyun.com/cn-hangzhou/mirrors

自定义镜像

创建镜像的两种方法

  1. 方法1:创建Dockerfile文件,自己构建镜像(注:后面细说)

  2. 方法2:通过docker commit命令将指定容器(带环境的系统)构建成一个新的镜像

  • 方法2语法

语法:docker commit -m=“提交描述” -a=“作者” 容器ID 新镜像名:[标签]

参数:message(m) author(a)

  • 方法2练习
docker commit -m 'mynigx' -a 'yong' 2013913c8555 yongmengmeng/mynigx

镜像提交仓库(语法)

先登录:docker login(注:回车输入账号密码)

再推送:docker push 镜像名

退 出:docker loginout

镜像提交仓库(实践官方仓库)

步骤1:打开官网注册账号 https://hub.docker.com/

步骤2:提交镜像到官网仓库

sudo docker push yongmengmeng/mynigx

也可以提交到阿里云仓库

Dockerfile

简介

Dockerfile是什么:就是一个文件,用来构建Docker镜像,由固定命令和参数构成。

构建三步骤:编写Dockerfile文件 -> 构建镜像(docker build) -> 创建容器(docker
run)

语法

在这里插入图片描述

步骤

步骤1:创建Dockerfile文件

步骤2:在Dockerfile文件中输入下述指令(注:使用时必须大写)

步骤3:构建镜像

docker build -t 镜像名:[版本号] Dockerfile所在目录

初体验

需求:构建yong/img1镜像,当创建容器时输出“Hello”

步骤1:通过ubuntu系统创建yong/img1镜像

sudo mkdir -p /img/t1
sudo vim /img/t1/Dockerfile
#该镜像基于官方ubuntu系统开发
FROM ubuntu:16.04
#作者
MAINTAINER ymm
#容器启动时执行的命令
CMD echo "hello "

步骤2:构建img

docker build -t yong/img1 /img/t1

步骤3:通过img1镜像,创建容器,并从测试

docker run yong/img1

构建nginx镜像

需求:构建yong/nginx镜像,当 创建容器并访问

步骤1:通过ubuntu系统创建yong/nginx镜像

sudo mkdir -p /img/nginx
sudo vim /img/nginx/Dockerfile

#该镜像基于官方ubuntu系统开发
FROM ubuntu:16.04
#作者
MAINTAINER ymm yongmengmeng@qq.com
#构建镜像时执行下述命令
RUN apt-get update && apt-get install -y nginx
#声明容器暴露的端口,配合-P使用
EXPOSE 80
#前台启动NGINX
CMD nginx -g 'daemon off;'

步骤2:构建nginx

docker build -t yong/nginx /img/nginx

步骤3:通过nginx镜像,创建容器,并从测试

docker run -d -P yong/nginx

案例1-选择Python版本

拉取官方的镜像,标签为3.7

docker pull python:3.7

使用python镜像,运行容器

在~/demo目录下创建一个hello.py 文件,代码如下:

import sys

print('hello,world')
print(sys.version)

运行容器

docker run  -v /home/yong/demo:/demo  -w /demo python:3.7 python hello.py

命令说明:

-v /home/yong/demo:/demo :将主机中目录/home/yong/demo挂载到容器的/demo

-w /demo :指定容器的/demo目录为工作目录

python hello.py :使用容器的python命令来执行工作目录中的hello.py文件

其它环境可以搜索,然后安装使用即可。

https://www.docker.com/

案例2-dockerfile+ubuntu+nginx搭建web环境

  1. 准备目录
mkdir test
  1. 在目录中创建Dockerfile
FROM ubuntu
MAINTAINER ymm
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

解释下各行的意思

第一行:说明依赖ubuntu

第二行:作者

第三行:加速

第四行:更新一下环境

第五行:安装nginx,-y就是表示不要总是询问

第六行:拷贝服务器当前目录里的index.html到nginx里

第七行:让nginx前台运行

第八行:端口

  1. 准备index.htm
echo 123>index.html
  1. 构建镜像
docker build -t ymm/hello-nginx .
  1. 运行构建好的镜像
docker run -d -p 80:80 ymm/hello-nginx
  1. 测试

打开浏览器测试

curl http://localhost

案例3-使用Docker部署MySQL(数据持久化)

  1. 安装

查找docker hub 上mysql镜像

docker search mysql
  1. 这里我选择使用官方标签为5.7的镜像
docker pull mysql:5.7
  1. 查看本地镜像列表,是否下载成功
docker images |grep mysql
  1. 使用mysql镜像
docker run -d -p 3308:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  1. 测试
mysql -uroot -p123456 -P3308 -h172.16.239.7
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值