Video Reference:最新快速掌握Docker实战课

1 为什么使用容器?

  1. 上线流程繁琐

开发 → 测试 → 申请资源 → 审批 → 部署 → 测试等环节

  1. 资源利用率低

普遍服务器利用率低,造成过多性能资源浪费

  1. 扩容/缩容不及时

业务高峰期扩容流程繁琐,上线不及时

已知的扩容:即遇到了六一八,双十一等电商节

未知的扩容:即管理员不知道业务的高峰期在什么时候,一般如何解决:

  • 业务机器增加承载量,可以应对一些突发。30%
  • 弹性伸缩
  1. 服务器环境臃肿

服务器越来越臃肿,对维护、迁移带来困难

  1. 环境不一致性

开发环境,测试环境,线上环境不一致

:::info 软件开发从传统的模型开始向微服务架构转变。Docker 优化或者解决了以上出现的问题。

:::

2 容器 VS 虚拟机

2.1 容器和虚拟机对比

传统的虚拟机能够基于虚拟化技术更加有效的利用硬件计算资源,可以实现云租户的隔离与资源共享。相比虚拟机来说,容器更轻、更快,但是作为一种新技术,容器的安全防护也与虚拟机所有不同。 容器与虚拟机具有相似的资源隔离和分配价值,但容器的作用不同,因为容器是虚拟化操作系统而不是硬件。容器更便携,更高效。

🐋1 最新快速掌握Docker实战课 - 图1

  • Hypervisor 是运行在物理硬件和操作系统的中间软件层,可以允许多个操作系统共享一个物理硬件。虚拟化的核心就是Hypervisor ,主要用来模拟多个虚拟机(包括CPU,内存,硬盘等硬件设备和 Guest OS子操作系统[二进制文件,各种lib库] )。Hypervisor 的实现方式有:VMwareESXi、微软的Hyper-V或者思杰的XenServer
    • 提升服务器资源利用率
    • 提供一个完全隔离的环境
  • Docker Engine 是Docker引擎,运行Docker容器。Docker 主要是用来实现应用以及其携带的基础环境的整体打包。
    • 容器提供一个基本的独立环境,实现隔离,资源限制。
    • 主要解决应用层面问题,应用快速部署,高效管理。

🐋1 最新快速掌握Docker实战课 - 图2

虚拟机(VM)是对物理硬件的抽象,将一台服务器转化为多台服务器。Hypervisor允许在一台机器上运行多个虚拟机。每个虚拟机都包含操作系统、应用程序、必要的二进制文件和库的完整副本,占用数十GB的空间。虚拟机启动速度也比较慢。 容器是应用程序层的一个抽象,将代码和依赖打包在一起。多个容器可以运行在同一台机器上,与其他容器共享操作系统内核,每个容器在用户空间中作为隔离的进程运行。容器比虚拟机占用更少的空间(容器镜像通常只有几十MB大小),可以处理更多的应用程序。

小总结

Container容器 VM虚拟机
启动速度 秒级 分钟级
运行性能 接近原生 5%左右损失
磁盘占用 MB GB
数量 成百上千 一般几十台
隔离性 进程级(操作系统级别的虚拟化) 系统级(更彻底,硬件级别的虚拟化)
操作系统 主要支持Linux,目前Windows也支持 几乎所有
封装速度 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统

2.2 容器逃逸

容器逃逸,是容器技术启用以来一直被关注的问题,甚至被认为是容器的首要安全问题。所谓“逃逸”,指的是“流氓”容器/虚拟机尝试突破隔离环境的限制,访问宿主系统或者在同一个系统上的同驻容器或虚拟机。从而造成敏感信息泄露,或者系统及服务发生DOS的行为。

🐋1 最新快速掌握Docker实战课 - 图3

