目录
因为Docker轻便、快速的特性,可以使应用达到快速选代的的目的。每次小的变更,马上就可以看到效果,而不用将若干个小变更积攒到一定程度再变更。每次变更一小部分其实是一种非常安全的方式,在开发环境中能够快速提高工作效率。
Docker容器能够帮助开发人员、系统管理员、质量管理和版本控制工程师在一个生产环节中一起协同工作。制定一套容器标准能够使系统管理员更改容器的时候,程序员不需要关心容器的变化,而更专注自己的应用程序代码。从而隔离开了开发和管理,简化了开发和部署的成本。
如果要方便的创建运行在云平台上的应用,必须要脱离底层的的硬件,同时还需要任何时间地点可获取这些资源,这正是Docker所能提供的。Docker的容器技才可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率。
docker是目前较为主流的容器技术。容器技术是一种轻量级的虚拟化技术,它可以让应用程序及其依赖项打包在一个独立的单元中运行,从而实现应用的隔离、可移植性和资源的高效利用。以下从概念、原理、与传统虚拟化技术的对比、优势、应用场景等方面详细介绍容器技术容器就像是一个独立的"盒子",这个"盒子"里装着运行某个应用所需要的所有东西,包括代码、运行时环境、系统工具、系统库等。不同的容器之间相互隔离每个容器都有自己独立的文件系统、进程空间、网络接口等,就好像它们是在不同的机器上运行一样,但实际上它们是共享宿主机的操作系统内核。
Docker容器运行速度很快,启动和停止可以在秒级实现,比传统虚拟机要快很多;Docker核心解决的问题是利用容器来实现类似虚拟机的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源因此,Docker容器除了运行其中的应用之外,基本不消耗额外的的系统资源,在保证应用性能的同时,又减小了系统开销,使得一台主机上同时运行数千个Docker容器成为可能。传统虚拟化技术(如VMWare、VirtualBox等)是通过虚拟机管理程序(Hypervisor)在物理服务器上创建多个虚拟机(VM),每个虚拟机都包含完整的操作系统。而容器技术是在操作系统层面进行虚拟化,多个容器共享宿主机的操作系统核。资源占用:传统虚拟机需要为每个虚拟机分配独立的操作系统,这会占用大量的系统资源;
而容器共享宿主机的内核,只包含应用及其依赖项,资源占用相对较少,启动速度也更快。
隔离性:虚拟机提供了更高程度的隔离,因为每个虚拟机都有自己独立的操作系统;容器的
隔离性相对较弱,但对于大多数应用场景来说已经足够,并且可以通过合理的配置和管理来增强隔离性。性能:由于虚拟机存在额外的虚拟化层,会带来一定的性能开销;容器直接运行在宿主机的内核上,性能损耗较小,更接近原生应用的性能。容器技术的优势主要体现在以下几个方面:隔离性:不同的容器之间相互隔离,一个容器的故障或异常不会影响响其他容器的运行,提高了应用的稳定性和安全性。
可移植性:容器将应用及其依赖项打包成一个独立的单元,使得应用可以在不同的环境中(如开发环境、测试环境、生产环境)无缝迁移和运行,避免了"在我的机器上能运行,但在
你的机器上不行"的问题。资源高效利用:容器共享宿主机的操作系统内核,不需要为每每个应用运行独立的操作系统,大大减少了资源的浪费,提高了服务器的利用率。
快速部署和扩展:容器的启动速度非常快,通常只需要几秒中,而且可以根据需要快速创建
和销毁容器,方便进行应用的快速部署和弹性扩展。
开发环境管理:开发人员可以使用容器来创建一致的开发环境,确保团队成员之间的环境一致性,提高开发效率。持续集成和持续部署(CI/CD):在CI/CD流程中,容器可以帮助实现应用的快速打包、测试和部署,实现自动化的软件开发流程。
微服务架构:容器技术非常适合微服务架构,每个微服务可以打包成一个独立的容器,独立开发、测试和部署,提高系统的可伸缩性和容错性。云计算:云服务提供商可以利用容器技术为用户提供更高效、灵活的计算资源,用户可以根据自
己的需求快速创建和管理容器化的应用。
(1)镜像
镜像、容器、仓库是Docker的三大核心概念。其中Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。例如:一个镜像可以是一个完整的CentOS操作系统环境,称为一个Centos镜像;也可以是一个安装了MySQL的应用程序,称之为一个MySQL镜像等等。Docker提供了简单的机制来创建和更新现有的镜像,用户也可可以从网上下载已经创建好的镜像直接使用。
(2)容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证安全性的平台。可以将容器看作是一个简易版的Linux环境,Docker利用容器来运行和隔离应用。
(3)仓库
Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在王另外一台机器上使用这个镜像时,只需从仓库获取仓库注册服务器(Registry)是存放仓库的地方,其中包含了多个仓库。每个仓库集中存放某一类镜像,并且使用不同的标签(tag)来区分它们。目前最大的公共仓库是dockerHub,存放了数量庞大的镜像供用户下载使用
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/=enforcing/=disabled\' /etc/selinux/config
下载Docker的repo文件
curl
/etc/yum.repos.d/docker-ce.repo
https://mirrors.aliyun.com/docker-ce/linux/cento/docker-ce.repo
替换仓库地址
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-dce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo
更新索引文件并安装Docker
dnf clean all
dnf makecache
dnf -y install docker-ce
添加国内镜像站
mkdir /etc/docker/
cat>/etc/docker/daemon.json<<EOF
'exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.m.daocloud.io"",
"https://docker. imgdb.de",
"https://docker-0. unsee.tech",
"https://docker.hlmirror.com"
EOF
开启Docker服务
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
docker version
优化内核参数
cat>> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p
查看本地镜像
docker images # 查看所有本地镜像
docker images -a # 显示所有镜像(包括中间层镜像)
docker images --digests # 显示镜像摘要
docker images --filter "dangling=true" # 查看虚悬镜像(无标签镜像)
拉取镜像
docker pull <镜像名>:<标签> # 例如:docker pull nginx:1.23.1
docker pull <仓库地址>/<镜像名>:<标签> # 从私有仓库拉取
搜索镜像
docker search <关键词> # 例如:docker search mysql
docker search --filter "is-official=true" mysql # 只显示官方镜像
构建镜像
docker build -t <镜像名>:<标签> <上下文路径>
# 示例:当前目录下的 Dockerfile 构建名为 myapp 的镜像
docker build -t myapp:1.0 .
# 常用参数:
-docker build --no-cache # 不使用缓存
-docker build --build-arg ENV=dev # 设置构建参数
标签与重命名镜像
docker tag <原镜像>:<标签> <新镜像>:<标签>
# 示例:为本地镜像添加远程仓库标签
docker tag myapp:1.0 registry.example.com/myteam/myapp:1.0
推送镜像
docker push <镜像名>:<标签>
# 示例:推送到 Docker Hub
docker push username/myapp:1.0
# 推送到私有仓库前需先登录:
docker login registry.example.com
docker push registry.example.com/myteam/myapp:1.0
删除镜像
docker rmi <镜像ID> # 删除单个镜像
docker rmi <镜像1> <镜像2> # 删除多个镜像
docker rmi -f <镜像ID> # 强制删除(慎用)
# 删除所有虚悬镜像(无标签镜像):
docker image prune
# 删除所有未使用的镜像:
docker image prune -a
导出与导入镜像
docker save -o <文件名.tar> <镜像名>:<标签>
# 示例:
docker save -o myapp.tar myapp:1.0
docker load -i <文件名.tar>
查看镜像详细信息
docker inspect <镜像名> # 查看镜像元数据
docker history <镜像名> # 查看镜像构建历史
清理镜像
# 删除所有未使用的镜像(释放空间):
docker image prune -a --force
# 按条件删除镜像(示例:删除7天前的镜像):
docker images --format '{{.ID}} {{.CreatedSince}}' | grep 'weeks ago' | awk '{print $1}' | xargs docker rmi -f
查看容器
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括已停止的)
docker ps -q # 只显示容器ID
docker ps -l # 查看最近创建的容器
创建并启动容器
docker run [选项] <镜像名> [命令]
# 示例:启动一个交互式的 Ubuntu 容器
docker run -it ubuntu bash
# 常用选项:
-d # 后台运行(守护态)
-p 8080:80 # 端口映射(主机:容器)
-v /host/path:/container/path # 挂载卷
--name mycontainer # 指定容器名称
-e ENV_VAR=value # 设置环境变量
--restart always # 自动重启策略
--network mynetwork # 加入网络
启动、停止、重启容器
docker start <容器ID或名称> # 启动已停止的容器
docker stop <容器ID或名称> # 优雅停止容器(发送 SIGTERM)
docker kill <容器ID或名称> # 强制停止容器(发送 SIGKILL)
docker restart <容器ID或名称> # 重启容器
进入运行中的容器
docker exec -it <容器ID或名称> <命令>
# 示例:进入正在运行的 Nginx 容器的 shell
docker exec -it nginx-container bash
删除容器
docker rm <容器ID或名称> # 删除已停止的容器
docker rm -f <容器ID或名称> # 强制删除运行中的容器
docker rm $(docker ps -aq) # 删除所有容器(慎用!)
docker container prune # 删除所有已停止的容器
查看容器日志
docker logs <容器ID或名称> # 查看容器日志
docker logs -f <容器ID或名称> # 实时跟踪日志(类似 tail -f)
docker logs --since 10m <容器ID或名称> # 查看最近10分钟的日志
查看容器状态和资源使用
docker inspect <容器ID或名称> # 查看容器详细信息
docker stats <容器ID或名称> # 实时监控容器资源使用
docker top <容器ID或名称> # 查看容器内运行的进程
容器与主机间文件传输
# 从容器复制到主机
docker cp <容器ID或名称>:<容器路径> <主机路径>
# 示例:
docker cp nginx-container:/etc/nginx/nginx.conf ./
# 从主机复制到容器
docker cp <主机路径> <容器ID或名称>:<容器路径>
导出与导入容器
# 导出容器为tar文件(会丢失历史层)
docker export <容器ID或名称> > container.tar
# 从tar文件导入为镜像
docker import container.tar myimage:new
容器端口映射与网络
docker port <容器ID或名称> # 查看容器端口映射
docker network connect <网络名> <容器ID或名称> # 连接容器到网络
docker network disconnect <网络名> <容器ID或名称> # 断开容器网络连接
容器资源限制
# 启动容器时限制CPU和内存
docker run -it \
--cpus="0.5" \ # 限制使用0.5个CPU核心
--memory="512m" \ # 限制内存512MB
ubuntu bash
容器监控与健康检查
# 添加健康检查(在Dockerfile中)
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
# 查看容器健康状态
docker inspect --format='{{json .State.Health}}' <容器ID或名称> | jq
启动一个 MySQL 容器
docker run -d \
--name mysql-server \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=mydb \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
启动一个 Nginx 容器并挂载静态网站
docker run -d \
--name nginx-web \
-p 80:80 \
-v /path/to/html:/usr/share/nginx/html \
nginx:alpine
使用 Docker Compose 启动多容器应用
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
app:
image: python:3.9
command: python app.py
volumes:
- ./app:/app
启动
docker-compose up -d