• docker介绍及使用


    简介

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

    原理

    Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。

    安装docker

    snap install docker

    基本组成

    1. Docker镜像(Image)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
    2. Docker容器(Container)独立运行一个或一组应用。容器是使用镜像创建的运行实例。
    3. 仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    4. 卷:目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统。备份容器内的数据到主机目录中,关闭后不会被删除。docker run后加(-v,并设置超级权限):-v 容器内部路径:容器外部路径 --privileged=true

    镜像和容器的区别:1、镜像是包含了各种环境或者服务的一个模板,而容器是镜像的一个实例;2、镜像是不能运行的,是静态的,而容器是可以运行的,是动态的。

    查看要安装的有哪些版本(tags),对应版本后可复制下载命令

    修改镜像源

    1. // 服务器
    2. sudo nano /etc/docker/daemon.json
    3. // 添加如下配置(这个是我windows电脑上的)
    4. {
    5. "builder": {
    6. "gc": {
    7. "defaultKeepStorage": "20GB",
    8. "enabled": true
    9. }
    10. },
    11. "experimental": false,
    12. "features": {
    13. "buildkit": true
    14. },
    15. "registry-mirrors": [
    16. "https://hub-mirror.c.163.com",
    17. "https://mirror.baidubce.com"
    18. ]
    19. }

    命令字和help

    1. docker --help
    2. docker run --help 查看帮助(得到的内容第一列等同于同行第二列,否则用第二列名字)
    3. 第一例可以-后同时加多个命令,如下i为保持打开,t为分配一个tty
    4. docker exec -it 9019bce34a84 cat /etc/onlyoffice/documentserver/local.json
    5. docker exec 9019bce34a84 cat /etc/onlyoffice/documentserver/local.json

    命令操作

    仓管中心和仓库(Registry & Repository)

    1. docker login 登入仓管中心
    2. sudo docker login --username=1172648136@qq.com registry.cn-hangzhou.aliyuncs.com
    3. docker logout 登出仓管中心。
    4. docker search 从仓管中心检索镜像。
    5. docker pull 从仓管中心拉取镜像到本地。
    6. docker pull nginx:1.17.8 下载对应版本
    7. docker push 名字:镜像版本号 从本地推送镜像到仓管中心。结合tag命令使用

    镜像

    1. # 生命周期
    2. docker images 查看所有镜像。
    3. docker import 从归档文件创建镜像。
    4. docker build 从 Dockerfile 创建镜像。
    5. docker commit 为容器创建镜像,如果容器正在运行则会临时暂停。
    6. docker commit 容器id 建立的镜像名:版本号(标签)
    7. docker rmi image_id 删除镜像。id通过docker images获取,并且删除前需要将对应的容器停止运行删除后才能正常删除
    8. docker load 从标准输入 (STDIN) 加载归档包 (tar archive) 作为镜像,包括镜像本身和标签 (tags, 0.7 起)。
    9. docker save 将镜像打包为归档包,并输出至标准输出 (STDOUT),包括所有的父层、标签和版本 (parent layers, tags, versions, 0.7 起)。
    10. # 其它信息
    11. docker history 查看镜像的历史记录。
    12. docker tag 给镜像打标签命名(本地或者仓库均可)。
    13. docker tag image_id 名字:镜像版本号 出版本给push推送到服务器
    14. # 加载 / 保存 / 导入 / 导出镜像
    15. docker load < my_image.tar.gz 从文件中加载镜像
    16. docker save my_image:my_tag | gzip > my_image.tar.gz 保存既有镜像
    17. cat my_container.tar.gz | docker import - my_image:my_tag 从文件中导入容器镜像,import后为镜像用户名、镜像名
    18. docker export my_container_id | gzip > my_container.tar.gz 导出既有容器,导出容器为当前正常运行的,可以用上一行再倒入使用
    19. docker export my_container_id > my_container.tar 导出既有容器

    容器

    1. # 生命周期
    2. docker create 创建容器但不启动它。
    3. docker rename 用于重命名容器。
    4. docker run 一键创建并同时启动该容器。docker run --help可以查看帮助(得到的内容第一列等同于同行第二列,否则用第二列名字),-d后台运行并且打印id,-p端口转发
    5. docker run -d -p 9011:80 onlyoffice/documentserver
    6. docker rm id 删除容器。id通过docker ps -a查询
    7. docker update 调整容器的资源限制。
    8. # 启动和停止
    9. docker start 启动已存在的容器。
    10. docker stop 停止运行中的容器,stop后加容器id(可以通过docker ps获得)
    11. docker restart 容器id 重启容器。
    12. docker pause 暂停运行中的容器,将其「冻结」在当前状态。
    13. docker unpause 结束容器暂停状态。
    14. docker wait 阻塞地等待某个运行中的容器直到停止。
    15. docker kill 向运行中的容器发送 SIGKILL 指令。
    16. docker attach 连接到运行中的容器。
    17. # 信息
    18. docker ps 查看运行中的所有容器。
    19. docker ps -a 将显示所有容器,包括运行中和已停止的。
    20. docker logs 从容器中读取日志。(你也可以使用自定义日志驱动,不过在 1.10 中,它只支持json-file和journald)。
    21. docker inspect 查看某个容器的所有信息(包括 IP 地址)。
    22. docker events 从容器中获取事件 (events)。
    23. docker port 查看容器的公开端口。
    24. docker top 查看容器中活动进程。
    25. docker stats 查看容器的资源使用量统计信息。
    26. docker stats --all 同样将显示所有容器,默认仅显示运行中的容器。
    27. docker diff 查看容器文件系统中存在改动的文件。
    28. # 导入、导出
    29. docker cp 在容器和本地文件系统之间复制文件或目录。
    30. docker export 将容器的文件系统打包为归档文件流 (tarball archive stream) 并输出至标准输出 (STDOUT)。
    31. # 执行命令
    32. docker exec 在容器内执行命令。

    网络(Networks)

    1. # 生命周期
    2. docker network create
    3. docker network rm
    4. # 其它信息
    5. docker network ls
    6. docker network inspect
    7. # 建立连接
    8. docker network connect
    9. docker network disconnect

     卷标(Volumes)

    1. # 生命周期
    2. docker volume create
    3. docker volume rm
    4. # 信息
    5. docker volume ls
    6. docker volume inspect

    其他

    1. 清理
    2. 最新的 数据管理命令 已在 Docker 1.13 实现:
    3. docker system prune
    4. docker volume prune
    5. docker network prune
    6. docker container prune
    7. docker image prune
    8. df 命令
    9. docker system df 将显示当前 Docker 各部分占用的磁盘空间。
    10. Heredoc 声明 Docker 容器
    11. docker build -t htop - << EOFFROM alpineRUN apk --no-cache add htopEOF
    12. 最近一次的容器 ID
    13. alias dl='docker ps -l -q'docker run ubuntu echo hello worlddocker commit $(dl) helloworld
    14. 带命令的提交(需要 Dockerfile)
    15. docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' $(dl) postgres
    16. 获取 IP 地址
    17. docker inspect $(dl) | grep -wm1 IPAddress | cut -d '"' -f 4
    18. 或使用 jq:
    19. docker inspect $(dl) | jq -r '.[0].NetworkSettings.IPAddress'
    20. 或使用 go 模板:
    21. docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container_name>
    22. 或在通过 Dockerfile 构建镜像时,通过构建参数 (build argument) 传入:
    23. DOCKER_HOST_IP=`ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1`echo DOCKER_HOST_IP = $DOCKER_HOST_IPdocker build \ --build-arg ARTIFACTORY_ADDRESS=$DOCKER_HOST_IP -t sometag \ some-directory/
    24. 获取端口映射
    25. docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' <containername>
    26. 通过正则匹配容器
    27. for i in $(docker ps -a | grep "REGEXP_PATTERN" | cut -f1 -d" "); do echo $i; done`
    28. 获取环境变量配置
    29. docker run --rm ubuntu env
    30. 强行终止运行中的容器
    31. docker kill $(docker ps -q)
    32. 删除所有容器(强行删除!无论容器运行或停止)
    33. docker rm -f $(docker ps -qa)
    34. 删除旧容器
    35. docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
    36. 删除已停止的容器
    37. docker rm -v `docker ps -a -q -f status=exited`
    38. 停止并删除容器
    39. docker stop $(docker ps -aq) && docker rm -v $(docker ps -aq)
    40. 删除无用 (dangling) 的镜像
    41. docker rmi $(docker images -q -f dangling=true)
    42. 删除所有镜像
    43. docker rmi $(docker images -q)
    44. 删除无用 (dangling) 的卷标
    45. Docker 1.9 版本起:
    46. docker volume rm $(docker volume ls -q -f dangling=true)
    47. 1.9.0 中,参数 dangling=false 居然 没 用 - 它会被忽略然后列出所有的卷标。
    48. 查看镜像依赖
    49. docker images -viz | dot -Tpng -o docker.png
    50. Docker 容器瘦身
    51. 在某层 (RUN layer) 清理 APT
    52. 这应当和其他 apt 命令在同一层中完成。 否则,前面的层将会保持原有信息,而你的镜像则依旧臃肿。
    53. RUN {apt commands} \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    54. 压缩镜像
    55. ID=$(docker run -d image-name /bin/bash)docker export $ID | docker import – flat-image-name
    56. 备份
    57. ID=$(docker run -d image-name /bin/bash)(docker export $ID | gzip -c > image.tgz)gzip -dc image.tgz | docker import - flat-image-name
    58. 监视运行中容器的系统资源利用率
    59. 检查某个容器的 CPU、内存以及网络 I/O 使用情况,你可以:
    60. docker stats <container>
    61. 按 ID 列出所有容器:
    62. docker stats $(docker ps -q)
    63. 按名称列出所有容器:
    64. docker stats $(docker ps --format '{{.Names}}')
    65. 按指定镜像名称列出所有容器:
    66. docker ps -a -f ancestor=ubuntu

    常用功能

    1. 查看容器id
    2. docker ps
    3. 查看所有容器id
    4. docker ps -a
    5. 删除容器
    6. docker rm container_id
    7. 查看镜像
    8. docker images
    9. 删除镜像
    10. docker rmi image_id
    11. 更改onlyoffice配置
    12. docker exec 容器id /bin/bash nano /etc/onlyoffice/documentserver/default.json
    13. docker exec 9019bce34a84 nano /etc/onlyoffice/documentserver/default.json
    14. docker exec f5ea2621d95f cat /etc/onlyoffice/documentserver/local.json
    15. 更改配置后重启镜像ID
    16. docker restart 9019bce34a84
    17. 将本地容器打包后发布版本到服务器,从服务器下载使用。先登录对应服务器
    18. docker tag image_id 名字:镜像版本号
    19. docker push 名字:镜像版本号
    20. docker pull nginx:1.17.8(名字:镜像版本号)
    21. 虚悬镜像(误操作产生,一般有就删掉)
    22. 查看(查询后repository和tag为none)
    23. docker image ls -f dangling=true
    24. 删除虚悬镜像
    25. docker image prune
    26. dockerfile将jar打包部署到docker中
    27. # 基础镜像使用java
    28. from java:8
    29. # 作者
    30. maintainer hgx
    31. # volume指定临时文件目录为/temp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
    32. volume /tmp
    33. # 将jar包添加到容器中并更名
    34. add 远来的jar文件名 新的jar文件名
    35. # 运行jar包
    36. run bash -c 'pwd'
    37. entrypoint ["java", "-jar", "/xx.jar(新的jar文件名)"]
    38. # 暴露端口作为微服务
    39. expose 6666
    40. dockerfile和java文件放在同一目录去执行构建,打包成镜像文件
    41. docker build -t xx:版本号 .
  • 相关阅读:
    EncodedResource类解读
    ocr人脸识别是什么原理,ocr的工作原理是什么
    matlab小波变换、离散小波变换函数使用
    DHCP服务详解
    关于JVM参数-XXSurvivorRatio的理解
    【OpenStack云平台】网络控制节点 HA 集群配置
    初识数据结构-B树
    Google单元测试sample分析(二)
    密码学基础——加密与哈希,凯撒密码,对称加密与非对称加密以及Diffie-Hellman密码交换协议
    基于Php美妆商城
  • 原文地址:https://blog.csdn.net/qq_17242837/article/details/127939183