但正是由于容器与宿主系统共享内核,因此容器与宿主机有着更大的接触面,隔离层次更少,更容易从容器内实施逃逸攻击。因此,如何解决容器逃逸安全风险,避免容器逃逸攻击带来的损失是容器安全中最为重要的一个问题。
参考文献:[ https://new.qq.com/rain/a/20210224A09POO00 ]

3 Docker 是什么

3.1 Docker 大致介绍

  1. 使用最广泛的开源容器引擎
  2. 一种操作系统级的虚拟化技术
  3. 依赖于Linux内核特性: Namespace(资源隔离)和Cgroups(资源限制)
  4. 一个简单的应用程序打包工具

3.2 Docker 设计目标

  • 提供简单的应用程序打包工具
  • 开发人员和运维人员职责逻辑分离
  • 多环境保持一致性

开发人员:

  1. 开发代码
  2. 打包项目环境 + 代码成镜像
  3. 部署到容器平台

运维人员:高效的管理应用容器(监控,日志,快捷部署方式)

好处:

  1. 运维人员节省人工成本
  2. 可以更加高效的解决问题

:::info

(1) 提供一个简单、轻量的建模方式 Docker上手非常快,用户只需几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到了“随心所至,代码即改”的境界。 随后,就可以创建容器来运行应用程序了。大多数Docker容器只需不到1秒钟即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户可以尽可能充分地利用系统资源。 (2)职责的逻辑分离 使用Docker,开发人员只需关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境的一致性,从而降低那种“开发时一切都正常,肯定是运维的问题”的风险。 (3)快速、高效的开发声明周期 Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。 (4)鼓励使用面向服务的架构 Docker还鼓励面向服务的架构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序多变得非常简单,同时也提高了程序的内省性。

:::

3.3 Docker 应用场景

  • 应用程序打包和发布
  • 应用程序隔离
  • 持续集成
  • 部署微服务(开发思想,将大的项目拆分成多个子项目组合)
  • 快速搭建测试环境
  • 提供PaaS产品(平台即服务)

3.4 Docker 基本组成

🐋1 最新快速掌握Docker实战课 - 图4

Docker Client:在Linux命令行中的执行 Docker 客户端操作指令。

Docker Host:Docker 主机,Docker 守护进程会在主机中运行,会收集Docker Client的指令并作出相应的执行过程和输出相应的结果。例如在Docker Client执行创建容器,那么Docker Daemon会收到其请求并创建相应的容器。

Docker Registry:仓库(Repository)是集中存放镜像文件的场所。

仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等。

3.5 版本与支持平台

Docker版本:

  • 社区版(Community Edition,CE)
  • 企业版(Enterprise Edition,EE)

支持平台:

  • Linux ( CentOS , Debian , Fedora , Oracle Linux , RHEL , SUSE 和 Ubuntu )
  • Mac
  • Windows

4 Docker 的使用

4.1 Docker 的安装

安装前建议关闭SELinux功能和firewalld

  1. # Step 1: 关闭SELinux功能
  2. # 临时关闭SELINUX
  3. setenforce 0 ; getenforce
  4. # 永久关闭SELINUX
  5. sed -i.bak -r '/^SELINUX/s@(.*)=(.*)@\1=disabled@g' /etc/selinux/config
  6. # Step 2: 关闭Firewalld防火墙功能
  7. systemctl stop firewalld && systemctl disable firewalld

范例:Docker 安装

  1. # Step 1: 更换Aliyun源
  2. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  3. # Step 2: 删除系统中旧有的Docker引擎和相关的依赖
  4. sudo yum remove docker \
  5. docker-client \
  6. docker-client-latest \
  7. docker-common \
  8. docker-latest \
  9. docker-latest-logrotate \
  10. docker-logrotate \
  11. docker-engine
  12. # Step 3: 删除Docker的数据目录
  13. sudo rm -rf /var/lib/docker/
  14. # 安装 Docker
  15. # step 1: 安装必要的一些系统工具
  16. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  17. # Step 2: 添加软件源信息
  18. sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  19. # Step 3: 修改为阿里云源
  20. sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
  21. # Step 4: 更新并安装Docker-CE
  22. sudo yum makecache fast
  23. sudo yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  24. # Step 4: 开启Docker服务
  25. sudo systemctl enable --now docker
  26. # 注意:
  27. # 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。
  28. # 例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
  29. # vim /etc/yum.repos.d/docker-ce.repo
  30. # 将[docker-ce-test]下方的enabled=0修改为enabled=1
  31. #
  32. # 安装指定版本的Docker-CE:
  33. # Step 1: 查找Docker-CE的版本:
  34. # yum list docker-ce.x86_64 --showduplicates | sort -r
  35. # Loading mirror speeds from cached hostfile
  36. # Loaded plugins: branch, fastestmirror, langpacks
  37. # docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
  38. # docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
  39. # docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
  40. # Available Packages
  41. #
  42. # Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
  43. # sudo yum install docker-ce-<VERSION_STRING> \
  44. # docker-ce-cli-<VERSION_STRING> \
  45. # containerd.io \
  46. # docker-compose-plugin

:::info Docker CentOS安装官方文档:[ https://docs.docker.com/engine/install/centos/ ]

官网文档:https://docs.docker.com/

阿里云源:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

:::

范例:验证Docker信息

  1. # 查看Docker的详细信息显示
  2. sudo docker info
  3. # 查看Docker的版本
  4. sudo docker version
  5. # 查看Docker的进程
  6. sudo docker ps
  7. # 查看Docker的镜像
  8. sudo docker images

🐋1 最新快速掌握Docker实战课 - 图5

4.2 Docker 镜像管理

4.2.1 镜像是什么

  • 一个分层存储的文件,不是一个单一的文件
  • 一个软件的环境
  • 一个镜像可以创建N个容器
  • 一种标准化的交付
  • 一个不包含Linux内核而又精简的Linux操作系统( 共享宿主机内核,不是一个完整Linux操作系统 )

4.2.2 配置加速器

Docker Hub是由Docker公司负责维护的公共镜像仓库,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像地址: https://hub.docker.com

可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
  1. sudo mkdir -p /etc/docker
  2. # 配置文件使用的JSON格式
  3. sudo tee /etc/docker/daemon.json <<-'EOF'
  4. {
  5. "registry-mirrors": ["https://po13h3y1.mirror.aliyuncs.com"]
  6. }
  7. EOF
  8. sudo systemctl daemon-reload
  9. sudo systemctl restart docker

范例:查看加速器配置为阿里云加速器

  1. $ sudo docker info | grep -A 1 "Registry Mirrors"
  2. Registry Mirrors:
  3. https://po13h3y1.mirror.aliyuncs.com/

4.2.3 Docker image 命令

命令格式:docker image COMMAND

指令 描述
ls 列出镜像
build 构建镜像来自Dockerfile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送─个镜像到镜像仓库
rm 移除─个或多个镜像
prune 移除没有被标记或者没有被任何容器引用的镜像
tag 创建一个引用源镜像标记目标镜像
save 保存一个或多个镜像到一个tarl归档文件
load 加载镜像来自tar归档或标准输入

范例:镜像常用管理命令

  1. # Step 1: 运行一个Nginx容器
  2. docker run -d --name nginx-container nginx
  3. # Step 2: 镜像管理命令
  4. # 查看本地镜像
  5. $ docker image ls [ docker images ]
  6. REPOSITORY TAG IMAGE ID CREATED SIZE
  7. nginx latest 605c77e624dd 8 months ago 141MB
  8. # 查看镜像的历史
  9. docker image history nginx
  10. # 查看镜像的详细信息显示
  11. docker image inspect nginx
  12. # 下载镜像(nginx)
  13. docker image pull nginx
  14. docker pull nginx
  15. # 删除镜像
  16. docker image rm nginx
  17. docker rmi nginx
  18. # 删除虚悬镜像(中间产物镜像)
  19. docker image prune
  20. # 将没有创建出容器的镜像全部删除
  21. docker image prune -a
  22. # 将镜像导出(nginx),可以使用重定向的方式
  23. docker save -o nginx.tar nginx
  24. docker save nginx > nginx.tar
  25. # 默认只有归档,没有压缩;所以产生的镜像包较大,可以使用gzip|bz2的方式将镜像包压缩
  26. docker save nginx | gzip > nginx.tar.gz
  27. docker save nginx | bzip2 > nginx.tar.bz2
  28. # 将镜像导入(nginx),可以使用重定向的方式
  29. docker load -i nginx.tar
  30. docker laod < nginx.tar.gz
  31. # 镜像使用的联合文件系统的机制,镜像相当于是模板,可以使用镜像创建多个容器
  32. # 启动Nginx容器,并暴露80端口映射到宿主机的8080端口
  33. docker run -d --name nginx-node -p 8080:80 --restart=always nginx
  34. sudo curl localhost:8080

4.3 Docker 容器管理

4.3.1 创建容器常用选项

  1. # 查看创建容器的帮助文档
  2. docker run --help

命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARGS……]

选项 描述
-i, —interactive 交互式
-t , —tty 分配一个伪终端
-d, —detachr 运行容器到后台
-e,—env 设置环境变量
-p,—publish list 发布容器端口到主机
-P,—publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
—name string 指定容器名称
-h, —hostname 设置容器主机名
—ip string 指定容器IP,只能用于自定义网络
—network 连接容器到一个网络
-v,—volume list
—mount mount(新方式)
将文件系统附加到容器
—restart string 容器退出时重启策略,默认no,可选值:[always l on-failure]

范例:创建容器常用选项

  1. # Step 1: 进入到容器的系统内部
  2. # 启动一个Ubuntu容器,操作系统类容器需要有进程夯筑容器运行
  3. $ docker run -it -d --name ubuntu-node ubuntu /bin/bash
  4. $ docker exec -it ubuntu-node /bin/bash | docker attach ubuntu-node
  5. # 查看容器的版本(ubuntu)
  6. root@9650093ce0c2:/# cat /etc/os-release
  7. NAME="Ubuntu"
  8. VERSION="20.04.3 LTS (Focal Fossa)"
  9. ID=ubuntu
  10. ID_LIKE=debian
  11. PRETTY_NAME="Ubuntu 20.04.3 LTS"
  12. VERSION_ID="20.04"
  13. HOME_URL="https://www.ubuntu.com/"
  14. SUPPORT_URL="https://help.ubuntu.com/"
  15. BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
  16. PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
  17. VERSION_CODENAME=focal
  18. UBUNTU_CODENAME=focal
  19. # 查看容器的进程
  20. root@9650093ce0c2:/# ps
  21. PID TTY TIME CMD
  22. 27 pts/3 00:00:00 bash
  23. 35 pts/3 00:00:00 ps
  24. # Step 2: 启动Nginx容器,并暴露80端口映射到宿主机的8080端口
  25. docker run -d --name nginx-node -p 8080:80 --restart=always nginx
  26. sudo curl localhost:8080
  27. # Step 3: 测试多个容器参数
  28. $ docker run -it -d -e env=prod --name container-nginx \
  29. -p 8088:80 --restart=always -h nginx-node nginx
  30. # 查看最新创建的容器信息
  31. $ docker ps -l
  32. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  33. 1dcbec1b129c nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:8088->80/tcp, :::8088->80/tcp container-nginx
  34. $ sudo curl localhost:8088
  35. # 进入到container-nginx容器中
  36. $ docker exec -it container-nginx /bin/bash
  37. root@nginx-node:/# hostname
  38. nginx-node
  39. root@nginx-node:/# echo $env
  40. prod
  41. root@nginx-node:/# echo "Hello Nginx Container" > /usr/share/nginx/html/index.html
  42. root@nginx-node:/# curl localhost
  43. Hello Nginx Container
  44. root@nginx-node:/# exit
  45. # 重启Docker服务后该容器会自动启动(--restart=always)
  46. $ systemctl restart docker
  47. $ docker ps
  48. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  49. 1dcbec1b129c nginx "/docker-entrypoint.…" 4 minutes ago Up 9 seconds 0.0.0.0:8088->80/tcp, :::8088->80/tcp container-nginx
  50. # 查看容器的详细信息显示
  51. $ docker inspect container-nginx

命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARGS……]

