zoukankan      html  css  js  c++  java
  • docker容器技术

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

    docker三大理念

    一,构建

    二,运输

    三,运行

     像java一次构建到处运行

    可以把运行环境和代码整体打包

    docker组成

    安装docker

    yum -y install docker

    启动

    docker是C/S结构 docker进程可以了解为server端执行命令理解为client端,如果把docker进程停了其他client也无法运行(不同于KVM进程宕机了虚拟机还继续运行)

    docker组件

    a,镜像(Image)    类似于虚拟机的镜像,组成不同,作用是一样的

    b,容器(Container)  类似于运行KVM虚拟机,相当于从镜像创建了一个实例,容器间相互是隔离的,不同于虚拟机那样是彻底隔离

    c,仓库(Repository)  类似于yum仓库,github

    PS:容器可以理解为一个简化版的Linux环境

    docker与虚拟机的区别

    虚拟机的应用运行在操作系统上,docker直接运行不需要操作系统

    PS:虚拟机用户资源是完全隔离的

     

    docker可以实现状态的回滚

    docker的作用

      1,简化配置,代码和环境在一块

      2,代码流水线管理

      3,提高开发效率

      4,隔离应用

      5,整合服务器

      6,提高调试能力

      7,多租户环境

      8,快速部署

    启动docker

    systemctl start docker

    (会产生一个docker的网桥)

    docker的网络访问

    与kvm一样是通过桥接的方式访问

    搜索镜像

    docker search centos

    下载镜像

    docker pull centos:7.2.1511

    查看镜像

    docker images

    PS:不是pull下载的使用docker load --input centos.tar导入后再使用docker images查看

    pull下来使用docker save -o centos.tar centos导出镜像

    删除

    docker rmi 镜像id

    运行

    docker run centos:7.2.1511 /bin/echo 'hello world'

    PS:镜像名称centos必须在所有选项后面

      不自定义名称会自动生成一个名称

    查看在运行过的

    docker ps -a

    自己定义一个启动的docker的name

    docker run --name mydocker -t -i centos:7.2.1511 /bin/bash

    PS:-t启动伪终端 -i标准输入

    伪终端可以运行各种命令

    PS:进入了容器但是不是一个虚拟机,其实是一个进程,进程结束了容器就结束了

    停止的容器再启动

    docker start mydocker

    登录这个容器

    docker attach mydocker

    exit退出以后这个容器也关闭了

    删除

    docker rm mydocker

    PS:后面接容器名或者是容器ID

    使用

    nsenter连接

    启动容器先获取Pid

    docker inspect -f "{{ .State.Pid }}" mydocker

    28254

     nsenter -t 28254 -m -u -i -n -p 

     退出以后这个容器不会终止

    写个脚本实现以上功能

    vim docker_in.sh

    #!/bin/bash
    
    #Use nsnter to access docker
    
    docker_in(){
        NAME_ID=$1
        PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
        nsenter -t $PID -m -u -i -n -p
    }
    
    docker_in $1

    sh docker_in.sh mydocker

     不进入容器执行一个命令

    docker exec mydocker whoami

    root

    也能使用exec进入容器

    docker exec -it mydocker /bin/bash

    PS:建议使用nsenter进入容器因为使用exec进入可能会导致一些奇怪的问题

    删除容器

    docker rm mydocker

    如果想删除正在运行的容器

    docker rm -f mydocker

    PS:可以在运行容器的时候加-rm参数 当一个容器运行完会自动删除

     pull一个nginx

    docker pull nginx

    docker run -d nginx

    -d后台运行并且输出id

    怎么访问这个nginx

    查看容器访问日志

    docker logs c4aefb55c183   因为刚刚没有取name 所以这个用的是id

    docker的网络访问

    带端口启动

    docker run -d -P nginx

    把本机10000端口映射到80端口

    访问以下

    curl 127.0.0.1:10000

    使用命令查看访问日志

    docker logs 6c43246b6ce3

    指定端口映射

    docker run -d -p 10.13.85.9:81:80 --name mynginx nginx

    本地ip是10.13.85.9 端口81映射到容器的80端口

    访问

    单独查看端口映射

    docker port mynginx

    也可以一次性启动多个端口

    docker run -d -p 443:443 -p 82:80 --name nginxv2 nginx

    docker数据管理

    启动数据卷

     docker run -d --name nginx-volume-test1 -v /data nginx

    进入

    ./docker_in.sh nginx-volume-test1

    输入

    mount

    退出

    docker inspect -f {{.Mounts}} nginx-volume-test1

    进入到对应的目录

    /var/lib/docker/volumes/014fa27d7fea367252f91445c6268f1376b67357ca51f0163f7dc480174cbc5a/_data

     新建一个文件

    touch hehe

     新建一个窗口进入容器

    ls /data 就能看到新建的那个文件hehe了

    另外一种挂载方式

    新建一个目录

    mkdir -p /data/docker-volume-nginx

    启动容器挂载

    docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data/ nginx

    进入容器

    ./docker_in.sh nginx-volume-test2

    cd /data

    touch hehe

    退出在目录/data/docker-volume-nginx下面就有了文件hehe

    PS:第二种方式比较常用,挂载数据导致移植性差

    挂载单个文件

    docker run --rm -it -v /root/.bash_history:/.bash_history nginx /bin/bash

     PS: --rm参数退出后自动停止删除这个容器

    数据卷容器

    可以让数据在多个容器之间共享

    docker run -it --name volume-test3 --volumes-from nginx-volume-test2 centos /bin/bash

    可以访问 nginx-volume-test2挂载的目录

    PS:即使停止了容器nginx-volume-test2还是一样可以访问

    docker stop nginx-volume-test2

      使用这种方式挂载不需要指定挂载目录了和源镜像挂载目录一样

    Docker改变了什么

    面向产品: 产品交付

    面向开发: 简化环境配置

    面向测试: 多版本测试

    面向运维: 环境一致性

    面向构架: 自动化扩容(微服务)

    docker镜像的构建

    1,手动构建

    先kill掉所有运行的容器

    docker kill $(docker ps -a -q)

    删除所有容器

    docker rm $(docker ps -a -q)

    PS:生产最好不用这样做

    构建

    docker run --name mynginx -it centos

    yum安装nginx

    rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    yum -y install nginx

    编辑nginx配置文件

    vim /etc/nginx/nginx.conf

    加一行(尾部增加即可不是加在http里面)

    daemon off;

    PS:不能少掉;符号

    代表nginx在前台运行

    exit退出

    提交到本地

    docker commit -m "My Nginx" 0ef327b06604 oldboy/mynginx:v1

    启动

     docker run --name mynginxv1 -d -p 81:80 oldboy/mynginx:v1 nginx

    PS:这里末尾nginx并非nginx镜像而是nginx启动命令

     访问

    访问日志

    sh docker_in.sh mynginxv1

    vi /var/log/nginx/access.log 

    使用命令构建新建目录

    vim Dockerfile

    # This Dockerfile
    
    #Base image
    FROM centos
    MAINTAINER Jason.Zhao xxx@gmail.com
    
    #Commands
    RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    RUN yum -y install nginx && yum  clean all
    RUN echo "daemon off;" >> /etc/nginx/nginx.conf
    ADD index.html /usr/share/nginx/html/index.html
    EXPOSE 80
    CMD ["nginx"]
    

      

    新建首页文件和Dockerfile在同一目录

    echo "nginx in docker,hahha" >>index.html

     构建

    docker build -t mynginx:v2 .

    生成了 查看一下

    启动

    docker run   --name mynginx2 -d -p 82:80 mynginx:v2

    访问82端口就是现实刚刚是index.html内容

     CMD只能使用一次,加入使用了CMD在启动容器的时候优先使用指定的启动命令

    生存环境构建docker镜像

    分层设计

    cd /root/docker/system/centos

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

    mv /etc/yum.repos.d/epel.repo .

    vim Dockerfile

    #Docker for CentOS
     
    #Base image
    FROM centos
    
    #Who
    MAINTAINER Liuyueming 
    
    #EPEL
    ADD epel.repo /etc/yum.repo.d/
    
    #Base pkg
    RUN yum -y install wget mysql-devel supervisor git redis tree net-tools sudo psmisc && yum clean all
    

    构建

    docker build -t oldboy/centos:base ./

    PS:以上及把生产环境所需的最基础的包yum安装上,其他环境可以在此基础上继续构建,而不是其他环境需要这些包重新再安装一遍

    创建应用环境就from oldboy/centos

    cd /root/docker/runtime/python

    vim Dockerfile

    #Base image
    FROM oldboy/centos:base

    MAINTAINER Liuyueming

    RUN yum install -y python-devel python-pip

    #Upgrade pip
    #RUN pip install --upgrade pip

    构建

    docker build -t oldboy/python ./

    PS:加上升级pip的会报错

    构建一个带ssh的

    cd /root/docker/system/centos-ssh

    #Docker for CentOS
    
    #Base image
    FROM centos
    
    #Who
    MAINTAINER Liuyueming
    
    #EPEL
    ADD epel.repo /etc/yum.repo.d/
    
    #Base pkg
    RUN yum -y install openssh-clients openssl-devel openssh-server wget mysql-devel supervisor git redis tree net-tools sudo psmisc && yum clean all
    
    #For SSHD
    RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
    RUN echo "root:oldboy"|chpasswd
    

    构建

    ocker build -t oldboy/centos-ssh ./

    python也基于centos-ssh构建

    cd /root/docker/runtime/python-ssh

    vim Dockerfile

    #Base image
    FROM oldboy/centos-ssh:latest
    
    MAINTAINER Liuyueming
    
    RUN yum install -y python-devel python-pip
    
    #Upgrade pip
    #RUN pip install --upgrade pip 

    docker build -t oldboy/python-ssh ./

    使用这个运行一个python测试脚本

    cd 

    /root/docker/app/shop-api

    vim app.py

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return 'Hello World!'
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    

    yum -y install python-pip

    pip install flask

    运行

    python app.py

    使用5000端口提供服务

     

    访问

    插入学习supervisor进程管理

    yum -y install supervisor

    vim /etc/supervisord.conf

    docker仓库

    作业:需要https加认证nginx

    1,申请免费ssl证书(沃通)

    2,部署

    3,设置验证

    4,proxy_pass 5000

    5,docker run -d -p 5000:5000 --name registry registry:2

    开源企业级 VMware Harbor

    docker的web管理界面admiral

    docker run -d -p 8282:8282 --name admiral vmware/admiral

  • 相关阅读:
    Java习惯用法总结
    为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
    Java 20年:转角遇到Go
    史上最全最强SpringMVC详细示例实战教程
    即将改变软件开发的5个Java9新特性
    <一>c++的编程思路
    人生不可破的28个天规
    定时任务
    redis
    mycat分库分表
  • 原文地址:https://www.cnblogs.com/minseo/p/7163594.html
Copyright © 2011-2022 走看看