Willson Chen

Stay Hungry, Stay Foolish.

Docker 基础

Docker 基础

背景与概念

  • docker是基于linux内核实现的虚拟化技术,为程序提供沙盒环境,避免相互干扰。
  • 容器与虚拟机的区别:
    • 创建方式:容器建立在操作系统之上,共享操作系统内核;虚拟机是在操作系统上虚拟出硬件再运行独立的操作系统。
    • 性能开销:容器直接利用操作系统开销小;虚拟机包含整个操作系统开销大。
    • 镜像管理:容器镜像仅包含程序和依赖,体积小,部署容易。
    • 集群规模:容器适合大规模部署,能够快速扩展。
    • 管理方式:容器通过管理工具管理,更加灵活。
  • 镜像:包含应用程序和依赖项的模版,用于创建容器。
  • 容器:是镜像运行的实例,在其中运行应用程序。
  • 仓库:管理和存储镜像的服务,分私有和公共仓库,便于共享和分发镜像,提高部署效率。

原理

  • 容器依赖于linux内核
    • 命名空间:隔离资源(进程ID、网络、文件系统、用户等)
    • 控制组:资源限制与分配(CPU、内存、磁盘、网络等)
    • Union文件系统:镜像分层,使镜像共用底层只保存新增,实现快速复制和启动,避免镜像体积过大。
  • C/S架构,宿主机运行守护进程管理容器,客户端连接服务端进行操作。

镜像分层原理

  • 镜像是由一层一层的文件系统组成,这种层级的文件系统就是UnionFS(联合文件系统)
  • 好处:底层复用,节省空间,加速拉取。
  • 最底层是bootfs,包含启动加载器和内核
  • 往上是rootfs,包含典型Linux中的/dev、/proc、/bin、/etc等标准目录和文件。
  • dockerfile每个指令都会增加一层。
  • 容器启动时,会创建一个可读写的容器层,所有变更都发生在这一层。
  • 容器层下面的都是只读的。

命令

  • 基础命令:
    • docker version:查看安装版本
    • docker –help:查看帮助
    • docker –help:查看具体命令帮助
  • 镜像命令:
    • docker images:查看本地镜像
    • docker search <镜像名>:查找镜像
    • docker pull <镜像名>:拉取镜像,默认tag为latest
    • docker pull <镜像名>::拉取指定tag的镜像
    • docker rmi <镜像名/镜像ID>:删除镜像
    • docker build -t <镜像名>:使用当前目录下的Dockerfile构建镜像
    • docker tag <镜像名>:给镜像打标签
    • docker push <仓库地址>/<镜像名>:上传镜像到仓库
    • docker commit:将容器打包成镜像并上传到仓库
  • 容器命令:
    • docker ps:查看正在运行的容器
    • docker ps -a:查看所有容器,包括停止运行的容器
    • docker run -d -it –name <容器名> -p <宿主端口>:<容器端口> -v <宿主目录>:<容器目录> <镜像名>: /bin/bash:创建并启动容器
    • -d:后台运行
    • -it:交互式运行
    • –name:指定容器名
    • -p:指定端口映射
    • -v:指定目录映射
    • /bin/bash:指定容器启动后执行的命令
    • docker stop <容器名/容器ID>:停止容器
    • docker start <容器名/容器ID>:启动容器
    • docker restart <容器名/容器ID>:重启容器
    • docker rm <容器名/容器ID>:删除容器
    • docker exec -it <容器名/容器ID> /bin/bash:进入容器
    • docker kill <容器名/容器ID>:删除容器:强制终止容器,可能导致数据丢失,进程死循环时无法stop只能kill
    • docker logs <容器名/容器ID>:查看容器日志
    • -f 实时跟踪
    • -n 日志末尾行数
    • docker inspect <容器名/容器ID>:查看容器信息
    • docker cp <容器名/容器ID>:<容器内路径> <宿主目录>:从容器内复制文件到宿主机
    • docker diff <容器名/容器ID>:查看容器变更

Dockerfile

  • FROM:基础镜像
  • MAINTAINER:镜像维护者信息
  • EXPOSE:暴露的端口
  • ADD:复制指定文件到容器中,会自动解压
  • COPY:复制指定文件到容器中
  • VOLUME:容器的挂载卷
  • ENV:环境变量
  • WORKDIR:指定工作目录
  • RUN:容器构建时需要运行的命令
    • 其改变会反映到镜像上,可以多个。
  • CMD:容器启动时需要运行的命令
    • 如果定义了多个,只有最后一个会执行
    • 如果docker run指定了其他命令,会忽略
  • ENTRYPOINT:容器默认启动命令,不会被忽略,一定会执行
  • HEALTHCHECK:健康检查

网络模式

  • bridge:桥接模式(默认),宿主创建一个虚拟网桥docker0,容器创建一个虚拟网卡eth0,并连接到docker0
  • host:宿主模式,使用宿主的网络命名空间,相同IP和端口
  • none:无网络模式,容器没有网卡
  • container:容器模式,和已有容器共享网络命名空间

安装

安装docker

# 添加docker官方yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动+自启动
systemctl enable --now docker
# 查看状态
systemctl status docker
# 验证安装
docker run hello-world

添加镜像源

#insecure-registries 下为 http 镜像仓库。

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries": [
    "192.168.3.80:30500"
  ]
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

# 重启Docker组件
systemctl daemon-reload && systemctl restart docker

# 检查Docker组件状态
systemctl status docker 

推送私有仓库

# 查看私有仓库镜像
curl http://192.168.3.80:30500/v2/_catalog

# 打标签
docker tag xxx:192.168.3.80:30500/xxx:latest

# 推送
docker push 192.168.3.80:30500/registry:latest