Docker service 批量部署Ubuntu基础镜像

在之前的实验中发现,直接从官方的Docker镜像仓库拉取的Ubuntu等基础镜像直接用于Docker service会导致部署的容器在运行中报错并反复重启,为了解决这一问题,我们可以通过撰写Dockerfile自行定制镜像,同时,为了解决Dockerfile的CMD在启动时只能运行一个服务的问题,我通过supervisor管理Dockerfile多任务的启动,从而实现在启动容器的时候同时启动apache2与openssh-server,以下是该Dockerfile内容:

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server wget supervisor
RUN mkdir /var/run/sshd
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN echo 'root:Password' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed '[email protected]\s*required\s*[email protected] optional [email protected]' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
RUN apt install -y apache2 net-tools vim nano
RUN rm -f /var/www/html/index.html

EXPOSE 22
EXPOSE 80/tcp
EXPOSE 80/udp
CMD ["/usr/bin/supervisord"]

接下来我们还要在文件夹中加入supervisord.conf配置文件:

[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D

[program:apache2]
command=/bin/bash -c "/etc/init.d/apache2 start"

由此,我们便可制作一个可在docker service使用,同时还可以启动多个服务的镜像

PS.目前还只试做过基于Ubuntu的,基于CentOS的在后期会进行尝试。

在使用Aliyun ECS中,关于pip的一些问题

Aliyun会对于你的ECS中的pip仓库进行手动配置,使其使用Aliyun官方的pip仓库,而其仓库并比不上官方的仓库的更新速度(在写下这篇记录时,pip已更新到18.0而阿里云官方的仍保持在8.0),这会导致相当多基于python的需要pip安装的软件在安装时出现报错,解决办法为删除 ~/.pip/pip.conf,令其使用官方仓库。

在迁移时发现的letsencrypt的认证问题

在通常情况下本站使用letsencrypt的自动部署脚本进行认证,但是在此次迁移中发现letsencrypt的认证出现了问题。
具体表现为在certbot对本站进行认证时,http://www.corpama.com/.well-known/achmeacme-challenge/**************************, 对该网址的认证出现404报错,无法访问该网址,最后可发现问题出在/etc/apache2/sites-availble/000-default.conf的配置上,该项虚拟主机的名称中,我将*替换为www.corpama.com, 结果出现了404报错,将其保持默认不变,便没再出现报错。这是一个典型的错误的配置办法,正确的配置办法为设置SeverName项。

pyhton之面向对象(class)

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

Python 区分面向对象和面向类

对象:根据模板创建的实例,通过实例对象可以执行类中的函数

类:就是一个模板,模板里可以包含多个函数,函数里实现一些功能 

#创建类

Class Foo:  #class是关键字(表示要开始创建类了);Foo是新建的类名称
Def bar(self):  #self特殊参数(必填)
pass 
Obj = Foo 

面向对象的三大特性是指:封装、继承和多态。

  • 封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age

obj1 = Foo('chengd', 18) #此处的obj1就是self,“chengd”和“18”就是name和age属性
obj2 = Foo('python', 99) #此处的obj2就是self,“pyhton”和“99”就是name和age属性

调用被封装的内容时,有两种情况:

通过对象直接调用

class Foo:
   def __init__(self, name, age):
     self.name = name
     self.age = age

obj1 = Foo('chengd', 18)
Print (obj1.name)
Print (obj1.age)

通过self间接调用

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
 
  def detail(self):
    print(self.name,self.age)  
obj1 = Foo('chengd', 18)
obj1.detail()  
# Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 chengd ;self.age 是 18
  • 继承

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法

 

class Animal:

     def eat(self):
         print ("%s 吃饭 " %self.name)

 
     def drink(self):
         print ("%s 喝奶 " %self.name)
  

      def shit(self):
          print ("%s 拉 " %self.name)

  
      def pee(self):
          print ("%s 撒" %self.name)

 

class Cat(Animal):

     def __init__(self, name):
         self.name = name


    def cry(self):
         print ('%s喵喵叫'%(self.name))

 
class Dog(Animal):

     

     def __init__(self, name):
          self.name = name       

     def cry(self):
         print ('%s汪汪叫'%(self.name))

文本内容主要转自:https://www.cnblogs.com/chengd/articles/7287528.html