zoukankan      html  css  js  c++  java
  • Docker

    入门到精通

    https://mp.weixin.qq.com/s/I_T9a7MH36JWXfCKKKBoNA

    """
    1)docker就是Linux上极其轻量的虚拟机
    ​
    2)虚拟机是存在宿主系统中,通过镜像给宿主系统拓展子系统的(一个镜像理论上可以做n个子系统)
    ​
    3)两个特别重要的概念
        image:镜像
        container:容器(子系统)
        
    4)工作方式:
        i)在服务器系统下载docker(为服务器安装虚拟机,服务器系统就是宿主系统)
        ii)用docker去下载对应需求的镜像:镜像操作
        iii)通过镜像制造容器(装子系统):容器操作
        
    ​
    5)优势
        i)超级轻量级,docker安装的容器体积可以按kB度量
        ii)集群部署,docker可以通过一个镜像制造出多个一模一样的容器
        iii)便捷管理所有镜像与容器(命令行操作)
        
    6)镜像和容器特点
        一般一个镜像中只包含一种软件:比如mysql镜像,创建的容器中只有mysql环境;redis镜像,创建的容器中只有redis环境
        注:一个镜像中有多个环境的需要自己制作镜像
    """

    CentOS安装Docker

    # centos上安装:centos需要在7.0以上
    # windows/mac上自行解决(一般不用)
    
    1)安装依赖
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    ​
    2) 设置yum源为阿里云
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    3) 安装
    sudo yum install docker-ce -y
    
    4) docker 版本:装的最新版
    docker -v
    Docker version 19.03.8, build afacb8b
    docker -v查看版本,如果是17年之前的,就是老版本,操作习惯不一样

    Docker基础命令

    开启关闭

    """
    1)启动
    >: service docker start  |  systemctl start docker
    ​
    2)关闭
    >: service docker stop  |  systemctl stop docker
    ​
    3)重启
    >: service docker restart  |  systemctl restart docker
    """

    镜像操作

    1 换源拉取镜像

    修改源命令
    vim /etc/docker/daemon.json

    2. 进入编辑模式添加源

    {
    "registry-mirrors": [
    "https://kfwkfulq.mirror.aliyuncs.com",
    "https://2lqq34jg.mirror.aliyuncs.com",
    "https://pee6w651.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com"
    ],
    "dns": ["8.8.8.8","8.8.4.4"]
    }

    3. 镜像命令

    # 镜像当成是一个没有启动的操作系统
    # redis镜像,mysql镜像,nginx镜像,django镜像,python镜像:linux+xx软件----》镜像跑起来--》容器:操作系统上运行着redis服务
    
    # 1)查找镜像:https://hub.docker.com/
    docker search helloworld
    docker search centos
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    centos The official build of CentOS. 5956 [OK] 是否是自动构建
    # 2)获取镜像:
    
    docker pull centos # 拉取最新的:相当于docker pull centos:latest 
    docker pull centos:centos7 # 拉取一个centos7
    docker pull centos:centos6.7
    docker pull centos:centos10 # 这个 没有,就报错
    
    # 3)查看本地镜像
    docker images
    
    REPOSITORY TAG IMAGE ID CREATED SIZE
    centos latest 470671670cac 3 months ago 237MB
    centos centos7 5e35e350aded 5 months ago 203MB
    
    # 4)删除本地镜像
    docker rmi 470671670cac # 通过id号删除
    docker rmi centos:centos7 # 通过名字删除
    
    # docker rmi `docker images -q`
    相当于
    docker rmi 470671670cac 5e35e350aded
    

    容器操作

    1)创建容器
    >: docker run [选项参数]
    # 重点:通过镜像创建并运行容器(两步并做一步)
    -i:表示运行容器
    -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    --name :为创建的容器命名。容器名字不能重
    -v:表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
    -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
    -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
    
    # -v:数据卷,做目录映射
    # -p 网络,做端口映射
    
    # 演示
    #基于哪个镜像跑容器:centos:centos7   如果写成centos表示跑最新的 
    #如果没有这个镜像呢?去远程拉,拉下来再跑
    # 容器要运行,需要有一个前台进程
    docker run -it --name=mycentos7 centos:centos7 bash
    ​
    2)查看所有容器:-a就是--all代表全部展示
    >: docker ls -a
    
    3)查看正在运行的容器
    >: docker ps 
    ​
    4)停止一个已经在运行的容器
    >: docker stop 容器id/名字
    ​
    5)启动一个已经停止的容器
    >: docker start 容器id/名字
    
    6)重启容器
    >: docker restart 容器id/名字
    ​
    7)kill掉一个已经在运行的容器
    >: docker kill 容器id
    ​
    8)删除容器(容器停止后才能删)
    >: docker rm 容器id/容器名字
    # 直接删除镜像,如果有容器,能删除吗?支持,但是不推荐做
    9)进入容器
    >: docker [container] exec 参数 容器id bash
    eg: docker exec -it 容器id/容器名字 bash
    ​
    10)进入到容器内部并列出当前目录文件
    docker exec 容器id/容器名字 ls
    
    11)退出容器
    >: exit
    
    # 文件拷贝
    # 从宿主机copy到容器内部
    docker cp 文件路径 容器内部的目标路径
    docker cp untitled3.tar mycentos2_2:/home
    
     # 从容器内部copy出来 
    docker cp 容器内部的文件路径 目标的宿主机路径
    docker cp mycentos2_2:/home/untitled3.tar ./
    
    # 数据卷(目录映射)
    docker run -di  --name=mycentos2_3 -v 宿主机路径:容器内路径 centos:centos7
    docker run -di  --name=mycentos2_3 -v /root/test:/home centos:centos7
    # 作目录映射以后操作宿主机目录和操作容器目录会相互影响
    
    # 查看容器的全部信息
    docker inspect 容器名字/容器id
    
    # 查看ip地址
    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id/名字

    Docker安装Mysql

    1)安装
    >: docker image pull mysql:5.7
        
    2)创建容器:
    # 33306:3306表示容器内的端口3306映射给宿主机提供给外界端口33306,-e表示环境变量,MYSQL_ROOT_PASSWORD=root密码(mysql容器必填)
    >: docker run -id --name=mysql1 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
            
    注:本地测试
    >: mysql -h IP地址 -P端口 -uroot -p密码
    ​
    >: mysql -h 39.99.192.127 -P 3306 -u root -p
    >: root
    >: create database luffy default charset=utf8;
    >: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
    >: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
    >: flush privileges;

    Docker安装Redis

    """
    1)安装
    >: docker pull redis:4.0.9
    ​
    2)创建容器
    >: docker run -id --name=myredis -p 6379:6379 redis:4.0.9
        
    3)进入容器
    >: docker exec -it <容器名称/容器ID> bash
    ​
    4)测试
    >: redis-cli
    ​
    >: redis-cli -h 39.99.192.127 -p 6379
    >: config set requirepass Admin123
    """

    Docker进行迁移备份

    # 启用python容器
    docker run -di --name=mydjango python:3.6
      
    # 安装django环境
    pip install django==1.11.9 -i https://pypi.doubanio.com/simple/
    apt-get update
    apt-get install vim 
    
    # 把容器打包成镜像
    docker commit 容器名字 镜像名字
    docker commit mydjango mydjango_i
    
    # 基于镜像再跑起容器
    docker run -di --name=mydjango2 mydjango_i
    
    # 把本地的镜像拷贝到其他机器上去,再跑起容器来
    # 打成一个tar包,压缩一下(默认压缩到在当前目录的mydjango.tar)
    docker  save -o mydjango.tar mydjango_i
    
    # copy这个压缩包到装了docker的任意的机器上
    根据压缩包,恢复成镜像
    docker load -i mydjango.tar

    Dockerfile

    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像,Dockerfile是用来构建镜像的,比较轻量级。

    命令                            作用
    # image_name是镜像名字,基于哪个镜像构建的
    FROM image_name:tag           定义了使用哪个基础镜像启动构建流程
    MAINTAINER user_name         声明镜像的创建者
    ENV key value                 设置环境变量 (可以写多条)
    RUN command                   是Dockerfile的核心部分(可以写多条)
    
    ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
    COPY source_dir/file dest_dir/file    和ADD相似,但是如果有压缩文件并不能解压
    WORKDIR path_dir    设置工作目录(docker exec 进去,就在当前设置的路径下 / )
    
    CMD [命令] 容器一运行,就会执行命令

    1、写一个Dockerfile,基于python3.6 搭建运行环境:django,drf,uwsgi

    # 名字必须叫 Dockerfile ,当你构建的时候,会在当前路径下找这个文件,自动构建
    vim Dockerfile
    
    FROM python:3.6
    MAINTAINER hank
    ADD ./day0429.tar /home
    RUN pip install -r /home/day0429/requirement.txt -i https://pypi.doubanio.com/simple
    CMD ["/bin/bash"]
    
    # 基于docker file构建
    docker build -t='django1.11.9' .
    
    # 创建并允许基于dockerfile构建的镜像
    docker run -di --name=myproject -p 8080:8080 django1.11.9
    
    进入到容器,启动项目:python manage.py runserver 0.0.0.0:8080
    
    注意:
    json模块3.5之前 不支持loads bytes格式
    json模块3.6以后,loads bytes格式就可以

    2、容器部署项目,用nginx做负载均衡

    # 1 在项目路径下写Dockerfile
    FROM python:3.6
    MAINTAINER lqz
    ADD ./requirement.txt /home/
    RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/
    WORKDIR /home/django_test
    EXPOSE 8080
    VOLUME ["/home"]
    CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"]
    
    # 2 在项目路径下写一个uwsgi.ini
    
    [uwsgi]
    #也可以使用http
    http=0.0.0.0:8080
    #配置项目路径,项目的所在目录
    chdir=/home/django_test
    #配置wsgi接口模块文件路径
    wsgi-file=django_test/wsgi.py
    #配置启动的进程数
    processes=4
    #配置每个进程的线程数
    threads=2
    #配置启动管理主进程
    master=True
    #配置存放主进程的进程号文件
    pidfile=uwsgi.pid
    
    # 3 传到git上(我们直接复制过去了)
    
    在服务器从git上拉下来,解压开
    # 4 基于docker file构建镜像
    docker build -t='django1.11.9' .
    
    
    
    #5  运行起django+uwsgi的容器
    docker run -di --name=mydjango1 -v /home/myproject:/home -p 8080:8080 django1.11.9   
    docker run -di --name=mydjango2 -v /home/myproject2:/home -p 8088:8080 django1.11.9 
        
        
    # 6 基于nginx镜像跑起一个容器来,做目录映射(在宿主机,修改nginx的配置文件)
    # 创建几个文件夹
    mkdir -p /home/nginx/conf /home/nginx/html /home/nginx/logs
    vim /home/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:8088;
            }
        server {
            listen       80;
            server_name  localhost;
            location / {
              #负载均衡配置
              proxy_pass http://node;
            }  
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    
    docker run --name nginx -id -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/etc/nginx/html -v /home/nginx/logs:/var/log/nginx nginx
            
    #7  访问http://101.133.225.166/, 会打到不通的docker容器内,即便有一个服务停了,也不会影响项目的运行
    
    # 不停服更新,停一半,更新,启动--在把另一半更新了

    Docker搭建私有仓库

    # 镜像获取:
    docker pull
    dockerfile构建
    拷贝tar文件,load过来
    
    # 公司内部用的镜像,docker hub上没有,私服(私有服务器)
    
    # 操作步骤
    # 1 拉一个registry镜像  (本质是个什么?web服务(想像成 web项目在里面))
    docker pull registry
    # 2 运行容器
    docker run -di --name=registry -p 5000:5000 registry
    # 3 浏览器输入地址(目前是空的)
    http://宿主机:5000/v2/_catalog
        
    # 4 vi /etc/docker/daemon.json (文件如果没有就创建出来),以后docker pull 先从自己配置的这个拉,再去远程拉
    {"insecure-registries":["101.133.225.166:5000"]} 
    
    # 5 重启docker服务
    systemctl restart docker
    
    # 6 启动容器
    docker restart registry
    
    # 7 标记本地的镜像(可能是dockerfile构建的,也可能是通过容器打包成的)
    docker tag django1.11.9 101.133.225.166:5000/django1.11.9
    # docker tag redis 101.133.225.166:5000/myredis
    
    # 8 把标记好的本地镜像,传到私服
    docker push 101.133.225.166:5000/django1.11.9
    #docker push 101.133.225.166:5000/myredis
      
    # 9 再访问这个地址http://宿主机:5000/v2/_catalog
    就能看到你上次的镜像在里面了
    
    # 10 只要在etc/docker/daemon.json 配置了这个{"insecure-registries":["101.133.225.166:5000"]} ,公司其他人都可以拉取我上传的镜像
    docker pull 101.133.225.166:5000/myredis
  • 相关阅读:
    ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径
    【翻译】.NET 5 Preview2发布
    ASP.NET Core AutoWrapper 自定义响应输出
    TypeScript数据类型
    classpath和classpath*区别
    关联查询报错org.apache.ibatis.builder.BuilderException: Ambiguous collection type for property 'episodeList'. You must specify 'javaType' or 'resultMap'.
    IDEA无法创建Spring Initializr项目
    npm ERR! xd_demo@0.1.0 serve: `vue-cli-service serve`
    打开cmd的几种不常用方式
    idea导入maven项目后有红线
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12467075.html
Copyright © 2011-2022 走看看