Docker为什么会出现

开发中的困扰

在日常开发中,想必都有这个场景:

测试:产品发版后又出问题了。

运维:我是按照开发给的包部署的,我排查下。

开发:我本地没问题的呀。

一款产品,开发生产两套环境,运维人员环境配置费时费力,且很容易出现问题。

且出现问题后,开发人员和运维人员排查问题都是十分痛苦的,因为一个产品往往涉及到诸多环境,产生影响的因素实在太多。

寻求解决

这时候不禁会想,要是开发人员能够把代码环境一块提供,运维人员拿来就直接运行,这个问题就迎刃而解了。

这就是所谓开发即运维,既能保证系统稳定性,也能提高部署效率。

为解决这一问题,Docker 横空出世!

Docker的历史

2010年,几个搞 IT 的人,在美国成立一家公司 dotCloud

一开始他们是做一些 PaaS 的云计算服务。

他们将自己的容器化技术命名为 Docker

Docker 基于 Go 语言开发。

Docker 刚刚诞生的时候,并没有引起行业的注意,这也导致 dotCloud 快要经营不下去。

为了公司能生存,他们决定开源,以寻求更多的关注。

2013 年,创始人将 Docker 开源,没想到一下子爆火!刚开源的时候,每个月都会更新一个版本。

于是,2014 年 4 月 9 日,Docker 1.0 发布。

Docker介绍

Docker 概述   常用命令 - 图1

官网:https://www.docker.com/

官方文档:https://docs.docker.com/docker-for-windows/

命令查阅:https://docs.docker.com/engine/reference/run/

仓库:https://hub.docker.com/

Docker 是一个开源的应用容器引擎。

Docker 的思想来自于集装箱,彼此之间隔离。

Docker 通过隔离机制,可以将服务器利用到极致。

Docker 容器完全使用沙箱机制,相互之间不会有任何接口。

虚拟机结构

Docker 概述   常用命令 - 图2

  • 名称解释:
    • kernel: 系统内核
    • lib: 运行库 (多个APP 共享系统运行库)
  • 它有以下明显的缺点:
    • 资源占用多。启动虚拟机非常占内存,对电脑资源有不小的占用。
    • 冗余步骤多。启动虚拟机后,还需要进行一些步骤才能进入系统,效率比较低。
    • 启动很慢。由于虚拟机是虚拟化一整个系统,其启动时间会比较缓慢,一般都需要几分钟。

DevOps (开发, 运维)

  • 应用更快速的交付和部署
    • 传统: 一堆帮助文档, 安装程序
    • Docker: 打包镜像发布测试, 一键运行
  • 更便捷的升级和扩缩容
    • 使用了Docker 之后, 部署应用就和搭积木一样
    • 把项目打包为一个镜像, 直接拓展服务, 实现负载均衡
  • 更简单的系统运维:
    • 在容器化之后, 开发和测试环境都是高度一致的
  • 更高效的计算资源利用:
    • Docker 是内核级别的虚拟化, 可以在一个物理机上可以运行很多的容器实例, 服务器的性能可以被压榨到极致

Docker底层原理

Docker 是一个 Client-Server 结构的系统。

Docker 的守护进程在主机上,通过Socket从客户端访问。

Docker Server 接受 Docker-Client 的指令。

Docker 概述   常用命令 - 图3

  • 镜像(image):Docker 镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器。
  • 容器(container):容器可以理解为一个简易的系统。
  • 仓库(repository):存放镜像的地方。

Docker和虚拟机的区别

Docker所使用的容器化技术本质上属于虚拟化技术

提到虚拟化技术,最有名的就是虚拟机技术

虚拟机原理示意图

Docker 概述   常用命令 - 图4

容器化技术原理示意图

Docker 概述   常用命令 - 图5

由此可以看出,它不是模拟的完整的操作系统,而是基于操作系统封装成了一小个运行环境。

Docker 是怎么工作的?

  • Docker 是一个client-server 结构的系统, Docker 的守护进程运行在主机上, 通过Socket 从客户端访问
  • DockerServer 接收到Docker-Client 的指令, 就会执行这个命令

区别

传统虚拟机 Docker
虚拟内容 硬件 + 完整的操作系统 + 软件 APP + LIB
大小 笨重,通常几个 G 轻便几个 M 或 KB
启动速度 慢,分钟级 快,秒级
运行形态 运行于Hypervisor 上 直接运行在宿主机内核上
并发性 一台宿主机上十几个, 最多几十个 上百个, 甚至数百上千个
性能 逊于宿主机 接近宿主机本地进程

