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服务器。
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实现。
文章图片
三大特点
- 反向代理
- 负载均衡
- 静态资源服务器
- 源码安装
- 在线安装
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路径。
文章图片
文章图片
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大类:
- 负载均衡集群
负载均衡集群一般用于相应网络请求的网页服务器,数据库服务器。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器上。从检查其他服务器状态这一点上看,负载均衡和容错集群很接近,不同之处是数量上更多。
- 高可用集群
“双机互备”, “双机”。
高可用集群解决的是保障用户的应用程序持续对外提供服务的能力。
(请注意高可用集群既不是用来保护业务数据的,保护的是用户的业务程序对外不间断提供服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度)。
- 科学计算集群
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)
Instruction/Multiple Data)的范畴。
分布式与集群是什么 ? 区别是什么?
小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。
后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,两个厨师的关系是集群。
为了让厨师专心炒菜,把菜做到极致,再请了个配菜师负责切菜,备菜,备料 …
厨师和配菜师的关系是分布式。
一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群。
一个配菜师因故请假了,但是其余的配菜师还是该啥就干啥,只是没请假的配菜师任务均匀的加量了,但他们的任务和职责是不变的,这是集群。
集群:多个人在一起作同样的事。
分布式 :多个人在一起作不同的事。
负载均衡集群(LB)
在企业网站架构中,提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体能力。
例如“DNS轮询”“应用层交换”“反向代理”等都可做负载均衡群集。
LB负载分配依赖于主节点的算法,将来自客户机的访问请求分担给多个多个服务器节点,从而缓解整个系统的负载压力。
负载均衡集群实现方式
- 硬件方式:F5 A10 Citrix NetScaler array 梭子鱼 绿盟 …
- 软件方式:LVS haproxy nginx ats …
提高应用系统的可靠性,尽可能减少终端时间为目标,确保服务的连续的性,达到高可用(HA)的容错效果,例如“故障切换”“双机热备”“多机热备”等都属于高可用群集技术
HA工作方式包括双工和主从两种模式。双工即所有节点同时在线;主从则只有主节点在线,但当出现故障时从才切换为主节点。
HA软件实现方式:keepalived heartbeat corosync cman
负载均衡集群 目前Nginx服务器的upstream模块支持6种方式的分配:
轮询 | 默认方式 |
---|---|
weight | 权重方式 |
ip_hash | 依据ip分配方式 |
least_conn | 最少连接方式 |
fair(第三方) | 响应时间方式 |
url_hash(第三方) | 依据URL分配方式 |
- 轮询
有如下参数:
fail_timeout | 与max_fails结合使用。 |
---|---|
max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了, |
fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。 |
down | 标记服务器永久停机了。 |
【linux服务器】在轮询中,如果服务器down掉了,会自动剔除该服务器。
缺省配置就是轮询策略。
此策略适合服务器配置相当,无状态且短平快的服务使用。
- 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结合使用。
此策略比较适合服务器的硬件配置差别比较大的情况。
- ip_hash
#动态服务器组
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掉。
- 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;
}
注意:
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况
- 第三方策略
- fair
#动态服务器组
upstream dynamic_zuoyu {
server localhost:8080;
server localhost:8081;
server localhost:8082;
server localhost:8083;
fair;
#实现响应时间短的优先分配
}
- url_hash
#动态服务器组
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{
#单个服务地址及其权重,这个权重是默认负载均衡算法的值,越大越容易被访问
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解决方案,需要经常辅助脚本进行运行工作。
高可用思路:
- 为了实现高可用,需要配置VIP,提供同一个访问接口地址。
- 主节点出现故障,备节点必须第一时间将VIP抢占过来,备节点必须时刻监控主节点的健康状态。
- 若不是负载均衡调度器,还需考虑共享资源的安全转移,而不仅仅是VIP。
- 若主节点健康并恢复服务,备节点需要将VIP还给主节点。
- 主节点需要定时向备节点通知自己的健康状态,让备节点实时了解主节点健康状态。
- 主节点、备节点包括整个网络架构时间必须是精确同步,需要基于ntp服务进行同步时间。
是针对路由器冗余的一种解决方案,目的是为了解决局域网中配置默认网关的单点失效问题,
由于网关IP地址为唯一,将多个路由抽象为一个虚拟路由,使用一个IP地址。
此IP地址不是物理IP地址,而是虚拟的IP地址,即VIP。在某个路由器出现故障情况下,不影响正常的路由工作。
VRRP说白了就是实现IP地址漂移的,是一种容错协议
基于VRRP协议实现多路由同时工作可以实现多路(负载均衡)工作效果。
文章图片
keepalived安装和使用 Keepalived程序由C语言开发,轻量、性能强大。
可以使用apt-get方式进行安装,也可以使用编译安装,区别不大,建议使用apt-get安装:
sudo apt-get -y install keepalived
配置文件:
- /etc/keepalived/keepalived.conf keepalived主配置文件,默认没有创建
- /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)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
目标
- 了解什么是Docker
- 能够安装和使用Docker
- 学习Docker的三大组件:仓库、镜像、容器
- 学习Docker的数据管理
- 学习创建Docker镜像
PHP名词(语言),通过该技术可以快速开发网站
多学一招:Docker基于 Go 语言开发
Docker使用流程
文章图片
安装 安装
sudo apt-get install -y docker.io
修改权限,执行完毕重启后生效
sudo usermod -aG docker 当前用户名
测试,查看版本
docker -v
初体验 通过Docker搭建开发环境流程
- 原搭建Python环境:安装VM软件 -> 获取镜像 -> 装系统 ->
apt安装/源代码安装/一键安装包
- Docker搭建环境:安装Docker -> 获取镜像 -> 生成容器/带有环境的系统
- 获取nginx镜像
docker pull nginx
- 根据获取的nginx镜像,创建nginx-1容器(带有环境的系统)
docker run --name mynginx -p 80:80 -d nginx
通过127.0.0.1访问测试
- 进入容器(进入带有环境的系统)
dockerexec-i -t通过docker ps查看的name名/bin/bash
切换阿里云镜像加速
发现:之前下载镜像慢
解决:使用阿里云镜像加速下载
- 配置下载使用阿里云镜像,执行下述命令
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
- 删除已下载的镜像,并重新下载测试(先删除容器,再删除镜像)
docker ps
docker rm -f xx
docker images
docker rmi yy
docker pull nginx
镜像管理 镜像简介
什么是镜像?
它是一个只读的文件,就类似于安装操作系统时所需的iso文件
语法
- 【增-自己创建】通过Dockerfile或commit(注:后面细说)
- 【增-直接下载】docker pull 镜像名
- 【删】docker rmi 镜像ID
- 【改】docker tag 旧名:旧版本 新名:新版本
- 【查】docker images(注:查看已下载的镜像)
- 导入镜像:docker save -o 导出镜像名 本地镜像名
(注:导出镜像名推荐加后缀.tar)
- 导出镜像:docker load < 导出镜像名
容器可以简单理解为通过镜像创建的带有环境的系统
语法
- 启动容器:docker start 系统ID
- 停止容器:docker stop 系统ID
- 【增】docker create 镜像名
- 【删】docker rm 容器ID(注:remove缩写)
- 【改】常用于将更新后的容器保存为新的镜像时使用 (注:后面细说)
- 【查】docker ps(注:默认查看正在运行的容器,参数-a则显示全部)
- 创建并运行容器:docker run 参数
-d 容器后台运行
-p 当前系统端口:容器端口 端口映射(容器内部端口映射外部)
-v 当前系统目录:容器目录 目录映射
- 进入容器
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
仓库管理 仓库简介
- 仓库:指集中存放镜像的地方
- 学习知识点
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
镜像加速(阿里云实践)
- 登录阿里云
- 访问https://cr.console.aliyun.com/cn-hangzhou/mirrors
创建镜像的两种方法
- 方法1:创建Dockerfile文件,自己构建镜像(注:后面细说)
- 方法2:通过docker commit命令将指定容器(带环境的系统)构建成一个新的镜像
- 方法2语法
参数: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 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环境
- 准备目录
mkdir test
- 在目录中创建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前台运行
第八行:端口
- 准备index.htm
echo 123>index.html
- 构建镜像
docker build -t ymm/hello-nginx .
- 运行构建好的镜像
docker run -d -p 80:80 ymm/hello-nginx
- 测试
或
curl http://localhost
案例3-使用Docker部署MySQL(数据持久化)
- 安装
docker search mysql
- 这里我选择使用官方标签为5.7的镜像
docker pull mysql:5.7
- 查看本地镜像列表,是否下载成功
docker images |grep mysql
- 使用mysql镜像
docker run -d -p 3308:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
- 测试
mysql -uroot -p123456 -P3308 -h172.16.239.7
推荐阅读
- Linux下面如何查看tomcat已经使用多少线程
- Beego打包部署到Linux
- 探索免费开源服务器tomcat的魅力
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- 虚拟DOM-Diff算法详解
- Linux|109 个实用 shell 脚本
- linux定时任务contab
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- day16-Linux|day16-Linux 软件管理
- 如何在阿里云linux上部署java项目