• Docker学习笔记


    Docker常用命令

    系统命令

    # 显示版本信息
    docker version   	
    # 显示系统信息,比version更加详细
    docker info			
    # 帮助命令
    docker CLI --help	
    

    镜像命令

    # 查看本地镜像
    docker images
    -a		显示所有
    -f		过滤
    -q		只显示ID
    # 搜索仓库中的镜像
    docker search
    -f		过滤
    # 拉取镜像
    docker pull NAME[:TAG]
    -a		显示所有
    -f		过滤
    -q		只显示ID
    # 删除镜像
    docker rmi IMAGEID
    -f		强制删除
    docker rmi -f $(docker images -aq)
    
    
    # 查看镜像的详细信息
    docker inspect IMAGEID
    -f		显示格式
    -s		大小[只对容器有效]
    # inspect返回的是JSON格式消息,可以用-f参数来指定其中的某一项内容
    docker inspect IMAGEID -f {{.RepoTags}}
    # 也可以通过grep进行过滤
    docker inspect IMAGEID  | grep IPAddress
    
    
    # 创建Docker镜像 共三种方法
    # 第一种 基于已有容器创建
    docker commmit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    -a		作者信息
    -m		提交信息
    -p		提交时暂停容器的运行
    # 第二种 基于本地模板导入
    
    
    # 上传镜像到仓库
    docker push NAME[:TAG]
    
    # 保存镜像
    docker save
    # 载入镜像
    docker load
    
    # 查看镜像的构建历史
    docker history IMAGEID
    

    容器命令

    # 运行容器
    docker run    等效于先执行docker create再执行docker start
    --name		命名
    -d			后台运行
    -it			使用交互方式运行,进入容器查看内容   exit:退出并停止  ctrl+P+Q:只退出不停止
    			-t让docker分配一个伪终端并绑定到容器的标准输入上
    			-i让容器的标准输入保持打开
    -p			指定端口号(主机端口:docker端口)
    -P			随机指定端口
    
    # 列出容器
    docker ps
    -a			包括历史运行过的容器
    -n=?		显示最近创建的几个容器
    -q			只显示容器的编号
    #删除容器
    docker rm CONTIONERID 				# 只能删除处于终止状态的容器,带-f参数可以删除所有状态容器
    docker rm -f $(docker ps -aq) 
    docker ps -aq | xargs docker rm		# 与上边的命令等效
    
    # 创建、启动、停止、重启、强制停止
    docker create 				该命令创建的容器处于停止状态,需要用docker start命令来启动它
    docker start CONTIONERID
    docker stop CONTIONERID
    docker restart CONTIONERID
    docker kill CONTIONERID
    
    # 导出和导入容器
    docker export
    docker import
    
    # 进入docker
    docker attach		所有attach到同一个容器的窗口是同步显示的,一个窗口因命令阻塞时,其他命令也会阻塞
    docker exec			自1.3版本起提供的相对于attach更方便的工具
    

    数据管理

    数据卷

    数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

    • 数据卷可以在容器时间共享和重用
    • 对数据卷的修改会立马生效
    • 对数据卷的更新,不会影响镜像
    • 卷会一直存在,知道没有容器使用

    数据卷的使用类似于Linux下对目录或文件进行mount操作

    在使用docker run时,使用参数-v可以在容器内创建一个数据卷,多次使用-v参数可以创建多个数据卷

    # 示例 给redis容器指定redis.conf和data  :前边对应宿主机,:后边对应docker  
    # 本地目录路径必须是绝对路径,如果本地不存在该路径,docker会自动创建
    # docker挂载数据卷的默认权限是rw,用户也可以通过-ro指定为只读
    docker run -p 8001:6379 --name redis -v /usr/local/bin/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/bin/docker/data:/data -d redis:5.0.5 redis-server /etc/redis/redis.conf --appendonly yes
    

    数据容器

    如果用户要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。

    数据卷容器就是一个普通容器,专门为它提供数据卷供其他容器挂载使用方法如下:

    # 创建数据容器
    docker run -it -v /dbdata --name dbdata ubuntu         /dbdata指的是docker中的路径
    # 在其他容器上使用--volumes-from挂载数据容器中的数据卷
    docker run -it --volumes-from dbdata --name ubuntu1 ubuntu
    docker run -it --volumes-from dbdata --name ubuntu2 ubuntu
    
    

    网络配置

    容器与宿主机之间的端口映射

    docker run -p/-P
    
    docker port 
    

    容器之间的互联

    --link
    

    DockerFile

    DockerFile是用来构建Docker镜像的文件,就是一个命令参数脚本

    构建步骤:

    1. 编写DockerFile文件
    2. 通过docker build -f dockerfilename构建镜像
    3. docker run运行镜像
    4. docker push发布镜像

    DockerFile举例:

    FROM centos
    
    VOLUME ["volume1", "volume2"]
    
    CMD echo "---end---"
    
    CMD /bin/bash
    

    DockerFile指令

    FROM			指定基础镜像
    MAINTAINER		维护者信息
    RUN				镜像构建时需要执行的命令
    ADD				添加其他镜像
    WORKDIR			工作目录
    VOLUME			数据卷
    EXPOSE			对外暴露的端口
    CMD				指定容器启动时运行的命令,只有最后一个会生效,且可以被替代
    ENTRYPOINT		同CMD,但是可以追加命令
    ONBUILD			当构建一个被继承的DockerFile时就会执行ONBUILD的指令
    COPY			类似ADD命令
    ENV				设置构建时的环境变量
    

    实战举例

    基于Docker安装redis-cluster

    # 安装docker
    yum install docker
    systemctl start docker
    
    # 下载redis5.0.5镜像
    docker pull redis:5.0.5
    
    # 编写实现文件
    cd /home
    mkdir redis-cluster
    cd redis-cluster
    vim redis-cluster.tmpl
    
    # 填入以下内容
    port ${PORT}
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    # 这里填写宿主机IP,阿里云用公网IP时集群创建会失败,内网IP没问题
    cluster-announce-ip x.x.x.x
    cluster-announce-port ${PORT}
    cluster-announce-bus-port 1${PORT}
    appendonly yes
    requirepass test@123
    
    # 构建redis网络
    docker network create redis-net
    docker network ls
    
    # 执行上面的tmpl文件,传入参数 8000 - 8005 作为redis不同单节点的端口
    for port in `seq 8000 8005`; do 
    mkdir -p ./${port}/conf 
    && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf 
    && mkdir -p ./${port}/data; 
    done
    
    # 授权 文件夹 权限
    chmod 777 8000 8001 8002 8003 8004 8005
    
    # 启动docker redis镜像  将会启动 8000 8001 8002 8003 8004 8005五个节点的redis
    for port in `seq 8000 8005`; do 
    docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} 
    --privileged=true 
    -v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf 
    -v /home/redis-cluster/${port}/data:/data 
    --restart always --name redis-${port} --net redis-net 
    --sysctl net.core.somaxconn=1024 redis:5.0.5 redis-server /usr/local/etc/redis/redis.conf; 
    done
    
    # 查看 IP 及 端口 (docker内网)
    for port in `seq 8000 8005`; do 
    echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port}"  "  ; 
    done
    # 回显
    172.18.0.2:8000  172.18.0.3:8001  172.18.0.4:8002  172.18.0.5:8003  172.18.0.6:8004  172.18.0.7:8005 
    
    #进入redis-8000容器
    docker exec -it redis-8000 bash
    # 设置三主三从
    redis-cli -a test@123 --cluster create 172.18.0.2:8000 172.18.0.3:8001 172.18.0.4:8002 172.18.0.5:8003 172.18.0.6:8004 172.18.0.7:8005 --cluster-replicas 1
    #遇到提示输入 yes
    
    # 遇到等待join需要新开一个ss窗口执行以下命令如果成功了,就不用了
    #分别进入 其他redis容器 加入 8000 的集群中
    docker exec -it redis-8001 bash
    redis-cli -a test@123 -p 8001 cluster meet 172.18.0.2 8000
    exit
     
    docker exec -it redis-8002 bash
    redis-cli -a test@123 -p 8002 cluster meet 172.18.0.2 8000
    exit
    
    docker exec -it redis-8003 bash
    redis-cli -a test@123 -p 8003 cluster meet 172.18.0.2 8000
    exit
     
    docker exec -it redis-8004 bash
    redis-cli -a test@123 -p 8004 cluster meet 172.18.0.2 8000
    exit
     
    docker exec -it redis-8005 bash
    redis-cli -a test@123 -p 8005 cluster meet 172.18.0.2 8000
    exit
    
    # 查看redis-cluster
    docker exec -it redis-8000 bash
    redis-cli -a test@123 -p 8000 cluster nodes
    

    基于Docker发布ruoyi

    # 将ruoyi的jar包拷贝
    # root @ ubuntu in ~/ruoyi [22:19:06]
    $ ll
    total 70M
    -rw-r--r-- 1 root root 117 Jul  5 23:30 DockerFile
    -rw-r--r-- 1 root root 70M Jul  5 23:30 ruoyi-admin.jar
    
    # 编写DockerFile,填入如下内容
    FROM java:8
    
    COPY *.jar /app.jar
    
    CMD ["--server.port=8080"]
    
    EXPOSE 8080
    
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
    # 生成docker镜像
    # root @ ubuntu in ~/ruoyi [22:20:15]
    $ docker build -f DockerFile -t rouyi .
    Sending build context to Docker daemon  73.33MB
    Step 1/5 : FROM java:8
     ---> d23bdf5b1b1b
    Step 2/5 : COPY *.jar /app.jar
     ---> Using cache
     ---> 929ad15977f2
    Step 3/5 : CMD ["--server.port=8080"]
     ---> Using cache
     ---> a3dc98ba77de
    Step 4/5 : EXPOSE 8080
     ---> Using cache
     ---> e7b96e307687
    Step 5/5 : ENTRYPOINT ["java", "-jar", "/app.jar"]
     ---> Using cache
     ---> d2dee089a684
    Successfully built d2dee089a684
    Successfully tagged rouyi:latest
    
    # 启动docker容器
    # root @ ubuntu in ~/ruoyi [22:22:32]
    $ docker run -d -p 8888:8080 --name ruoyi rouyi
    c57398109db87a5703f47d3c5fce46c095fbb96e56047a5c5e081731fb7cc4e3
    
    # root @ ubuntu in ~/ruoyi [22:22:36]
    $ docker ps
    CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS         PORTS                                                                                                NAMES
    c57398109db8   rouyi                 "java -jar /app.jar …"   10 seconds ago   Up 9 seconds   0.0.0.0:8888->8080/tcp, :::8888->8080/tcp                                                            ruoyi
    e48568642793   mysql                 "docker-entrypoint.s…"   47 hours ago     Up 47 hours    33060/tcp, 0.0.0.0:3333->3306/tcp, :::3333->3306/tcp                                                 mysql4ruoyi
    9461c8419d73   portainer/portainer   "/portainer"             3 days ago       Up 3 days      0.0.0.0:9000->9000/tcp, :::9000->9000/tcp                                                            dreamy_bhabha
    8d0bb2e1f09b   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8005->8005/tcp, :::8005->8005/tcp, 6379/tcp, 0.0.0.0:18005->18005/tcp, :::18005->18005/tcp   redis-8005
    5af384853d00   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8004->8004/tcp, :::8004->8004/tcp, 6379/tcp, 0.0.0.0:18004->18004/tcp, :::18004->18004/tcp   redis-8004
    a983a4a11540   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8003->8003/tcp, :::8003->8003/tcp, 6379/tcp, 0.0.0.0:18003->18003/tcp, :::18003->18003/tcp   redis-8003
    0dad67cbc82a   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8002->8002/tcp, :::8002->8002/tcp, 6379/tcp, 0.0.0.0:18002->18002/tcp, :::18002->18002/tcp   redis-8002
    9061c96c81aa   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8001->8001/tcp, :::8001->8001/tcp, 6379/tcp, 0.0.0.0:18001->18001/tcp, :::18001->18001/tcp   redis-8001
    a610fbf380cb   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 6379/tcp, 0.0.0.0:18000->18000/tcp, :::18000->18000/tcp   redis-8000
    
    
  • 相关阅读:
    把自己活成AI
    cmd 中文显示错误,解决办法
    直流通路,交流通路的理解 三极管
    欧拉公式的理解
    从一个量分别和两个量成正比,怎么推理出和他们乘积成正比?
    细说python类3——类的创建过程
    delphi 基础之二 面向对象概念初步
    delphi 基础之一 数据类型和基本语法
    delphi的多线程编程
    Delphi初学者应小心的六大陷阱
  • 原文地址:https://www.cnblogs.com/yaohl0911/p/14980183.html
Copyright © 2020-2023  润新知