Docker 为什么比 VM 快

Docker 概述   常用命令 - 图6

  • Docker 有着比 VM 更少的抽象层 (不需要模拟硬件环境再去跑GuestOS, 只需要Docker Engine 服务就可以运行容器)
  • Docker 主要用的是宿主机的内核,而 VM 需要 Guest OS
  • 新建一个容器的时候,Docker 不需要像 VM 一样重新加载一个操作系统内核,避免了引导的过程 (共享内核, 减少开销)

Docker安装

环境查看

  1. uname -r
  2. # 确认linux 系统内核版本在3.0 以上
  3. 3.10.0-957.el7.x86_64
  1. cat /etc/os-release
  2. # 确认linux 系统环境
  3. NAME="CentOS Linux"
  4. VERSION="7 (Core)"
  5. ID="centos"
  6. ID_LIKE="rhel fedora"
  7. VERSION_ID="7"
  8. PRETTY_NAME="CentOS Linux 7 (Core)"
  9. ANSI_COLOR="0;31"
  10. CPE_NAME="cpe:/o:centos:centos:7"
  11. HOME_URL="https://www.centos.org/"
  12. BUG_REPORT_URL="https://bugs.centos.org/"
  13. CENTOS_MANTISBT_PROJECT="CentOS-7"
  14. CENTOS_MANTISBT_PROJECT_VERSION="7"
  15. REDHAT_SUPPORT_PRODUCT="centos"
  16. REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

  1. #1. 卸载旧版本
  2. sudo yum remove docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-common \
  6. docker-latest \
  7. docker-latest-logrotate \
  8. docker-logrotate \
  9. docker-engine
  1. #2. 安装工具包
  2. yum install -y yum-utils
  1. #3. 配置镜像仓库
  2. yum-config-manager \
  3. --add-repo \
  4. #https://download.docker.com/linux/centos/docker-ce.repo #该地址是docker 官方提供的镜像仓库地址, 是国外的, 下载很慢
  5. http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #使用阿里云镜像仓库, 要快很多
  1. #4. 更新yum 软件包索引
  2. yum makecache fast
  1. #5. 安装docker 引擎和containerd, 默认安装最新版 (ce 代表社区版, ee 代表企业版)
  2. yum install docker-ce docker-ce-cli containerd.io
  3. # 或者安装指定版本
  4. # 查看指定版本
  5. yum list docker-ce --showduplicates | sort -r
  6. docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable
  7. docker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stable
  8. docker-ce.x86_64 3:20.10.7-3.el7 docker-ce-stable
  9. docker-ce.x86_64 3:20.10.6-3.el7 docker-ce-stable
  10. docker-ce.x86_64 3:20.10.5-3.el7 docker-ce-stable
  11. docker-ce.x86_64 3:20.10.4-3.el7 docker-ce-stable
  12. docker-ce.x86_64 3:20.10.3-3.el7 docker-ce-stable
  13. docker-ce.x86_64 3:20.10.2-3.el7 docker-ce-stable
  14. ....
  15. # 安装指定版本
  16. yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  1. #6. 启动docker
  2. systemctl start docker
  1. #7. 查看docker 是否启动成功
  2. docker version
  3. # 出现以下结果代表启动成功
  4. Client: Docker Engine - Community
  5. Version: 20.10.12
  6. API version: 1.41
  7. Go version: go1.16.12
  8. Git commit: e91ed57
  9. Built: Mon Dec 13 11:45:41 2021
  10. OS/Arch: linux/amd64
  11. Context: default
  12. Experimental: true
  1. #8. 测试hello world
  2. docker run hello-world
  3. # 成功启动后, 会返回以下信息
  4. Hello from Docker!
  5. This message shows that your installation appears to be working correctly.
  6. To generate this message, Docker took the following steps:
  7. 1. The Docker client contacted the Docker daemon.
  8. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
  9. (amd64)
  10. 3. The Docker daemon created a new container from that image which runs the
  11. executable that produces the output you are currently reading.
  12. 4. The Docker daemon streamed that output to the Docker client, which sent it
  13. to your terminal.
  14. To try something more ambitious, you can run an Ubuntu container with:
  15. $ docker run -it ubuntu bash
  16. Share images, automate workflows, and more with a free Docker ID:
  17. https://hub.docker.com/
  18. For more examples and ideas, visit:
  19. https://docs.docker.com/get-started/
  1. #9. 查看下载的hello-world 镜像
  2. docker images
  3. # 返回以下镜像列表
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. hello-world latest feb5d9fea6a5 3 months ago 13.3kB
  6. nacos/nacos-server 2.0.0 826b878af26e 10 months ago 975MB

