zoukankan      html  css  js  c++  java
  • Docker 详解

    一 docker介绍

    常见的运维软件

    各种常见的运维软件用什么语言写的
        zabbix(监控软件):php
        ansible(批量管理主机,执行命令,无angent):python
        salstack(批量管理主机,执行命令,有angent):python
        openstack(云计算,管理虚拟机):python
        jekins(ci/di):自动化部署,java
        
        普罗米修斯(Prometheus,监控):go写的
        docker:go
        k8s:go
    

    什么是虚拟化?

    -vmware,kvm,openstack,docker,k8s
        -云服务器:vmware,kvm虚拟化出来的
        -阿里云,腾讯云:opensatck,阿里飞天,用来管理虚拟化出来的操作系统
        -docker:进程级别的隔离,装在虚拟机,云服务器上,一个云服务上开业跑出成几百个docker容器,成百上千的服务器上,就会有个上万个容器
        -k8s:不同机器的上万个容器如何管理
        
        -虚拟化:打破实体结构间的不可切割的障碍
    

    什么是Docker?

    - Go语言实现,开源出来,很多人用
        - docker-ce(免费),docker-ee(收费)
        - 通过go语言对lxc技术的一个封装
        -上手快,简单
    容器与虚拟机比较
    	-docker不需要虚拟硬件和操作系统,轻量级,占用体积小,启动快
        
        Docker是一个客户端-服务器(C/S)架构程序(mysql,redis都是cs架构),整套RESTful API
    
    docker非常重要的概念:镜像(image)与容器(container)
    	有了镜像---》镜像运行起来是容器(真正的执行单位)
        面向对象的类     对象
    镜像是从哪里来的?
    	-镜像就是一堆文件
    	-从远程仓库获取(拉取)
    

    docker安装

    乌班图上安装

    # 0 卸载
    sudo apt-get remove docker docker-engine docker.io containerd runc
    # 1 安装必要工具
    sudo apt-get update
    sudo apt-get install 
        apt-transport-https 
        ca-certificates 
        curl 
        gnupg-agent 
        software-properties-common
    # 2 安装GPG证书
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    #换成阿里云
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    # 2 写入软件源信息
    #官方
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    #换成阿里云
    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
    # 3 更新并安装docker-ce
    sudo apt-get -y install docker-ce
    # 4 开启docker服务
     systemctl status docker
    

    centos上安装(必须7.0以上)

    # 6.8安装docker,自行搜索,升级内核版本
    # docker是在linux3.1以上内核中写出来的,在乌班图下开发的,docker的新特性,乌班图先看到,
    # 官方建议docker运行在centos7 以上的系统
    
    #####安装
    0 卸载
    yum remove docker docker-common  docker-selinux docker-engine
    rm -rf /var/lib/docker
    
    1 更新yum
    yum update
    2 安装需要的软件包, yum-util 
    yum install -y yum-utils device-mapper-persistent-data lvm2
    3 执行(向你的yum源,增加一条记录)
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    4 安装 
    yum install docker-ce
    
    5 验证安装(查看版本)
    docker -v  
    ~]# docker -v  (19年03月12日发布)
    # 自从分了docker-ce和docker-ee以后,以年份命名版本
    Docker version 19.03.12, build 48a66213fe
    
    6 启动docker服务
    systemctl start docker
    
    7 停止docker服务,重启docker服务
    systemctl stop docker
    systemctl restart docker
    
    8 开机启动	
    systemctl enable docker
    
    9 查看概要信息
    docker info(你可能写了一个管理docker的运维平台)
    

    远程仓库

    # 注册,登录 https://hub.docker.com/
    # 你可以上传镜像(类似于github),你把你制作的镜像传上去,别人可以下载使用
    
    # 配置加速(之前去https://hub.docker.com/),阿里云,清华,做了一个备份,配置好以后,再拉镜像会去国内地址拉取
    第一步:vi /etc/docker/daemon.json  
    第二步:
    {
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    

    二 镜像

    镜像是什么?
    -就是一堆文件,这堆文件通过docker跑起来,就是容器,你现在就把他当成,一个操作系统内跑了这个软件(centos+redis)
    -假设centos7的镜像跑起来,容器你就当成在你宿主机上跑了一个centos7的操作系统(虚拟机)

    查看镜像

    docker images
    

    REPOSITORY:镜像名称

    TAG:镜像标签

    IMAGE ID:镜像ID

    CREATED:镜像的创建日期(不是获取该镜像的日期)

    SIZE:镜像大小

    这些镜像都是存储在Docker宿主机的/var/lib/docker目录下

    搜索镜像

    如果你需要从网络中查找需要的镜像,可以通过以下命令搜索

    docker search 镜像名称
    

    NAME:仓库名称

    DESCRIPTION:镜像描述

    STARS:用户评价,反应一个镜像的受欢迎程度

    OFFICIAL:是否官方

    AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

    拉取镜像

    拉取镜像就是从中央仓库中下载镜像到本地

    docker pull 镜像名称
    

    例如,我要下载centos7镜像

    docker pull centos:7
    

    删除镜像

    按镜像ID删除镜像

    docker rmi 镜像ID
    

    删除所有镜像

    docker rmi `docker images -q`
    

    三 容器

    查看容器

    查看正在运行的容器

    docker ps
    

    查看所有容器

    docker ps –a
    

    查看最后一次运行的容器

    docker ps –l
    

    查看停止的容器

    docker ps -f status=exited
    

    创建与启动容器

    创建容器常用的参数说明:

    创建容器命令:docker run

    -i:表示运行容器

    -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

    --name :为创建的容器命名。

    -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

    -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。

    -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

    (1)交互式方式创建容器

    docker run -it --name=容器名称 镜像名称:标签 /bin/bash
    

    这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态

    容器一直运行的原因
    -它有一条前台进程,一直在运行
    -如果该命令结束,该容器也就结束了

    退出当前容器

    exit
    

    (2)守护式方式创建容器:

    Copydocker run -di --name=容器名称 镜像名称:标签
    

    登录守护式容器方式:

    docker exec -it 容器名称 (或者容器ID)  /bin/bash
    

    停止与启动容器

    停止容器:

    docker stop 容器名称(或者容器ID)
    

    启动容器:

    docker start 容器名称(或者容器ID)
    

    文件拷贝

    如果我们需要将文件拷贝到容器内可以使用cp命令

    docker cp 需要拷贝的文件或目录 容器名称:容器目录
    

    也可以将文件从容器内拷贝出来

    docker cp 容器名称:容器目录 需要拷贝的文件或目录
    

    目录挂载

    我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
    创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:

    docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
    

    如果你共享的是多级的目录,可能会出现权限不足的提示。

    这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题

    举例:部署redis,把配置文件和数据目录映射出来

    # 操作步骤
    	-1 mkdir /reids /redis/conf /redis/data
        -2 vim /redis/conf/redis.conf
            # 配置文件
            bind 0.0.0.0
            daemonize NO
            protected-mode no
            requirepass 123456
        -3 创建并运行容器
        docker run 
        -p 6378:6379 
        --name redis_6379 
        -v /redis/conf/redis.conf:/etc/redis/redis.conf 
        -v /redis/data:/data 
        -di 
        redis redis-server /etc/redis/redis.conf
        -4 本地window机器上远程连接docker里的redis测试
         cmd窗口下
        	redis-cli -h 101.133.225.166 -p 6378
        	auth 123456
        	set name lqz
    	 保存数据,save或者是bgsave
        	
        -5 查看宿主机的/redis/data路径,有data文件
         不管多少次重启redis容器,数据都还在
         原来的redis容器没了,按照第三步再启动一遍,数据都还在
    

    查看容器IP地址

    我们可以通过以下命令查看容器运行的各种数据

    docker inspect 容器名称(容器ID) 
    

    也可以直接执行下面的命令直接输出IP地址

    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
    

    端口映射

    前者是宿主机端口,后者是容器端口

    docker run -di -p 6377:6379 redis:latest
    

    应用部署

    # 在容器内部署mysql
    # -e表示环境变量
    
    docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
    # 官方提供的
    docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
            
    

    删除容器

    删除指定的容器:

    docker rm 容器名称(容器ID)
    docker rm -f 强行删
    
    # 删除所有容器()
    docker rm `docker ps -a -q`
    # 删除所有镜像
    docker rmi `docker images -q`
    
    # 查看容器运行日志
    docker logs 容器id
    

    四 镜像备份

    容器保存为镜像
    docker commit 容器名字 镜像名字
    docker commit 19b mydjango
    
    把镜像打包成压缩包
    docker save -o mydjango.tar mydjango
    
    把压缩包回复为镜像
    docker load -i mydjango.tar
    
    

    五 dockerfile(重点)

    通过这个文件可以生成镜像

    2 dockerfile指令
    FROM: 指定基础镜像
    RUN: 构建镜像过程中需要执行的命令。可以有多条。docker build
    CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。
    ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
    :为镜像添加对应的数据。
    MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。
    EXPOSE:设置对外暴露的端口。
    ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
    ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
    ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件
    COPY:将本地文件或目录拷贝到镜像的文件系统中。
    VOLUME:添加数据卷
    USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
    WORKDIR:设置工作目录
    ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令
    STOPSIGNAL:设置容器退出时发出的关闭信号。
    HEALTHCHECK:设置容器状态检查。
    SHELL:更改执行shell命令的程序。Linux的默认shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。
        
        
    3 写一个简单的dockerfile(文件名字必须交dockerfile)
    
        FROM python:3.6
        MAINTAINER lqz
        ADD ./requirement.txt /home/ #将宿主机的文件复制到容器内
        RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/ 
        RUN pip install uwsgi -i https://pypi.douban.com/simple/
        WORKDIR /home/django_test 
        CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"] #启动容器时执行脚本
    Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
        
    4 写一个uwsgi.ini配置文件   
    
    5 写一个nginx配置文件
    # 创建文件件
    mkdir -p /opt/nginx/conf /opt/nginx/html /opt/nginx/logs
    # 新建配置文件
    vim nginx/conf/nginx.conf
                    
    #配置负载均衡nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        upstream node	{
    		server	101.133.225.166:8080;
    		server	101.133.225.166:8081;
            server	101.133.225.166:8082;
    	}
        server {
            listen       80;
            server_name  localhost;
            location / {
              #proxy_pass http://101.133.225.166:8080;
              #负载均衡配置
              proxy_pass http://node;
            }  
        }
    }
    
    

    使用dockerfile搭建项目

    项目完成需要有3个文件
    requirement.txt  #项目的python环境依赖
    Dockerfile   #创建docker镜像的文件
    uwsgi.ini   #uwsgi的配置文件
    
    1,Git拉取项目到宿主机
    2,cd到项目通过dockerfile构建出镜像
    	docker build -t='django_1.11.11' .   # .表示使用当前路径的dickerfile
    3,通过构建的镜像生成容器并启动
    docker run -di --name=mydjango2 -v /opt/lqz/:/home -p 8080:8080 django_1.11.11
    4,配置nginx转发,启动nginx
    docker run --name nginx -id -p 8888:80 
        -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
        -v /opt/nginx/html:/etc/nginx/html 
        -v /opt/nginx/logs:/var/log/nginx nginx
    5,用docker启动多个项目
    docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8081:8080 django_1.11.11
    docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8082:8080 django_1.11.11
    

    上传镜像到dockerhub

    -1,链接dockerhub
    docker login  输入用户名密码
    -2,给你要上传的image打个标签,  用户名/镜像名:版本
    docker tag 5452fa6715c0 liuqingzheng/django1.11.11:v1
    -3,上传docker镜像
    docker push liuqingzheng/django1.11.11:v1
    -4,拉去docker镜像
    docker pull liuqingzheng/django1.11.11:v1
    

    六 私有仓库搭建

    1 拉取私有仓库镜像
    	docker pull registry
    2 启动仓库镜像容器
    	docker run -di --name=registry -p 5000:5000 registry
    3 打开浏览器 输入地址(自己的ip)http://101.133.225.166:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
    4 修改daemon.json,配置私有仓库的地址
    	vi /etc/docker/daemon.json
        添加以下内容,保存退出,此步用于让 docker信任私有仓库地址
        {"insecure-registries":["101.133.225.166:5000"]} 
    5 重启docker 服务
    	systemctl restart docker
    6 重启容器
    	docker start registry
    7 打标签
    	docker tag 5452fa6715c0 101.133.225.166:5000/django1.11.11
    8 上传到私有仓库
    docker push 101.133.225.166:5000/django1.11.11
    9 从私有仓库拉取镜像
    docker pull 101.133.225.166:5000/django1.11.11
    

    七 单机容器编排

    1 docker-compose是一个单机情况下容器编排的工具,通过yml文件定义多个容器,默认名字docker-compose.yml
    
    2 安装docker-compose
    curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose #这条命令使其变成可执行文件
    
    验证安装成功
    	docker-compose -v
    
    3 三个概念,Service  Networks ,Volumes
    	一个service代表一个container,这个container可以从docker hub的image来创建,或者从本地dockerfile build的image来创建
    
    

    实战:docker-compose安装MySQL,redis

    1创建docker-compose文件,vim docker-compose.yml
    
    version: "3"
    services:
      redis: #起一个redis容器
        image: redis #通过本地镜像创建容器没有用远端仓库
      web: #起一个web容器
        build: #通过dockerfile创建容器
          context: . #当前路径
          dockerfile: Dockerfile #提前写好的文件
        ports:
          - 8080:5000  #外:内
        environment:
          REDIS_HOST: redis
            
    2启动--运行
    docker-compose up
    

    水平拓展(起多个相同的服务)

    需要修改配置才能启动多个相同的服务,否则会出现端口冲突

    version: "3"
    
    services:
    
      redis:
        image: redis
    
      web:
        build:
          context: .
          dockerfile: Dockerfile
        environment:
          REDIS_HOST: redis
    
      lb:
        image: dockercloud/haproxy
        links:
          - web
        ports:
          - 8080:80
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
    
    启动3个  web服务      
    docker-compose up --scale web=3 -d
    

    多个容器直接通信方式

    1 端口映射到宿主机,直接访问宿主机
    2 通过ip地址访问
    3 run的时候指定 --link 容器 
    docker run -di --name=centos1 centos:centos7
    docker run -di --name=centos2 --link centos1 centos:centos7
        
    进入到centos2中 ping centos1 可以ping同
    
    
    # 跨主机的容器通信
    	-端口映射
    
  • 相关阅读:
    git分支管理策略
    git解决冲突
    git分支创建和合并
    git连接远程库
    git删除文件
    git撤销修改
    4k测试网站
    Windows10通过TightVNC远程连接Ubuntu18.04
    robot报告合并输出
    python 传参中的*和**
  • 原文地址:https://www.cnblogs.com/Franciszw/p/13685542.html
Copyright © 2011-2022 走看看