选项 描述
-m,—memory 容器可以使用的最大内存量
—memory-swap 允许交换到磁盘的内存量
—memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
—oom-kill-disable 禁用OOM Killer
—cpus 可以使用的CPU数量
—cpuset-cpus 限制容器使用特定的CPU核心,如(0-3 , 0 , 1)
—cpu-shares CPU共享(相对权重)

范例:创建容器常用选项

  1. # -m="300m" 使用300M内存
  2. # --cpus="1" 使用一颗CPU
  3. $ docker run -it -d --name ubuntu-container -m="300m" --cpus="1" ubuntu /bin/bash
  4. # 查看容器的资源
  5. $ docker stats --no-stream ubuntu-container
  6. CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
  7. d74184890bae ubuntu-container 0.00% 540KiB / 300MiB 0.18% 656B / 0B 0B / 0B 1

Docker利用namespace实现了容器之间资源隔离,但是namespace不能对容器资源限制,比如CPU、内存。

如果某一个容器属于CPU密集型任务,那么会影响其他容器使用CPU,导致多个容器相互影响并且抢占资源。

如何对多个容器的资源使用进行限制就成了容器化的主要问题。

答:引入Control Groups(简称CGroups),限制容器资源

CGroups:所有的任务就是运行在系统中的一个进程,而CGroups以某种标准讲一组进程为目标进行资源分配和控制。例如CPU、内存、带宽等,并且可以<font style="color:#E8323C;">动态配置</font>

4.3.2 常用管理命令

命令格式:docker container COMMAND

选项 描述
ls 列出容器
inspect 查看一个或多个容器详细信息
exec 在运行容器中执行命令
commit 创建—个新镜像来自—个容器
cp 拷贝文件/文件夹到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop / start / restart 停止/启动一个或多个容器
rm 删除─个或多个容器
prune 移除已停止的容器