卸载docker

  1. #卸载docker
  2. #卸载安装包
  3. yum remove docker-ce docker-ce-cli containerd.io
  4. #删除目录
  5. rm -rf /var/lib/docker #该目录为docker 的默认工作目录
  6. rm -rf /var/lib/containerd

阿里云镜像加速

  1. 登录阿里云, 找到容器镜像服务

image-20220119101735546.png

  1. 按照提示操作即可:

image-20220119134913831.png

Docker run 命令运行流程图

image-20220119135548022.png

Docker命令

帮助命令

  1. docker 命令 --help #万能命令
  2. docker version #显示docker 的版本信息
  3. docker info #显示docker 的系统信息, 包括镜像和容器的数量

官方帮助文档的地址: https://docs.docker.com/engine/reference/commandline

镜像命令

docker images

查看所有本地的主机上的镜像

  1. # 输入查看案所有本地的主机上的镜像
  2. docker images
  3. # 会返回如下列表
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. hello-world latest feb5d9fea6a5 3 months ago 13.3kB
  6. nacos/nacos-server 2.0.0 826b878af26e 10 months ago 975MB
  7. # 解释
  8. Repository: 镜像的仓库源
  9. TAG: 镜像的标签
  10. IMAGE ID: 镜像的id
  11. CREATED: 镜像的创建时间
  12. SIZE: 镜像的大小
  13. #可选项:
  14. Options:
  15. -a, --all Show all images (default hides intermediate images) #列出所有镜像
  16. --digests Show digests
  17. -f, --filter filter Filter output based on conditions provided
  18. --format string Pretty-print images using a Go template
  19. --no-trunc Don't truncate output
  20. -q, --quiet Only show image IDs #只显示镜像的id

docker search 搜索镜像

  1. # 使用docker search 命令搜索mysql 镜像
  2. docker search mysql
  3. # 会返回如下列表
  4. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  5. mysql MySQL is a widely used, open-source relation 11984 [OK]
  6. mariadb MariaDB Server is a high performing open sou 4589 [OK]
  7. mysql/mysql-server Optimized MySQL Server Docker images. Create 898 [OK]
  8. percona Percona Server is a fork of the MySQL relati 567 [OK]
  9. phpmyadmin phpMyAdmin - A web interface for MySQL and M 428 [OK]
  10. centos/mysql-57-centos7 MySQL 5.7 SQL database server 92
  11. mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr 90
  12. centurylink/mysql Image containing mysql. Optimized to be link 59 [OK]
  13. ...
  14. # 可选项, 通过收藏来过滤
  15. --filter=stars=3000 #搜索出来的镜像就是STARS 大于3000 的
  16. # 搜索收藏大于3000 的mysql 镜像
  17. docker search mysql --filter=STARS=3000
  18. # 会返回如下列表
  19. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  20. mysql MySQL is a widely used, open-source relation 11984 [OK]
  21. mariadb MariaDB Server is a high performing open sou 4589 [OK]

下载命令

docker pull

下载镜像

  1. # 使用pull 命令下载mysql 镜像
  2. # docker pull 镜像名[:tag] 用于指定下载的版本, 默认使用最新版
  3. docker pull mysql
  4. # 系统产生如下提示
  5. Using default tag: latest #如果不写tag, 默认就是latest
  6. latest: Pulling from library/mysql
  7. 72a69066d2fe: Pull complete #分层下载, docker image 的核心, 联合文件系统
  8. 93619dbc5b36: Pull complete
  9. 99da31dd6142: Pull complete
  10. 626033c43d70: Pull complete
  11. 37d5d7efb64e: Pull complete
  12. ac563158d721: Pull complete
  13. d2ba16033dad: Pull complete
  14. 688ba7d5c01a: Pull complete
  15. 00e060b6d11d: Pull complete
  16. 1c04857f594f: Pull complete
  17. 4d7cfa90e6ea: Pull complete
  18. e0431212d27d: Pull complete
  19. Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #签名
  20. Status: Downloaded newer image for mysql:latest
  21. docker.io/library/mysql:latest # 真实地址
  22. # 以下两条命令等价
  23. docker pull mysql
  24. docker pull docker.io/library/mysql:latest
  25. # 指定版本下载
  26. # 指定下载mysql 的5.7 版本
  27. docker pull mysql:5.7
  28. # 分层下载, 由于5.7 与最新版的若干镜像分层是一致的, docker pull 命令执行只会下载不同的部分, 用于节省磁盘和网络带宽, 原理是linux 的联合文件系统
  29. 5.7: Pulling from library/mysql
  30. 72a69066d2fe: Already exists
  31. 93619dbc5b36: Already exists
  32. 99da31dd6142: Already exists
  33. 626033c43d70: Already exists
  34. 37d5d7efb64e: Already exists
  35. ac563158d721: Already exists
  36. d2ba16033dad: Already exists
  37. 0ceb82207cd7: Pull complete
  38. 37f2405cae96: Pull complete
  39. e2482e017e53: Pull complete
  40. 70deed891d42: Pull complete
  41. Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
  42. Status: Downloaded newer image for mysql:5.7
  43. docker.io/library/mysql:5.7

