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/python3py3 mkvirtualenv -p /usr/bin/pythonpy2 进入虚拟环境 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/

使用
  • 新建服务wsgi协议的逻辑代码server.py
def application(environ, start_response): body = 'Hello,World!' 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实现。
linux服务器
文章图片

三大特点
  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 { listen80; server_namelocalhost; 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路径。

linux服务器
文章图片

linux服务器
文章图片

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 标记服务器永久停机了。
注意:
【linux服务器】在轮询中,如果服务器down掉了,会自动剔除该服务器。
缺省配置就是轮询策略。
此策略适合服务器配置相当,无状态且短平快的服务使用。
  1. weight
权重方式,在轮询策略的基础上指定轮询的几率。例子如下:
#动态服务器组 upstream dynamic_zuoyu { server localhost:8080weight=2; server localhost:8081; server localhost:8082backup; server localhost:8083max_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:8080weight=2; server localhost:8081; #tomcat 8.0 server localhost:8082; #tomcat 8.5 server localhost:8083max_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:8080weight=2; server localhost:8081; server localhost:8082 backup; server localhost:8083max_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权重方式完成负载均衡
linux服务器
文章图片

配置如下:
#集群地址 upstream example.com{ #单个服务地址及其权重,这个权重是默认负载均衡算法的值,越大越容易被访问 serverip:portweight=1; serverip:portweight=2; serverip:portweight=10; }server { listen80; server_namelocalhost; 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协议实现多路由同时工作可以实现多路(负载均衡)工作效果。
linux服务器
文章图片

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使用流程 linux服务器
文章图片

安装 安装
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. 进入容器(进入带有环境的系统)
dockerexec-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 '/^/ { 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)
语法
linux服务器
文章图片

步骤
步骤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 sysprint('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

    推荐阅读