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