删除镜像

docker rmi

删除镜像

  1. # 根据镜像ID 删除镜像
  2. docker rmi -f c20987f18b13
  3. # 会产生以下提示
  4. # 由于下载只下载了与mysql 最新版有区别的镜像分层, 删除也只删除了与mysql 最新版有区别的镜像分层
  5. Untagged: mysql:5.7
  6. Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
  7. Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
  8. Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
  9. Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
  10. Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
  11. Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
  12. # 删除符合查询条件的镜像
  13. # docker images -aq 会查询出所有镜像的ID, 然后rmi 命令会根据镜像ID 循环删除
  14. # $() 用于包含表达式
  15. docker rmi -f $(docker images -aq)
  16. # 删除指定ID 的镜像
  17. docker rmi -f 镜像id
  18. # 删除多个ID 的镜像
  19. docker rmi -f 镜像id 镜像id 镜像id ...
  20. # 删除全部的镜像
  21. docker rmi -f $(docker images -aq)

容器命令

说明: 只有下载了镜像才能创建容器

案例: 下载CentOS 7 系统

  1. 新建容器并启动
    ```shell

    下载centos

    docker pull centos

启动

docker run [可选参数] image

参数说明

—name=”Name” #容器名字 -d #后台方式运行 -it #使用交互方式运行, 进入容器查看内容 -p #指定容器的端口

  1. #使用方式如下:
  2. 1. -p ip:主机端口:容器端口
  3. 2. -p 主机端口:容器端口 (映射关系)
  4. 3. -p 容器端口
  5. 容器端口

-P #随机指定端口

测试, 启动并进入容器

docker run -it centos /bin/bash

会产生如下提示:

[root@b08ef9cc3be6 /]# #说明已经进入了容器 [root@b08ef9cc3be6 /]# ls #查看容器内的centos, 这是一个基础版本, 很多命令不完善 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

退出容器(从容器中退回主机)

exit

  1. <a name="efeff7c8"></a>
  2. ## 列出所有的运行容器
  3. ```shell
  4. #docker ps 命令
  5. #列出当前正在运行的容器
  6. -a #列出当前正在运行的容器 + 带出历史运行过的容器
  7. -n=? #显示最近创建的容器
  8. -q #只显示容器的编号
  9. #显示当前正在运行的容器
  10. docker ps
  11. #会产生如下容器信息
  12. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  13. #显示当前正在运行的容器 + 历史运行过的容器
  14. docker ps -a
  15. #会产生如下容器信息
  16. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  17. b08ef9cc3be6 centos "/bin/bash" 4 minutes ago Exited (127) About a minute ago sharp_euler
  18. 9f8a3ad5b0e9 mysql "docker-entrypoint.s…" About an hour ago Exited (1) About an hour ago practical_sanderson
  19. 3c60c457339a centos "/bin/bash" 25 hours ago Exited (0) 25 hours ago hungry_solomon
  20. 590baa543e53 hello-world "/hello" 31 hours ago Exited (0) 31 hours ago upbeat_shockley
  21. 4e76bd27f241 hello-world "/hello" 2 days ago Exited (0) 2 days ago fervent_hodgkin
  22. 70e487ddcdd8 nacos/nacos-server:2.0.0 "bin/docker-startup.…" 8 months ago Exited (137) 4 weeks ago nacos-standalone
  23. #显示容器ID
  24. docker ps -aq
  25. #会产生如下容器ID 列表
  26. b08ef9cc3be6
  27. 9f8a3ad5b0e9
  28. 3c60c457339a
  29. 590baa543e53
  30. 4e76bd27f241
  31. 70e487ddcdd8