范例:常用管理命令

  1. # Step 1: 列出当前DockerHost容器
  2. $ docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. d74184890bae ubuntu "/bin/bash" 3 minutes ago Up 3 minutes ubuntu-container
  5. 1dcbec1b129c nginx "/docker-entrypoint.…" 14 minutes ago Up 10 minutes 0.0.0.0:8088->80/tcp, :::8088->80/tcp container-nginx
  6. # 列出当前DockerHost所有容器
  7. $ docker ps -a
  8. # 列出最新创建的容器
  9. $ docker ps -l
  10. # Step 2: 查看容器的详细信息显示
  11. $ docker inspect [Container_ID|Container_Name]
  12. # Step 3: 进入到容器或者直接在DockerHost执行容器命令
  13. $ docker exec -it ubuntu-container /bin/bash
  14. $ docker exec ubuntu-container cat /etc/os-release
  15. NAME="Ubuntu"
  16. VERSION="20.04.3 LTS (Focal Fossa)"
  17. ID=ubuntu
  18. ID_LIKE=debian
  19. PRETTY_NAME="Ubuntu 20.04.3 LTS"
  20. VERSION_ID="20.04"
  21. HOME_URL="https://www.ubuntu.com/"
  22. SUPPORT_URL="https://help.ubuntu.com/"
  23. BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
  24. PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
  25. VERSION_CODENAME=focal
  26. UBUNTU_CODENAME=focal
  27. # Step 4: 查看容器日志
  28. docker logs container-nginx
  29. # Step 5: 将容器提交成一个镜像
  30. $ docker exec -it container-nginx /bin/bash
  31. root@nginx-node:/# echo "Hello Nginx Container" > /usr/share/nginx/html/index.html
  32. root@nginx-node:/# exit
  33. $ docker commit -a "zhongzw <zhongzhiwei@kubesphere.com>" -m "修改nginx默认页面" container-nginx mynginx:1.1.0
  34. $ docker images
  35. REPOSITORY TAG IMAGE ID CREATED SIZE
  36. mynginx 1.1.0 20cad473dbf9 13 seconds ago 141MB
  37. $ docker image history mynginx:1.1.0
  38. IMAGE CREATED CREATED BY SIZE COMMENT
  39. 20cad473dbf9 27 seconds ago nginx -g daemon off; 1.12kB 修改nginx默认页面
  40. 605c77e624dd 8 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
  41. <missing> 8 months ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
  42. <missing> 8 months ago /bin/sh -c #(nop) EXPOSE 80 0B
  43. <missing> 8 months ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
  44. <missing> 8 months ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
  45. <missing> 8 months ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
  46. <missing> 8 months ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
  47. <missing> 8 months ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
  48. <missing> 8 months ago /bin/sh -c set -x && addgroup --system -… 61.1MB
  49. <missing> 8 months ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
  50. <missing> 8 months ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.1 0B
  51. <missing> 8 months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.5 0B
  52. <missing> 9 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
  53. <missing> 9 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
  54. <missing> 9 months ago /bin/sh -c #(nop) ADD file:09675d11695f65c55… 80.4MB
  55. # 将新镜像运行成容器
  56. docker run -it -d --name mynginx-container --restart=always -p 8888:80 mynginx:1.1.0
  57. sudo curl localhost:8888
  58. # Step 5: 容器与宿主机之间的文件拷贝
  59. Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
  60. docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
  61. $ echo "hello docker" > docker.txt
  62. $ docker cp docker.txt ubuntu-container:/tmp
  63. $ docker exec ubuntu-container cat /tmp/docker.txt
  64. hello docker
  65. $ docker cp ubuntu-container:/etc/passwd /tmp
  66. $ cat /tmp/passwd
  67. # Step 7: 查看容器暴露的端口
  68. $ docker port mynginx-container
  69. 80/tcp -> 0.0.0.0:8888
  70. 80/tcp -> :::8888
  71. # Step 8: 容器运行的进程
  72. $ docker top mynginx-container
  73. # Step 9: 查看容器的资源利用率
  74. $ docker stats mynginx-container
  75. $ docker stats --no-stream mynginx-container
  76. # Step 10: 删除容器
  77. $ docker rm -f mynginx-container
  78. # 只查看容器的ID
  79. $ docker ps -q
  80. # 删除所有容器(-f 强制删除;-a 全部容器)
  81. $ docker rm -f $(docker ps -qa)

4.3.3 容器数据持久化

Docker提供两种方式将数据从宿主机挂载到容器中:

  • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。.
  • bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。

volumes示例:

1、创建数据卷

  1. docker volume create nginx-vol
  2. docker volume ls
  3. docker volume inpect nginx-vol

2、使用数据卷

  1. docker run -d --name=test-nginx --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
  2. docker run -d --name=test-nginx -v nginx-vol:/usr/share/nginx/html nginx

bind mounts示例:

1、挂载宿主机目录到容器

  1. docker run -d --name nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr//share/nginx/html nginx
  2. docker run -d --name nginx-test -v /app/wwwroot:/usr//share/nginx/html nginx

范例:容器数据持久化

  1. $ mkdir /opt/wwwroot
  2. # 容器数据持久化
  3. $ docker run -d -it --name web01 -p 88:80 -v /opt/wwwroot:/usr/share/nginx/html nginx
  4. # 测试访问
  5. $ curl 127.0.0.1:88
  6. <html>
  7. <head><title>403 Forbidden</title></head>
  8. <body>
  9. <center><h1>403 Forbidden</h1></center>
  10. <hr><center>nginx/1.21.5</center>
  11. </body>
  12. </html>
  13. # 需要在/opt/wwwroot目录下创建HTML文件
  14. $ echo "Hello,Docker Web page" > /opt/wwwroot/index.html
  15. $ curl 127.0.0.1:88
  16. Hello,Docker Web page
  17. # 宿主机和容器共享该目录
  18. # 新创建一个nginx容器挂载到该目录下,并测试访问
  19. $ docker run -d -it --name web02 -p 99:80 -v /opt/wwwroot:/usr/share/nginx/html nginx
  20. $ curl 127.0.0.1:99
  21. Hello,Docker Web page

