zoukankan      html  css  js  c++  java
  • 80.docker基础命令

    https://bingohuang.gitbooks.io/docker_practice/content/repository/local_repo.html # 文档

    https://www.cnblogs.com/wang-xing-hao/articles/11481263.html # 博客

    # 如何保持环境一致?
    pip3 freeze > requirement.txt
    pip install -r requirement.txt
    
    1.环境不一致
    2.配置文件不一致
    3.技术水平,导致部署环境快慢不一样
    
    # docker:
    1.一处编译,到处运行
    2.对系统的消耗不是特别多
    3.可以快速启动
    4.维护简单
    5.扩展容易
    

    1584515180268

    镜像:

    可以理解为操作系统的ios镜像
    

    容器:

    启动后的镜像, # 可以理解为镜像的实例化
    

    仓库:

    镜像
    私有的仓库
    公共的仓库
    docker-ce # 社区版本
    docker-ee # 商业版本
    

    底层实现原理:

    namspace
    cgroup
    linux 内核的技术
    

    安装:

    www.51linux.org/server/docker.html

    # 建议安装之前去阿里源中间Centos源和epel源现安装上,否则会很慢
    cd /etc/yum.repos.d
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum install -y docker-ce
    

    配置加速器:

    # 其中的加速器https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors这个地址,没有的自己注册或者通过支付宝登录,在左下角有一个镜像加速器,复制地址放到列表里面就可以了
    vim /etc/docker/daemon.json  #创建文件
    {
      "registry-mirrors": [
        "https://dockerhub.azk8s.cn",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
      ]
    }
    # 加载文件并重启服务
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

    第一个命令:

    docker run hello-world
    

    搜索镜像:

    # docker search mysql
    NAME                              DESCRIPTION                                     STARS               OFFICI
    
    AL            AUTOMATED
    mysql                             MySQL is a widely used, open-source relation…   9255                [OK]                
    mariadb                           MariaDB is a community-developed fork of MyS…   3300                [OK]  
    
    name : 名字
    DESCRIPTION : 描述
    STARS: 星
    OFFICIAL: 是否是官方
    
    

    镜像命令:

    # 镜像
    docker pull centos:centos7.8.2003  # 下载镜像: 指定版本号
    docker images  # 产看镜像
    docker images -q  # 只显示镜像id  == docekr images ls -1
    docker images mysql/centos  # 显示需要的镜像
    
    docker images --format 'table {{.ID}}:{{.TAG}}'  # 格式化输出
    IMAGE ID:TAG
    470671670cac:latest
    fce289e99eb9:latest
    
    # 删除镜像
    docker rmi centos # 删除镜像
    docker rmi 镜像id # 删除镜像
    docker rmi -f `docker images -q`  # 删除全部镜像
    
    # 查看容器
    docker run 镜像名称 # 先查找本地是否存在镜像,没有就去下载,下载之后启动镜像,但是启动之后就退出了,容器启动以后在原来的镜像基础上再新建一层
    docker ps # 查看容器,只显示运行中的容器
    docker ps -a  # 查看所有的容器
    docker ps -a -q # 只查看容器的id
    
    # 运行镜像
    docker run centos /bin/echo 'xiaoming' # 执行命令
    docker run -ti centos /bin/bash # 启动并进入镜像
        -t 创建一个虚拟终端
        -i 将容器的标准输入保持打开 
        -d 后台运行
        --name 指定容器名称
        -P  将随机端口暴露在宿主机器上
        -v 宿主机目录:容器指定目录(可以实现江苏主机目录挂载到容器中)
    docker run -ti --name mycentos mycentos /bin/bash  # --name给容器指定名称
    docker run -d nginx # 后台运行-d
    docker run -d --name nginx -P[大写] nginx # 将端口暴露在宿主机器上-P
    docker run -d --name nginx -p[小写] 80[宿主机端口]:80[容器端口]  nginx  # 
    docker run -d --name nginx2 -p 81:80 -v /data/html:/opt/share/nginx/html nginx[容器名称]
    
    # 创建自己的镜像
    docker commit -m "创建文件夹" 容器id mycentos[名称]:latest[标签]  # 创建自己的镜像
    
    # 保存镜像
    docker save -o mycentos.tar.gz mycentos[镜像名称]  # 保存自己的镜像
    docker save mycentos > mycentos.tar.gz[文件名称自定义]  # 追加保存
    
    # 删除容器
    docker rm 容器id  # 删除容器,正在运行的容器这个命令删不掉,可以加上参数-f
    	-f 强制删除
    docker rm 容器名称[name]
        
    # 导入自己的镜像
    docker load -i mycentos.tar.gz  # 导入自己的容器
    docker load  < mycentos.tar.gz 
    
    # 查看端口映射关系
    docker port nginx[容器名称/id]  # 查看容器在宿主机上的关系映射
    
    # 关闭docker容器
    docker stop 容器名称/容器id
    
    # 启动docker容器
    docekr start 容器名称/容器id
    
    # 查看容器日志
    docker logs 容器名称/容器id
    	-f 动态监控
    
    # 进入容器
    docker exec -ti 容器名称/容器id /bin/bash
    
    # 监控容器状态
    docker stats 容器名称/容器id  /bin/bash
    
    # 移出所有停止状态的容器
    docekr container prune
    
    
    exit # 退出镜像 crtl+d也可以
    docker镜像是分层的:不同的应用,已存在的层是可以互相借用的
    
    https://www.cnblogs.com/charlieroro/p/9233266.html  #  no space left on device问题
    

    ip:

    yum install -y ip  # 下载ip命令管理器
    yum provides ip #  查看命令是谁提供的
    yun install iproute
    
    ss -tnlp | gerp redis # 查看端口
    killall -9 redis # 杀死进程
    scp 192.168.21.131:/etc/nginx/nginx.conf .  # 复制远程文件到本机,也可以传送本地文件到远程
    rpm -q docker-ce  # 查看docker版本
    

    dockerfile:

    ----------------------------------------编写dockerfile文件-------------      
    # vim nginx
    FROM mycentos  #指定基础镜像
    COPY epel.repo /etc/yum.repo.d/  # 复制本机文件到镜像,但是不解压
    RUN yum install -y nginx  # 运行命令127.0.0.1:86/
    RUN mkdir -p /data/html
    RUN echo "mynginx" > /data/html/index.html
    COPY nginx.conf /etc/nginx/nginx.conf
    ADD nginx.tar.gz /add/  # 复制并解压文件
    ENV alex=alexdsb   # 设置环境变量
    ENV wulabn=dsb
    WORKDIR /data/html  # 设置工作目录
    EXPOSE 80  # 设置端口
    VOLUME # 指定容器目录(这个是挂载目录)
    CMD /bin/bash -c systemctl start nginx  # 运行命令
    -------------------------------------------------------------------------
    RUN和CMD的区别:run可以有多个,cmd只有一个(如果cmd有多个按最后一个算)
    
    docker build --help # -f参数后面的名称就是dockerfile文件名称
    docker build -t mynginx:v1 .  # 运行自己的dockerfile文件
    docker run -d -p 86:80 mynginx:v1[名称:标签]
    

    build

    docker  build -t name:tag -f dockerfile . 
    

    部署django项目:

    FROM mycentos
    COPY epel.repo /ect/yum.repos.d/
    RUN yum install -y python36 python36-pip python36-devel
    RUN pip3 install django=1.11 pymsql django-multiselectfield -i https://pypi.douban.com/simple
    COPY supercrm /data/supercrm
    WORKDIR /data/supercrm # 指定运行下面指令的工作目录,相当于RUN cd /data/supercrm切换木
    RUN python3 manage.py migrate
    EXPOSE 8080
    CMD python3 manage.py runserver 8080
    
    # 
    docker build -t django:v1 -f django .  # 编译
    docker run -d django:v1  # 
        
    # https://www.cnblogs.com/infoo/p/11900607.html如何出现错误请看这篇博客
    

    远程仓库

    docker login  #登录docker-hub网站
    docker tag django[镜像名称] liuzhanghao/django[docker用户名/镜像名称]  # 修改名称
    docker push liuzhanghao/django  # 上传
    

    本地仓库:

    本地仓库
    docker run -p 5000:5000 -d -v /opt/data/registry:/var/lib/registry registry
            
    docker tag django 127.0.0.1:5000/django
    docker push django 127.0.0.1:5000/django
    
    # 检查
    curl 127.0.0.1:5000/v2/_catalog
    docker pull 127.0.0.1:5000/v2/_catalog  # 下载本地仓库镜像
    

    解决办法:

    cat /etc/docker/daemon.json
    {
        "registry-mirrors": [
            "https://dockerhub.azk8s.cn",
            "https://docker.mirrors.ustc.edu.cn",
            "https://registry.docker-cn.com"
            ]
        "insecure-registries":[
            "192.168.21.128:5000"
        ]
    }
    
    docker tag django 192.168.21.128:5000/django  # 推到私有的仓库
    docker push 192.168.21.128:5000/django  # 其他人就可以通过这个ip和端口拉取镜像,但是127.0.0.1的私有仓库其他人是不能拉取镜像的,类似于
    github的共有项目,127.0.0.1是私有的ip,每个人是不同的
    

    docker编排工具

    kubernetes # k8s
    compose # 官方
    
    pip3 install docker-compose
    

    语法基于yaml:

    默认是docker-compose.yml
    -f 指定文件
    
    version: 3
    services:
     web:  
        build:  # 编译
         context: .  # 文件目录
         dockerfile: flaskdockerfile  # 指定docker文件
        ports:  # 端口
        - '15000:5000'
     redis:
        image: 'redis'  # 指定镜像
    
    
    

    docker 挂载目录:

    # 原因
    1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后
    ,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在主机上呢?这样即使容器删除了,数据还在。# 可以理解为数据持久化
    
    2)当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。这样的话,我在主机上修改文件(如html,js等)后,需
    要再同步到容器中。这显然比较麻烦。# 可以理解为解决热加载问题
    
    3)多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?
    
    对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关
    联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要
    同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。# 可以理解为解决数据共享问题
    

    方式1:

    1、运行命令:docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash
    其中的 -v 标记 在容器中设置了一个挂载点 /data(就是容器中的一个目录),并将主机上的 /home/xqh/myimage 目录中的内容关联到 /data下。
    这样在容器中对/data目录下的操作,还是在主机上对/home/xqh/myimage的操作,都是完全实时同步的,因为这两个目录实际都是指向主机目录。
    
    2、运行命令:docker run --name test1 -it -v /data ubuntu /bin/bash
    上面-v的标记只设置了容器的挂载点,并没有指定关联的主机目录。这时docker会自动绑定主机上的一个目录。通过docker inspect 命令可以查看到。
    xqh@ubuntu:~/myimage$ docker inspect test1
    [
    {
        "Id": "1fd6c2c4bc545163d8c5c5b02d60052ea41900a781a82c20a8f02059cb82c30c",
    .............................
        "Mounts": [
            {
                "Name": "0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01",
                "Source": "/var/lib/docker/volumes/0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true
            }
        ],
    ...........................
    复制代码
    
    上面 Mounts下的每条信息记录了容器上一个挂载点的信息,"Destination" 值是容器的挂载点,"Source"值是对应的主机目录。
    
    可以看出这种方式对应的主机目录是自动创建的,其目的不是让在主机上修改,而是让多个容器共享。
    

    方式二:

    通过创建dockerfile在创建镜像的时候就挂载目录,之后通过镜像创建的所有容器都有同样的挂载目录。上面介绍的通过docker run命令的-v
    标识创建的挂载点只能对创建的容器有效。通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
    还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
    
    #test
    FROM ubuntu
    MAINTAINER hello1
    VOLUME ["/data1","/data2"]
    上面的dockfile文件通过VOLUME指令指定了两个挂载点 /data1 和 /data2.
    
    我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息
        "Mounts": [
            {
                "Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21",
                "Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data",
                "Destination": "/data1",
                "Driver": "local",
                "Mode": "",
                "RW": true
            },
            {
                "Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36",
                "Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data",
                "Destination": "/data2",
                "Driver": "local",
                "Mode": "",
                "RW": true
            }
        ],
    复制代码
    
    可以看到两个挂载点的信息。
    

    方式三:共享

    # --volumes-from指定一个已创建的容器,表示使用同样的挂载目录(在这个挂载目录中数据是共享的)
    docker run --name test1 -it myimage /bin/bash
    
    上面命令中的 myimage是用前面的dockerfile文件构建的镜像。 这样容器test1就有了 /data1 和 /data2两个挂载点。
    
    下面我们创建另一个容器可以和test1共享 /data1 和 /data2卷 ,这是在 docker run中使用 --volumes-from标记,如:
    
    可以是来源不同镜像,如:
    
    docker run --name test2 -it --volumes-from test1  ubuntu  /bin/bash
    
    也可以是同一镜像,如:
    
    docker run --name test3 -it --volumes-from test1  myimage  /bin/bash
    
    上面的三个容器 test1 , test2 , test3 均有 /data1 和 /data2 两个目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到。
    

    数据容器:

    # 最佳实践:数据容器
    
    如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据容器,该容器有1个或多个卷。
    其它容器通过--volumes-from 来共享这个数据容器的卷。
    因为容器的卷本质上对应主机上的目录,所以这个数据容器也不需要启动。
    如: docker run -d --name test1 test:v1 /bin/bash
    docker run -ti --name test2 --volumes-from test1 test:v1 /bin/bash
    
  • 相关阅读:
    前后端分离的若依(ruoyi)基本使用
    Redis (error) NOAUTH Authentication required.解决方法
    Creating Server TCP listening socket 127.0.0.1:6379: bind: No error。。。启动遇到问题的解决办法
    持续集成
    Java compiler level does not match the version of the installed Java project facet问题解决
    控制台报错:Unknown database 'xxxxx'
    走进docker-machine
    走进docker-compose
    java新手学习路线
    Spring WebFlux 教程:如何构建反应式 Web 应用程序
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/13395197.html
Copyright © 2011-2022 走看看