退出容器

  1. exit #直接容器停止并退出
  2. Ctrl + P + Q #退出容器且不停止运行

删除容器

  1. docker rm 容器id #删除指定的容器, 不能删除正在运行的容器, 如果要强制删除, 使用rm -f
  2. docker rm -f $(docker ps -aq) #删除所有的容器
  3. docker ps -aq | xargs docker rm #使用管道命令删除所有的容器

启动和停止容器的操作

  1. docker start 容器id #启动容器
  2. docker restart 容器id #重启重启
  3. docker stop 容器id #停止当前正在运行的容器
  4. docker kill 容器id #强制停止当前容器

常用其他命令

后台启动

  1. #命令 docker run -d 镜像名
  2. docker run -d centos
  3. #问题docker ps, 发现centos 停止了
  4. #常见的坑: docker 容器使用后台运行, 就必须要有一个前台进程, docker 发现没有应用, 就会自动停止
  5. #容器启动后, 发现自己没有提供服务, 就会立刻停止, 就是没有程序了

查看日志

  1. #查看所有日志 (没有--tail 表示查看所有日志)
  2. docker logs -tf 容器ID
  3. #可以自己编写shell 脚本打印日志
  4. #-c 表示往容器中写命令
  5. docker run -d centos /bin/sh -c "while true;do echo ks;sleep 1;done"
  6. #显示最近10 条日志
  7. docker logs -tf --tail 日志条数 容器ID
  8. #可选参数:
  9. -tf: t(timestamp) 加上事件戳, f(follow) 表示流式显示
  10. --tail 显示条数: 显示指定条数的日志

查看容器中进程信息

  1. #根据容器ID 查看进程信息
  2. docker top 容器ID
  3. #查看正在运行的容器
  4. docker ps
  5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6. 9d53b9244581 centos "/bin/bash" 29 minutes ago Up 29 minutes unruffled_dewdney
  7. #根据容器ID 查看进程信息
  8. docker top 9d53b9244581
  9. UID PID PPID C STIME TTY TIME CMD
  10. root 12041 12019 0 14:14 pts/0 00:00:00 /bin/bash