:::info 制作镜像:

  1. 启动容器之后的应用程序服务产生的数据尽量存放在一个目录下,例如:/data
  2. 构建镜像是不能将已经生成的应用程序数据打包进去的

Jenkins、Gitlab 使用 Docker 都是采用 -v 将容器自身产生的数据持久化到宿主机。

:::

4.3.4 容器网络

🐋1 最新快速掌握Docker实战课 - 图6

  • veth pair:成对出现的一种虚拟网络设备,数据从一端进,从另一端出。用于解决网络命名空间之间隔离。(可以理解为网线,解决不同网络命名空间 ( 宿主机网络和容器网络 ) 之间的通信的
  • docker0:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。(解决不同容器之间通信 和 宿主机数据包以及容器数据包之间数据交换)
  1. # docker 启动后会产生一个 docker0 的桥接设备
  2. # docker0 可以理解为是一个交换机,是将容器接入到交换机中,实现容器与容器之间的通信
  3. # 并且可以将数据包传递到宿主机处理。
  4. $ ifconfig docker0
  5. docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  6. inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
  7. inet6 fe80::42:45ff:fe1c:2b38 prefixlen 64 scopeid 0x20<link>
  8. ether 02:42:45:1c:2b:38 txqueuelen 0 (Ethernet)
  9. RX packets 32 bytes 3436 (3.3 KiB)
  10. RX errors 0 dropped 0 overruns 0 frame 0
  11. TX packets 47 bytes 3446 (3.3 KiB)
  12. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Docker 使用 iptables 实现网络通信

  1. 外部访问容器:

🐋1 最新快速掌握Docker实战课 - 图7

  1. iptables -t nat -vnL DOCKER
  1. 容器访问外部:

🐋1 最新快速掌握Docker实战课 - 图8

  1. iptables -t nat -vnL POSTROUTING
范例:外部访问容器 bash # 查看宿主机容器进程 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES busybox-node ec4e0869e87a nginx "/docker-entrypoint.…" 25 minutes ago Up 25 minutes 0.0.0.0:88->80/tcp, :::88->80/tcp web01 # 外部访问容器(iptables-DNAT) $ iptables -t nat -vnL DOCKER Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:88 to:172.17.0.2:80 # iptables 判断本机的88端口要转发到172.17.0.2:80端口 # 宿主机会判断路由表信息 $ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.0.2 0.0.0.0 UG 100 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 # 数据包会转发到docker0网桥,docker0又是一个二层交换机。 # docker0 会发送ARP广播,找到172.17.0.2的容器,就可以基于MAC地址进行通信 ### 所以在外部访问容器中关键在于 DNAT,路由表 范例:容器访问外部
  1. $ docker run -it -d --name busybox-node busybox
  2. $ docker exec -it busybox-node /bin/sh
  3. # 可以访问外网
  4. / # ping -c 1 -W 1 www.baidu.com
  5. PING www.baidu.com (183.232.231.174): 56 data bytes
  6. 64 bytes from 183.232.231.174: seq=0 ttl=127 time=15.140 ms
  7. --- www.baidu.com ping statistics ---
  8. 1 packets transmitted, 1 packets received, 0% packet loss
  9. round-trip min/avg/max = 15.140/15.140/15.140 ms
  10. # 查看网卡信息
  11. / # ifconfig
  12. eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04
  13. inet addr:172.17.0.4 Bcast:172.17.255.255 Mask:255.255.0.0
  14. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  15. RX packets:13 errors:0 dropped:0 overruns:0 frame:0
  16. TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
  17. collisions:0 txqueuelen:0
  18. RX bytes:1100 (1.0 KiB) TX bytes:328 (328.0 B)
  19. lo Link encap:Local Loopback
  20. inet addr:127.0.0.1 Mask:255.0.0.0
  21. UP LOOPBACK RUNNING MTU:65536 Metric:1
  22. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  23. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  24. collisions:0 txqueuelen:1000
  25. RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  26. # 查看容器路由表
  27. / # route -n
  28. Kernel IP routing table
  29. Destination Gateway Genmask Flags Metric Ref Use Iface
  30. 0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
  31. 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
  32. # 查看宿主机容器进程
  33. $ docker ps
  34. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  35. 8d12c3faadd3 busybox "sh" 8 minutes ago Up 8 minutes busybox-node
  36. ec4e0869e87a nginx "/docker-entrypoint.…" 32 minutes ago Up 32 minutes 0.0.0.0:88->80/tcp, :::88->80/tcp web01
  37. # 可以判断到容器的下一跳就是docker0网桥设备,并且将数据包丢到docker0
  38. # docker0 设备将数据包转发到宿主机,# 例如容器ping百度,源IP:容器IP,目的IP:百度IP
  39. # 宿主机会查找路由表
  40. $ route -n
  41. Kernel IP routing table
  42. Destination Gateway Genmask Flags Metric Ref Use Iface
  43. 0.0.0.0 10.0.0.2 0.0.0.0 UG 100 0 0 eth0
  44. 10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
  45. 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
  46. # 容器访问外部(iptables-SNAT)
  47. $ iptables -t nat -vnL POSTROUTING
  48. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
  49. pkts bytes target prot opt in out source destination
  50. 3 202 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 # SNAT策略
  51. 0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:80
  52. # 经过iptables的策略,将数据包的源IP改成为宿主机的IP发送出去
  53. # 经过宿主机的网关,发送到互联网中

5 Dockerfile 构建镜像

5.1 Dockerfile 概述

Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。

🐋1 最新快速掌握Docker实战课 - 图9

5.2 Dockerfile 常用指令

一个镜像或者容器就是运行一个服务,不要当成虚拟机使用

指令 描述
FROM 构建新镜像是基于哪个镜像
LABEL 标签
RUN 构建镜像时运行的Shell命令
COPY 拷贝文件或目录到镜像中
ADD 解压压缩包并拷贝
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE 声明容器运行的服务端口
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
CMD 运行容器时默认执行,如果有多个CMD指令,最后一个生效

范例:创建Dockerfile

  1. $ mkdir Dockerfile-DIR ; cd Dockerfile-DIR
  2. $ vim Dockerfile1
  3. # 构建新镜像是基于哪个镜像
  4. FROM centos:centos7.9.2009
  5. # 标签
  6. LABEL zhongzhiwei <zhongzhiwei@kubesphere.com>
  7. # 使用阿里云源配置Yum源(base 和 epel)
  8. RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
  9. curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
  10. # 构建镜像时运行的Shell命令
  11. RUN yum install -y nginx
  12. # 清理Yum缓存
  13. RUN yum clean all
  14. # 容器运行时执行的命令
  15. CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
  16. # 声明容器运行的服务端口
  17. EXPOSE 80
  18. # 构建镜像
  19. $ docker build -t mynginx:1.0.0 -f Dockerfile1 .
  20. # 查看镜像信息
  21. $ docker images mynginx:1.0.0
  22. REPOSITORY TAG IMAGE ID CREATED SIZE
  23. mynginx 1.0.0 0e54bb26e7b4 40 seconds ago 483MB
  24. # 访问测试
  25. $ docker run -it -d --name mynginx-node -p 90:80 -v /opt/wwwroot/:/usr/share/nginx/html mynginx:1.0.0
  26. $ curl 10.0.0.101:90
  27. Hello,Docker Web page

5.3 构建镜像命令

  1. # 使用 docker build 命令
  2. $ docker build --help
  3. Usage: docker build [OPTIONS] PATH | URL | -
  4. Build an image from a Dockerfile
  5. Options:
  6. --add-host list Add a custom host-to-IP mapping (host:ip)
  7. --build-arg list Set build-time variables
  8. --cache-from strings Images to consider as cache sources
  9. --cgroup-parent string Optional parent cgroup for the container
  10. --compress Compress the build context using gzip
  11. --cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
  12. --cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
  13. -c, --cpu-shares int CPU shares (relative weight)
  14. --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
  15. --cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
  16. --disable-content-trust Skip image verification (default true)
  17. -f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
  18. --force-rm Always remove intermediate containers
  19. --iidfile string Write the image ID to the file
  20. --isolation string Container isolation technology
  21. --label list Set metadata for an image
  22. -m, --memory bytes Memory limit
  23. --memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
  24. --network string Set the networking mode for the RUN instructions during build (default "default")
  25. --no-cache Do not use cache when building the image
  26. --pull Always attempt to pull a newer version of the image
  27. -q, --quiet Suppress the build output and print image ID on success
  28. --rm Remove intermediate containers after a successful build (default true)
  29. --security-opt strings Security options
  30. --shm-size bytes Size of /dev/shm
  31. -t, --tag list Name and optionally a tag in the 'name:tag' format
  32. --target string Set the target build stage to build.
  33. --ulimit ulimit Ulimit options (default [])

5.4 构建 nginx 镜像

编译安装一个软件:

  1. 安装依赖包
  2. ./configure 检查环境依赖
  3. make 编译
  4. make install 编译安装
  1. # 下载nginx源码包
  2. $ wget http://nginx.org/download/nginx-1.16.1.tar.gz
  3. # 编写Dockerfile文件
  4. $ vim Dockerfile-nginx
  5. FROM centos:centos7.9.2009
  6. LABEL maintainer www.kubesphere.com
  7. RUN yum install -y gcc gcc-c++ make \
  8. openssl-devel pcre-devel gd-devel \
  9. iproute net-tools telnet wget curl && \
  10. yum clean all && \
  11. rm -rf /var/cache/yum/*
  12. ADD nginx-1.16.1.tar.gz /
  13. RUN cd nginx-1.16.1 && \
  14. ./configure --prefix=/usr/local/nginx \
  15. --with-http_ssl_module \
  16. --with-http_stub_status_module && \
  17. make -j 4 && make install && \
  18. mkdir /usr/local/nginx/conf/vhost && \
  19. cd / && rm -rf nginx* && \
  20. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  21. ENV PATH $PATH:/usr/local/nginx/sbin
  22. COPY nginx.conf /usr/local/nginx/conf/nginx.conf
  23. WORKDIR /usr/local/nginx
  24. EXPOSE 80
  25. CMD ["nginx", "-g", "daemon off;"]
  26. # 准备Nginx配置文件
  27. $ vim nginx.conf
  28. #user nobody;
  29. worker_processes 1;
  30. #error_log logs/error.log;
  31. #error_log logs/error.log notice;
  32. #error_log logs/error.log info;
  33. #pid logs/nginx.pid;
  34. events {
  35. worker_connections 1024;
  36. }
  37. http {
  38. include mime.types;
  39. default_type application/octet-stream;
  40. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  41. # '$status $body_bytes_sent "$http_referer" '
  42. # '"$http_user_agent" "$http_x_forwarded_for"';
  43. #access_log logs/access.log main;
  44. sendfile on;
  45. #tcp_nopush on;
  46. #keepalive_timeout 0;
  47. keepalive_timeout 65;
  48. #gzip on;
  49. server {
  50. listen 80;
  51. server_name localhost;
  52. #charset koi8-r;
  53. #access_log logs/host.access.log main;
  54. location / {
  55. root html;
  56. index index.html index.htm;
  57. }
  58. #error_page 404 /404.html;
  59. # redirect server error pages to the static page /50x.html
  60. #
  61. error_page 500 502 503 504 /50x.html;
  62. location = /50x.html {
  63. root html;
  64. }
  65. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  66. #
  67. #location ~ \.php$ {
  68. # proxy_pass http://127.0.0.1;
  69. #}
  70. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  71. #
  72. #location ~ \.php$ {
  73. # root html;
  74. # fastcgi_pass 127.0.0.1:9000;
  75. # fastcgi_index index.php;
  76. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  77. # include fastcgi_params;
  78. #}
  79. # deny access to .htaccess files, if Apache's document root
  80. # concurs with nginx's one
  81. #
  82. #location ~ /\.ht {
  83. # deny all;
  84. #}
  85. }
  86. # another virtual host using mix of IP-, name-, and port-based configuration
  87. #
  88. #server {
  89. # listen 8000;
  90. # listen somename:8080;
  91. # server_name somename alias another.alias;
  92. # location / {
  93. # root html;
  94. # index index.html index.htm;
  95. # }
  96. #}
  97. # HTTPS server
  98. #
  99. #server {
  100. # listen 443 ssl;
  101. # server_name localhost;
  102. # ssl_certificate cert.pem;
  103. # ssl_certificate_key cert.key;
  104. # ssl_session_cache shared:SSL:1m;
  105. # ssl_session_timeout 5m;
  106. # ssl_ciphers HIGH:!aNULL:!MD5;
  107. # ssl_prefer_server_ciphers on;
  108. # location / {
  109. # root html;
  110. # index index.html index.htm;
  111. # }
  112. #}
  113. }
  114. # 构建Nginx镜像
  115. $ docker build -t mynginx:1.2.0 -f Dockerfile-nginx .
  116. # 将镜像运行成容器
  117. $ docker run -it -d --name mynginx-node01 -p 91:80 mynginx:1.2.0
  118. # 测试访问(访问的默认页面)
  119. $ curl http://10.0.0.101:91
  120. <!DOCTYPE html>
  121. <html>
  122. <head>
  123. <title>Welcome to nginx!</title>
  124. <style>
  125. body {
  126. width: 35em;
  127. margin: 0 auto;
  128. font-family: Tahoma, Verdana, Arial, sans-serif;
  129. }
  130. </style>
  131. </head>
  132. <body>
  133. <h1>Welcome to nginx!</h1>
  134. <p>If you see this page, the nginx web server is successfully installed and
  135. working. Further configuration is required.</p>
  136. <p>For online documentation and support please refer to
  137. <a href="http://nginx.org/">nginx.org</a>.<br/>
  138. Commercial support is available at
  139. <a href="http://nginx.com/">nginx.com</a>.</p>
  140. <p><em>Thank you for using nginx.</em></p>
  141. </body>
  142. </html>
  143. # 将其页面目录进行数据持久化
  144. $ docker run -it -d --name mynginx-node02 -p 92:80 -v /opt/wwwroot/:/usr/local/nginx/html/ mynginx:1.2.0
  145. # 测试访问
  146. $ curl http://10.0.0.101:92
  147. Hello,Docker Web page

5.5 构建 Tomcat 镜像

  1. $ wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.82/bin/apache-tomcat-8.5.82.tar.gz
  2. $ vim Dockerfile-tomcat
  3. FROM centos:centos7.9.2009
  4. MAINTAINER www.kubesphere.com
  5. ENV VERSION=8.5.82
  6. RUN yum install java-1.8.0-openjdk.x86_64 wget curl unzip iproute net-tools -y && \
  7. yum clean all && \
  8. rm -rf /var/cache/yum/*
  9. ADD apache-tomcat-${VERSION}.tar.gz /usr/local/
  10. RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \
  11. sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
  12. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  13. ENV PATH $PATH:/usr/local/tomcat/bin
  14. WORKDIR /usr/local/tomcat
  15. EXPOSE 8080
  16. CMD ["catalina.sh" , "run"]
  17. $ docker build -t mytomcat:1.0.0 -f Dockerfile-tomcat .
  18. $ docker run -d -it -p 8080:8080 mytomcat:1.0.0
  19. $ curl 10.0.0.101:8080
  20. # Tomcat 编译后的页面路径 /usr/local/tomcat/webapps/ROOT
  21. # 将Tomcat的页面数据目录持久化
  22. $ docker run -d -it -p 8081:8080 -v /opt/wwwroot/:/usr/local/tomcat/webapps/ROOT mytomcat:1.0.0
  23. $ curl 10.0.0.101:8081
  24. Hello,Docker Web page

🐋1 最新快速掌握Docker实战课 - 图10

:::info 推荐在编写Dockerfile时,管理员应该先启动一个容器,然后按照Dockerfile的步骤一步一步的执行完。再将正确的执行指令COPY到Dockerfile 文件中。

:::

5.6 Dockerfile 示例

  1. FROM ubuntu
  2. MAINTAINER zhongzhiwei <935523993@qq.com>
  3. ENV MY_PATH=/usr/local
  4. WORKDIR ${MY_PATH}
  5. # 更新APT源仓库
  6. RUN apt update -y
  7. # 安装 ifconfig 命令查看网络IP
  8. RUN apt install -y net-tools
  9. # 安装 ip addr
  10. RUN apt install -y iproute2
  11. # 安装 ping
  12. RUN apt install -y inetutils-ping
  13. # 安装基本软件
  14. RUN apt install -y wget bzip2 glibc-headers bison
  15. # 安装 Java 8 以及 lib 库
  16. # 1.安装 GNU MAKE-Version:4.2.1 软件路径:https://ftp.gnu.org/gnu/make/
  17. RUN wget https://ftp.gnu.org/gnu/make/make-4.2.1.tar.gz && tar -xf make-4.2.1.tar.gz && cd make-4.2.1 && mkdir -p build && cd build
  18. # 编译安装
  19. RUN /usr/local/make-4.2.1/configure --prefix=/usr && sh build.sh && make install
  20. # 2.安装 GCC-Version:8.2.0 软件路径:https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc
  21. RUN wget -c -P /opt/software/ https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.2.0/gcc-8.2.0.tar.gz && cd /opt/software/ && tar -zxvf gcc-8.2.0.tar.gz && /opt/software/gcc-8.2.0/contrib/download_prerequisites
  22. RUN mkdir build && cd build && /opt/software/gcc-8.2.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
  23. RUN make -j 4 && make install
  24. # 3.安装 Glibc-Version:2.28 软件路径:https://ftp.gnu.org/gnu/glibc/
  25. RUN wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz && tar -xf glibc-2.28.tar.gz && cd glibc-2.28 && mkdir build && cd build
  26. # 编译安装
  27. RUN /usr/local/glibc-2.28/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin && make -j 4 && make install
  28. # ADD 是相对路径 jar,把jdk-8u301-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
  29. ADD jdk-8u301-linux-x64.tar.gz /usr/local/java
  30. # 配置java环境变量
  31. ENV JAVA_HOME=/usr/local/java/jdk1.8.0_301
  32. ENV JRE_HOME=${JAVA_HOME}/jre
  33. ENV CLASSPATH=${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar:${JRE_HOME}/lib:$CLASSPATH
  34. ENV PATH=${JAVA_HOME}/bin:${PATH}
  35. EXPOSE 80
  36. CMD echo "${MY_PATH}"
  37. CMD echo "Success---------OK"
  38. CMD /bin/bash
  1. FROM centos
  2. MAINTAINER zhongzhiwei <93552399@qq.com>
  3. ENV MYPATH /usr/local
  4. WORKDIR $MYPATH
  5. # 安装 VIM 编辑器
  6. RUN yum update -y && yum install -y vim
  7. # 安装 ifconfig 命令查看网络IP
  8. RUN yum install -y net-tools
  9. # 安装 Java 8 以及 lib 库
  10. RUN yum install -y glibc.i686
  11. RUN mkdir -p /usr/local/java
  12. # ADD 是相对路径 jar,把jdk-8u301-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
  13. ADD jdk-8u301-linux-x64.tar.gz /usr/local/java
  14. # 配置java环境变量
  15. ENV JAVA_HOME=/usr/local/java/jdk1.8.0_301
  16. ENV JRE_HOME=${JAVA_HOME}/jre
  17. ENV CLASSPATH=${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar:${JRE_HOME}/lib:$CLASSPATH
  18. ENV PATH=${JAVA_HOME}/bin:${PATH}
  19. EXPOSE 80
  20. CMD echo ${MYPATH}"
  21. CMD echo "Success----------OK"
  22. CMD /bin/bash

6 Harbor 镜像仓库搭建和使用

6.1 Harbor 概述

Harbor是由VMWare公司开源的容器镜像仓库。事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求。

官方: https://goharbor.io/

Github: https://github.com/goharbor/harbor

6.2 部署先决条件与部署

6.2.1 Harbor 部署:先决条件

服务器硬件配置:

  • 最低要求:CPU2核 / 内存4G / 硬盘40GB
  • 推荐:CPU4核 / 内存8G / 硬盘160GB

软件:

  • Docker CE 17.06版本+
  • Docker Compose 1.18版本+

Harbor安装有2种方式:

  • 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小
  • 离线安装:安装包包含部署的相关镜像,因此安装包比较大

6.2.2 Harbor 部署

  1. # 下载 Harbor 软件包
  2. wget https://github.com/goharbor/harbor/releases/download/v2.6.0/harbor-offline-installer-v2.6.0.tgz
  3. # 下载Docker Compose
  4. $ sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  5. # 查看Docker Compose版本
  6. $ docker-compose version
  7. docker-compose version 1.27.4, build 40524192
  8. docker-py version: 4.3.1
  9. CPython version: 3.7.7
  10. OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019

范例:部署 Harbor HTTP

  1. $ tar -zxvf harbor-offline-installer-v2.6.0.tgz
  2. $ cd harbor ; cp harbor.yml.tmpl harbor.yml
  3. # 修改配置文件
  4. $ vi harbor.yml
  5. hostname: 10.0.0.101
  6. https: # 先注释 https 相关配置
  7. harbor_admin_password: Harbor12345
  8. $ ./prepare
  9. $ ./install.sh
  10. $ docker-compose ps
  11. Name Command State Ports
  12. -----------------------------------------------------------------------------------------------------------------
  13. harbor-core /harbor/entrypoint.sh Up (health: starting)
  14. harbor-db /docker-entrypoint.sh 96 13 Up (health: starting)
  15. harbor-jobservice /harbor/entrypoint.sh Up (health: starting)
  16. harbor-log /bin/sh -c /usr/local/bin/ ... Up (health: starting) 127.0.0.1:1514->10514/tcp
  17. harbor-portal nginx -g daemon off; Up (health: starting)
  18. nginx nginx -g daemon off; Up (health: starting) 0.0.0.0:80->8080/tcp,:::80->8080/tcp
  19. redis redis-server /etc/redis.conf Up (health: starting)
  20. registry /home/harbor/entrypoint.sh Up (health: starting)
  21. registryctl /home/harbor/start.sh Up (health: starting)

http://10.0.0.101

🐋1 最新快速掌握Docker实战课 - 图11

🐋1 最新快速掌握Docker实战课 - 图12

6.3 基本使用

  1. 配置 http 镜像仓库可信任
  1. $ vi /etc/docker/daemon.json
  2. {"insecure-registries":["10.0.0.101"]}
  3. $ systemctl daemon-reload ; systemctl restart docker
  1. 打标签
  1. # docker tag SOURCE_IMAGE[:TAG] 10.0.0.101/library/REPOSITORY[:TAG]
  2. docker tag centos:centos7.9.2009 10.0.0.101/library/centos:centos7.9.2009
  1. 上传
  1. # Docker Login
  2. $ docker login 10.0.0.101
  3. Username: admin
  4. Password:
  5. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  6. Configure a credential helper to remove this warning. See
  7. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  8. Login Succeeded
  9. # docker push 10.0.0.101/library/REPOSITORY[:TAG]
  10. docker push 10.0.0.101/library/centos:centos7.9.2009
  11. ###
  12. # 若出现反复Retrying in XXX second
  13. # 修改:common/config/registry/config.yml
  14. http:
  15. relativeurls: true
  16. # 重启 Harbor
  17. docker-compose down
  18. docker-compose up -d

🐋1 最新快速掌握Docker实战课 - 图13

🐋1 最新快速掌握Docker实战课 - 图14

  1. 下载
  1. # 下载镜像
  2. docker pull 10.0.0.101/library/centos:centos7.9.2009
  3. # 需要配置可信任的证书

🐋1 最新快速掌握Docker实战课 - 图15