Docker入门教程

178 阅读4分钟

概念

虚拟机

在一种操作系统里面运行另一种操作系统的虚拟化技术, 如在Windows 系统里面运行 Linux 系统

  • 优点:完全模拟硬件,每个虚拟机拥有独立的操作系统和内核,隔离性更强
  • 缺点:启动慢,资源占用多等

虚拟机软件:VirtualBox,VMware等

容器

容器就是受限制的 Linux 进程

容器技术原理:隔离与限制

  • 隔离: 通过Namespace实现,使得每个容器拥有独立的文件系统、网络、进程等 view,从而避免了不同容器间的资源冲突
  • 限制: 使用Cgroups控制一个进程或一组进程可以访问或使用给定关键资源,如CPU、内存、磁盘I/O等

缺点: 一个个容器在宿主机上就是一个个进程,使用相同的宿主机内核,导致隔离得不彻底

LXC

LXC是Linux容器技术的一个实现

Namespace和Cgroups都是linux内核的功能,LXC根据这些功能,封装了一套工具和API,简化了容器化应用的创建、部署和管理,包括容器模板,通过配置文件管理,支持容器存储卷持久化存储和快照功能等

Docker

Docker就是一个容器的标准化实现, 现在说的容器一般是指Docker容器

Docker初期也是基于LXC的,后来以自己的实现来替代,成功的主要原因便是提供了一个完整的解决方案生态系统,使得易用、简单

  • 简化容器创建和管理:Docker通过CLI和GUI工具进一步简化了容器的创建和管理过程
  • 容器编排和自动化:提供了Docker Compose和Docker Swarm等工具,满足扩展复杂的容器化应用
  • 容器镜像和分发:通过Docker Hub等中心仓库进行存储、共享和分发
  • 跨平台兼容性:可以同时在Windows和macOS运行

重要的概念

  • 镜像,一个只读文件夹,创建Docker容器的模板
  • 容器,是一个镜像的可运行的实例,容器=镜像+可读层
  • 仓库:镜像管理仓库,简单但很有用

镜像

每一个Docker镜像都是一个只读的文件夹,当在容器中运行镜像时,Docker会自动挂载镜像中的、只读的文件目录,以及宿主机上一个临时的、可写的文件目录。容器中所有文件修改,都会写入这个临时目录里去。容器终结后,这个临时目录也会被相应删除。

容器运行时,我们修改的东西会保存在临时的文件目录中,如果想要保存下来,可以使用docker commit 命令,成为一个新的镜像。创建就是把原镜像和增量都保存在新镜像中。其中新的增量部分,就被称为「层(layer)」。

Dockerfile

每次叠加的层都是一个黑盒,会让镜像变的臃肿,不好管理,Docker提供了一种解决方案Dockerfile,把所有更改都通过一个脚本文件记录下来,用来解决镜像构建透明性和体积的问题

推荐文章:
blog.csdn.net/m0_37055174… Docker镜像里到底有啥东西?

k8s

Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。Kubernetes能够实现自动化部署、故障恢复、负载均衡和应用的自动扩展。适用于需要跨多个集群或云平台部署和管理容器化应用的场景。

安装

环境: CentOS 7

脚本下载: 生产环境不推荐

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

手动安装

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

报错 stable/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found

github.com/docker/for-…

链接不对,需要手动修正

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --setopt="docker-ce-stable.baseurl=https://download.docker.com/linux/centos/7/x86_64/stable" --save

yum-config-manager 命令会输出相关配置,发现一直在用错误的,可以去这个目录/etc/yum.repos.d/,手动删掉

sudo systemctl enable docker
sudo systemctl start docker

docker info报错docker bridge-nf-call-iptables is disabled

sudo tee -a /etc/sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

验证

docker run hello-world

参数说明

  • -i 保持STDIN打开,不然就只能输入一条命令
  • -t 分配一个伪终端,作用是把我们的输入在容器里执行
  • -d 后台运行,不指定的话我们退出伪终端后容器也会停止运行
  • --privileged 特权

常用命令

docker info

docker images

docker ps

docker stop

docker kill

docker kill 

// 运行新的容器
docker run -itd ubuntu:18.04 bash

// 进入一个运行中的容器
docker exec -itd ubuntu:18.04 bash

// 端口映射 路径映射
docker run -itd --privileged --name=apache -v /var/www/html/:/var/www/html/ -p 8888:80 myapache:v1/usr/sbin/init 

docker内执行service报错Failed to get D-Bus connection: No connection to service manager

stackoverflow.com/questions/2…

富容器

102.alibaba.com/detail?id=1…

参考文章:
cloud.tencent.com/developer/a… Docker系列技术分享(一) 容器技术和Docker zhuanlan.zhihu.com/p/43372662 # 浅入浅出容器文件系统