查看镜像元数据

  1. # 查看镜像元数据
  2. docker inspect 容器ID
  3. #查看正在运行的容器
  4. docker ps
  5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6. 9d53b9244581 centos "/bin/bash" 40 minutes ago Up 39 minutes unruffled_dewdney
  7. #查看容器元数据
  8. docker inspect 9d53b9244581
  9. [
  10. {
  11. "Id": "9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680",
  12. "Created": "2022-01-21T06:14:01.978122813Z",
  13. "Path": "/bin/bash",
  14. "Args": [],
  15. "State": {
  16. "Status": "running",
  17. "Running": true,
  18. "Paused": false,
  19. "Restarting": false,
  20. "OOMKilled": false,
  21. "Dead": false,
  22. "Pid": 12041,
  23. "ExitCode": 0,
  24. "Error": "",
  25. "StartedAt": "2022-01-21T06:14:02.462675053Z",
  26. "FinishedAt": "0001-01-01T00:00:00Z"
  27. },
  28. "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
  29. "ResolvConfPath": "/var/lib/docker/containers/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680/resolv.conf",
  30. "HostnamePath": "/var/lib/docker/containers/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680/hostname",
  31. "HostsPath": "/var/lib/docker/containers/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680/hosts",
  32. "LogPath": "/var/lib/docker/containers/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680-json.log",
  33. "Name": "/unruffled_dewdney",
  34. "RestartCount": 0,
  35. "Driver": "overlay2",
  36. "Platform": "linux",
  37. "MountLabel": "",
  38. "ProcessLabel": "",
  39. "AppArmorProfile": "",
  40. "ExecIDs": null,
  41. "HostConfig": {
  42. "Binds": null,
  43. "ContainerIDFile": "",
  44. "LogConfig": {
  45. "Type": "json-file",
  46. "Config": {}
  47. },
  48. "NetworkMode": "default",
  49. "PortBindings": {},
  50. "RestartPolicy": {
  51. "Name": "no",
  52. "MaximumRetryCount": 0
  53. },
  54. "AutoRemove": false,
  55. "VolumeDriver": "",
  56. "VolumesFrom": null,
  57. "CapAdd": null,
  58. "CapDrop": null,
  59. "CgroupnsMode": "host",
  60. "Dns": [],
  61. "DnsOptions": [],
  62. "DnsSearch": [],
  63. "ExtraHosts": null,
  64. "GroupAdd": null,
  65. "IpcMode": "private",
  66. "Cgroup": "",
  67. "Links": null,
  68. "OomScoreAdj": 0,
  69. "PidMode": "",
  70. "Privileged": false,
  71. "PublishAllPorts": false,
  72. "ReadonlyRootfs": false,
  73. "SecurityOpt": null,
  74. "UTSMode": "",
  75. "UsernsMode": "",
  76. "ShmSize": 67108864,
  77. "Runtime": "runc",
  78. "ConsoleSize": [
  79. 0,
  80. 0
  81. ],
  82. "Isolation": "",
  83. "CpuShares": 0,
  84. "Memory": 0,
  85. "NanoCpus": 0,
  86. "CgroupParent": "",
  87. "BlkioWeight": 0,
  88. "BlkioWeightDevice": [],
  89. "BlkioDeviceReadBps": null,
  90. "BlkioDeviceWriteBps": null,
  91. "BlkioDeviceReadIOps": null,
  92. "BlkioDeviceWriteIOps": null,
  93. "CpuPeriod": 0,
  94. "CpuQuota": 0,
  95. "CpuRealtimePeriod": 0,
  96. "CpuRealtimeRuntime": 0,
  97. "CpusetCpus": "",
  98. "CpusetMems": "",
  99. "Devices": [],
  100. "DeviceCgroupRules": null,
  101. "DeviceRequests": null,
  102. "KernelMemory": 0,
  103. "KernelMemoryTCP": 0,
  104. "MemoryReservation": 0,
  105. "MemorySwap": 0,
  106. "MemorySwappiness": null,
  107. "OomKillDisable": false,
  108. "PidsLimit": null,
  109. "Ulimits": null,
  110. "CpuCount": 0,
  111. "CpuPercent": 0,
  112. "IOMaximumIOps": 0,
  113. "IOMaximumBandwidth": 0,
  114. "MaskedPaths": [
  115. "/proc/asound",
  116. "/proc/acpi",
  117. "/proc/kcore",
  118. "/proc/keys",
  119. "/proc/latency_stats",
  120. "/proc/timer_list",
  121. "/proc/timer_stats",
  122. "/proc/sched_debug",
  123. "/proc/scsi",
  124. "/sys/firmware"
  125. ],
  126. "ReadonlyPaths": [
  127. "/proc/bus",
  128. "/proc/fs",
  129. "/proc/irq",
  130. "/proc/sys",
  131. "/proc/sysrq-trigger"
  132. ]
  133. },
  134. "GraphDriver": {
  135. "Data": {
  136. "LowerDir": "/var/lib/docker/overlay2/d4466b3a10622c6089de12d0084e6e0bc585a38123fd64fd60e5c0d1405498ac-init/diff:/var/lib/docker/overlay2/063cb712918c2787a420328900e64d7d7323fd382d76475288028b02a053a5fc/diff",
  137. "MergedDir": "/var/lib/docker/overlay2/d4466b3a10622c6089de12d0084e6e0bc585a38123fd64fd60e5c0d1405498ac/merged",
  138. "UpperDir": "/var/lib/docker/overlay2/d4466b3a10622c6089de12d0084e6e0bc585a38123fd64fd60e5c0d1405498ac/diff",
  139. "WorkDir": "/var/lib/docker/overlay2/d4466b3a10622c6089de12d0084e6e0bc585a38123fd64fd60e5c0d1405498ac/work"
  140. },
  141. "Name": "overlay2"
  142. },
  143. "Mounts": [],
  144. "Config": {
  145. "Hostname": "9d53b9244581",
  146. "Domainname": "",
  147. "User": "",
  148. "AttachStdin": false,
  149. "AttachStdout": false,
  150. "AttachStderr": false,
  151. "Tty": true,
  152. "OpenStdin": true,
  153. "StdinOnce": false,
  154. "Env": [
  155. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  156. ],
  157. "Cmd": [
  158. "/bin/bash"
  159. ],
  160. "Image": "centos",
  161. "Volumes": null,
  162. "WorkingDir": "",
  163. "Entrypoint": null,
  164. "OnBuild": null,
  165. "Labels": {
  166. "org.label-schema.build-date": "20210915",
  167. "org.label-schema.license": "GPLv2",
  168. "org.label-schema.name": "CentOS Base Image",
  169. "org.label-schema.schema-version": "1.0",
  170. "org.label-schema.vendor": "CentOS"
  171. }
  172. },
  173. "NetworkSettings": {
  174. "Bridge": "",
  175. "SandboxID": "d7e66d850f67d6ec285af68b5dd8a91f9f9da053b6f34ff73f05680aac6156dd",
  176. "HairpinMode": false,
  177. "LinkLocalIPv6Address": "",
  178. "LinkLocalIPv6PrefixLen": 0,
  179. "Ports": {},
  180. "SandboxKey": "/var/run/docker/netns/d7e66d850f67",
  181. "SecondaryIPAddresses": null,
  182. "SecondaryIPv6Addresses": null,
  183. "EndpointID": "2fcc11d02ac215ebd2dd8c1960aa9d0cb0b951ab7818b59e03aefb7c0b7269e3",
  184. "Gateway": "172.17.0.1",
  185. "GlobalIPv6Address": "",
  186. "GlobalIPv6PrefixLen": 0,
  187. "IPAddress": "172.17.0.2",
  188. "IPPrefixLen": 16,
  189. "IPv6Gateway": "",
  190. "MacAddress": "02:42:ac:11:00:02",
  191. "Networks": {
  192. "bridge": {
  193. "IPAMConfig": null,
  194. "Links": null,
  195. "Aliases": null,
  196. "NetworkID": "ee8bc807558a08566907ee93ae088a2d0a689ab4c46f3feaa079f963314ee269",
  197. "EndpointID": "2fcc11d02ac215ebd2dd8c1960aa9d0cb0b951ab7818b59e03aefb7c0b7269e3",
  198. "Gateway": "172.17.0.1",
  199. "IPAddress": "172.17.0.2",
  200. "IPPrefixLen": 16,
  201. "IPv6Gateway": "",
  202. "GlobalIPv6Address": "",
  203. "GlobalIPv6PrefixLen": 0,
  204. "MacAddress": "02:42:ac:11:00:02",
  205. "DriverOpts": null
  206. }
  207. }
  208. }
  209. }
  210. ]

进入当前正在运行的容器

# 通常容器都是使用后台方式运行的, 需要进入容器, 修改一些配置
# 方式1: 根据容器ID 进入正在运行的容器
docker exec -it 容器id bashShell

# 查看正在运行的容器
docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
9d53b9244581   centos    "/bin/bash"   40 minutes ago   Up 39 minutes             unruffled_dewdney

# 根据容器ID 进入正在运行的容器
docker exec -it 9d53b9244581 /bin/bash
[root@9d53b9244581 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 方式2: 
docker attach 容器id

# 查看正在运行的容器
docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
9d7b0f83c3b6   centos    "/bin/bash"   11 seconds ago   Up 11 seconds             zen_jepsen

# 根据容器ID 进入正在运行的容器
docker attach 9d7b0f83c3b6
[root@9d7b0f83c3b6 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

#docker exec: 进入容器后开启一个新的终端, 可以在里面操作
#docker attach: 进入容器正在执行的终端, 不会启动新的终端

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的的主机路径

# 查看正在运行的容器
docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
9d7b0f83c3b6   centos    "/bin/bash"   11 seconds ago   Up 11 seconds             zen_jepsen

# 进入正在运行的容器
[root@localhost ~]# docker attach 9d7b0f83c3b6
[root@9d7b0f83c3b6 /]# cd /home
[root@9d7b0f83c3b6 home]# ls
# 在容器内新建一个文件
[root@9d7b0f83c3b6 home]# touch test.java
# 此时退出该容器, 容器停止运行
[root@9d7b0f83c3b6 home]# exit
exit

# 查看所有运行的容器(包括已经关闭的)
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS                           PORTS     NAMES
9d7b0f83c3b6   centos    "/bin/bash"              9 minutes ago       Exited (0) 14 seconds ago                  zen_jepsen
9d53b9244581   centos    "/bin/bash"              About an hour ago   Exited (0) 11 minutes ago                  unruffled_dewdney
6c208ce77821   centos    "/bin/bash"              21 hours ago        Exited (255) About an hour ago             quirky_beaver
34e9f8a7c3fb   centos    "/bin/bash"              21 hours ago        Exited (0) 21 hours ago                    tender_payne
da7e642663b4   centos    "/bin/bash"              21 hours ago        Exited (0) 21 hours ago                    zen_goldstine
992577557e92   centos    "/bin/sh -c 'while t…"   22 hours ago        Exited (137) 22 hours ago                  heuristic_wright
acfd6a6173ec   centos    "/bin/sh -C 'while t…"   22 hours ago        Exited (127) 22 hours ago                  wonderful_clarke
6ad3dd1f53bf   centos    "/bin/bash"              22 hours ago        Exited (0) 22 hours ago                    vigorous_ellis
8c3a2907dc51   centos    "/bin/bash"              22 hours ago        Exited (0) 22 hours ago                    quirky_mccarthy
4ea3bfe9df4a   centos    "/bin/bash"              22 hours ago        Exited (137) 22 hours ago                  dazzling_johnson

# 从容器内拷贝文件到主机上(即使容器关闭也没有影响)
# 拷贝是一个手动过程, 未来使用-v 卷技术, 可以实现自动同步
[root@localhost ~]# docker cp 9d7b0f83c3b6:/home/test.java /home
[root@localhost ~]# ls
anaconda-ks.cfg  Desktop  Documents  Downloads  ks.java  Music  mysql80-community-release-el7-3.noarch.rpm  original-ks.cfg  Pictures  Public  sysbench  Templates  Videos

Docker 命令总结

Docker 概述   常用命令 - 图10

端口暴露

Docker 部署Nginx

#1. 搜索nginx 镜像
docker search nginx

#2. 下载nginx 镜像
docker pull nginx

#3. 启动nginx, 并将宿主机3344 端口映射到容器的80 端口, 后台运行, 容器名定义为nginx01
docker run -d --name nginx01 -p 3344:80 nginx

#4. 测试nginx
curl localhost:3344

Docker 部署Tomcat

# --rm: 表示用完即删
docker run -it --rm tomcat:9.0
#1. 下载tomcat 镜像
docker pull tomcat:9.0

#2. 启动tomcat, 并将宿主机3355 端口映射到容器的8080 端口, 后台运行, 容器名定义为tomcat02
docker run -d -p 3355:8080 --name tomcat02 tomcat

#3. 进入容器
docker exec -it tomcat02 /bin/bash

#4. 发现问题
#1. linux 命令少了(没有ll 命令); 2. 阿里云镜像的原因(没有webapps): 默认是最小的镜像, 所有不必要的都剔除掉, 保证最小可运行环境
#可以将webapps.dist 文件夹中的所有的文件复制到webapps 文件夹中, 这样就有项目部署到Tomcat 中了

部署ES + KIBANA

#ES 暴露的端口很多, ES 很耗内存, ES 的数据一般需要放置到安全目录, 挂载
#--net somenetwork: 网路配置
#-e "discovery.type=single-node": 集群配置, 默认为单节点
#tag: 版本号, 7.6.2
#以下是命令模版
docker run -d -name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag

#以下是启动示例:
Cdocker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#启动ES 后, 机器会变得非常卡
#docker stats: 查看docker 对硬件的使用情况
docker stats

#会产生以下提示: MEM USAGE 一列可以看到内存使用量, 这里ES 使用了1.252GB 的内存
CONTAINER           CPU %               MEM USAGE / LIMIT      MEM %               NET I/O             BLOCK I/O           PIDS
ff7e7575851b        0.15%               1.252 GiB / 15.5 GiB   8.08%               656 B / 656 B       0 B / 2.09 MB       51

#测试ES 是否成功运行
curl localhost:9200
{
  "name" : "ff7e7575851b",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "qyJSBA9TTn-7CHjJSvEc_w",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

#关闭ES
docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                            NAMES
ff7e7575851b        elasticsearch:7.6.2   "/usr/local/bin/do..."   22 minutes ago      Up 22 minutes       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch

docker stop ff7e7575851b

#增加内存的限制: 修改配置文件, -e 环境修改
#ES_JAVA_OPTS="-Xms64m -Xmx512m" 默认使用64m 内存, 最大扩展到512m 
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

#再次查看docker 对硬件的使用情况
docker stats

#会产生以下提示: 可以看到MEM USAGE 一列的内存使用量明显变小, 控制在512m 之内
CONTAINER           CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
bddb872a165c        1.19%               385 MiB / 15.5 GiB   2.43%               656 B / 656 B       0 B / 1.67 MB       47

KIBANA 如何连接ES?

  • 问题: 容器之间互相隔离, 如何连接对方?

image.png