Docker简介及部署方法
一.Docker的简介
1.1Docker的简介

Docker之父Solomon Hykes:Docker就好比传统的货运集装箱
2008 年LXC(LinuX Contiainer)发布,但是没有行业标准,兼容性非常差
docker2013年首次发布,由Docker, Inc开发
1.1.1什么是容器
一句话理解
docker是一个 OS 级虚拟化容器平台:
用 镜像 打包应用和依赖,用 容器 隔离运行,用 仓库 分发镜像。
容器 = 镜像 + 可写层 + 隔离环境 + 资源限制
Docker是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术
它具有以下几个重要特点和优势:
- 轻量级虚拟化:Docker 容器相较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省系统资源。
例如,启动一个 Docker 容器可能只需要几秒钟,而启动一个虚拟机则可能需要几分钟。
- 一致性 . 致性:确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。
无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。
- 可移植性:可以轻松地将 Docker 容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差异。
比如,在本地开发的容器可以无缝部署到云服务器上。
- 高效的资源利用:多个 Docker 容器可以共享主机的操作系统内核,从而更有效地利用系统资
源。
- 易于部署和扩展:能够快速部署新的应用实例,并且可以根据需求轻松地进行水平扩展。
总之,Docker 极大地简化了应用程序的开发、部署和管理流程,提高了开发效率和运维的便利性。
它在现代软件开发和云计算领域得到了广泛的应用。
1.1.2 核心概念
| 概念 | 说明 |
|---|---|
| 镜像 Image | 只读模板,分层存储,包含应用和依赖 |
| 容器 Container | 镜像的运行实例,可读可写,可启动/停止/删除 |
| 仓库 Registry | 存放镜像,如 Docker Hub、Harbor、私有 Registry |
| Dockerfile | 构建镜像的脚本文件 |
| Volume | 数据卷,用于持久化数据 |
| Network | 容器网络,实现容器间通信 |
| Compose | 单机多容器编排工具 |
| Swarm / K8s | 集群编排,K8s 更主流 |
Docker 架构: Client → dockerd → containerd → runc 镜像默认从 Registry 拉取。
1.1.3docker与虚拟化的对比
| 虚拟机 | docker容器 | |
|---|---|---|
| 操作系统 | 宿主机上运行虚拟机OS | 共享宿主机OS |
| 存储 | 镜像较大(GB) | 镜像小(MB) |
| 性能 | 操作系统额外的cpu,内存消耗 | 几乎无性能损耗 |
| 移植性 | 笨重,与虚拟技术耦合度高 | 轻量,灵活迁移 |
| 隔离性 | 完全隔离 | 安全隔离 |
| 部署 | 慢 | 快速,秒级 |
| 运行密度 | 一般十几个 | 单位支持上前容器 |
二.部署docker

2.1.部署第一个容器
国内站点:https://
#博主用的是rhel9.3的镜像
#用rpm -qa 检查一下你的虚拟机里面有没有podman,如若有请卸掉,podman与docker产生冲突
root@docker \~# rpm -qa | grep podman
podman-4.6.1-5.el9.x86_64
cockpit-podman-76-1.el9_3.noarch
#博主的虚拟机上面有,所以需要卸掉
root@docker \~# dnf remove podman-4.6.1-5.el9.x86_64
#卸完后在次查询
root@docker \~# rpm -qa | grep podman
2.2 配置软件仓库
[root@docker ~]# cd /etc/yum.repos.d/ [root@docker yum.repos.d]# ls base9-3.repo base9_3.repo redhat.repo [root@docker yum.repos.d]# vi docker.repo [docker] name=docker-ce baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable gpgcheck=0 [root@docker yum.repos.d]# dnf list docker-ce --shpwduplicates [root@docker yum.repos.d]# dnf install docker-ce --downloadonly --downloaddir /mnt/ #不安装,表示把docker这几个包下载到/mnt/目录中 [root@docker yum.repos.d]# cd /mnt [root@docker mnt]# ls containerd.io-2.3.6-1.el9.x86_64.rpm docker-buildx-plugin-0.37.1-1.el9.x86_64.rpm docker-ce-29.8.1-1.el9.x86_64.rpm docker-ce-cli-29.8.1-1.el9.x86_64.rpm docker-ce-rootless-extras-29.8.1-1.el9.x86_64.rpm docker-compose-plugin-5.5.1-1.el9.x86_64.rpm hgfs
2.3 安装docker-ce并启动服务
#安装docker [root@docker mnt]# yum install docker-ce -y #编辑docker启动文件,设定其使用iptables的网络设定方式,默认使用nftables [root@docker mnt]# vi /lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -- iptables=true [root@docker mnt]# systemctl enable --now docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
2.4 激活内核网络选项
#开机时能够自动激活 [root@docker mnt]# echo br_netfilter > /etc/modules-load.d/docker_mod #当前就能够生效 [root@docker mnt]# modprobe br_netfilter [root@docker mnt]# lsmod | grep br_netfilter br_netfilter 36864 0 bridge 405504 1 br_netfilter [root@docker mnt]# vi /etc/sysctl.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 [root@docker mnt]# sysctl -p net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 #启动docker [root@docker mnt]# systemctl restart docker
2.5 配置镜像加速器
[root@docker ~]# cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://docker.1ms.run"] } EOF [root@docker ~]# systemctl restart docker [root@docker ~]# docker info Registry Mirrors: https://docker.1ms.run/
三.Docker的基本操作
3.1 Docker镜像管理
3.1.1 搜索镜像
原理:docker pull 走镜像加速器所以可以正常拉取镜像,docker search 不支持镜像加速器,只能直连官方源,需要让docker走代理,
需要使用魔法(懂得都懂)
1>Clash Verge 开启局域网监听
a.设置系统设置局域网连接(Allow LAN)打开 b.端口设置确认:混合端口7897 c.!注意:开关切换后可能不立即生效,需完全退出ClashVerge,再重新打开
2>用Win+R打开cmd
# 查看监听的端口是否对外 C:\Users\35156>netstat -ano | findstr 7897 | findstr LISTENING ---必须看到 0.0.0.0:7897 这个,才能算是对外监听 # 查询本机ip C:\Users\35156>ipconfig IPv4 地址 . . . . . . . . . . . . : 172.24.24.X
3>防火墙放行7897端口
1.以管理员身份打开 Powershel1(win+X-终端(管理员), PS C:\WINDOWS\system32> New-NetFirewallRule -DisplayName "Clash LAN 7897" -Direction Inbound -LocalPort 7897 -Protocol TCP -Action Allow
4>在虚拟机里面测试代理连通性(需要开着魔法)
curl -x http://192.168.168.1:7897 -I https://www.google.com
5> 写入Docker代理
[root@docker ~]# mkdir -p /etc/systemd/system/docker.service.d [root@docker ~]# tee /etc/systemd/system/docker.service.d/proxy.conf <<'EoF [service] Environment="HTTP_PRoxY=http://192.168.168.1:7897" Environment="HTTPS_PROxY=http://192.168.168.1:7897" Environment="No_PRoxY=localhost,127.0.0.1,192.168.168.0/24" OF [root@docker ~]# systemctl daemon-reload [root@docker ~]# systemctl restart docker
6> 验证
[root@docker ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx Official build of Nginx. 20094 [OK]
3.1.2 拉取镜像
方法一:本地拉取
# 创建一个新的文件(用于放docker镜像) [root@docker ~]# mkdir -p /root/docker/images [root@docker ~]# cd /root/docker/images/ #在网络上将容器镜像下载下来,用 [root@docker images]# ls nginx-1.27.2.tar.gz nginx-latest.gz [root@docker images]# docker load -i nginx-latest.gz [root@docker images]# docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA nginx:latest 7d2ee22b1699 391MB 192MB
注:需要这些资源请联系博主
方法二:docker pull 拉取
# 配置国内加速器 [root@docker images]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://docker.m.daocloud.io"] } [root@docker images]# systemctl restart docker [root@docker images]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx f7e1db57b58b: Pull complete 947d22046304: Pull complete 8020170dc65f: Pull complete 1efc53192927: Pull complete 04bdbc7ea6b5: Pull complete 807ab930f3a0: Pull complete ecc510c1e359: Pull complete a1b85ab28c90: Download complete c329293b1d90: Download complete Digest: sha256:f9ea18bfa4fad859e1ed38259d711da7ccad2c3516e875cec3351a57c859f571 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest [root@docker images]# docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA nginx:latest f9ea18bfa4fa 240MB 66.7MB
方法三:私有仓库拉取
# 公共仓库 Docker Hub docker login # 私有仓库 Harbor docker login harbor.test.com -u admin -p Harbor12345 # 示例1:推送到Docker Hub(用户名是myuser) docker tag nginx:1.25 myuser/nginx:1.25 # 示例2:推送到私有Harbor仓库 docker tag nginx:1.25 harbor.test.com/library/nginx:1.25 # Docker Hub docker push myuser/nginx:1.25 # Harbor私有仓库 docker push harbor.test.com/library/nginx:1.25
3.1.3pull和push对比速记
| 命令 | 方向 | 作用 |
|---|---|---|
docker pull |
仓库 → 本地 | 从仓库下载镜像到本机 |
docker push |
本地 → 仓库 | 将本地镜像上传到仓库 |
3.2 容器的启动
[root@docker images]# docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA nginx:latest f9ea18bfa4fa 240MB 66.7MB [root@docker images]# docker run -d --name webserver -p 80:80 nginx:latest 3d97c2317e657390446b23368a4facfdce5d5995146a7f5a686ac4d4615202c8 # docker run 启动 # -d 后台运行 # --name XXXX 自行拟定容器运行名称 # -p 80:80 指定端口(默认情况下就是80端口,可以自行修改) # nginx:latest 需要运行的容器
# 非交互式运行容器 [root@docker ~]# docker run -d --name web -p 80:80 nginx:latest 714ebed35e5b612503faa0ac64e45c8412a3e09787d46583e5b387adb93ccd77 # 查看容器运行状态 (ps) [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 714ebed35e5b nginx:latest "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp web # 交互式运行容器 [root@docker ~]# docker run -it --name busybox busybos:latest
3.2.1 查看容器的运行信息
# 查看当前运行容器 [root@docker ~]# docker ps # 查看所有容器 [root@docker ~]# docker ps -a # 查看容器运行的详细信息 [root@docker ~]# docker inspect nginx
3.3 容器的停止
[root@docker images]# docker stop webserver [root@docker images]# docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA nginx:latest f9ea18bfa4fa 240MB 66.7MB U
# 停止容器 [root@docker ~]# docker stop web # 杀死容器 [root@docker ~]# docker kill web # 开启停止的容器 [root@docker ~]# docker start web # 删除停止的容器 [root@docker ~]# docker rm web # 强制删除已经运行的容器 [root@docker ~]# docker rm -f web # 删除所有停止的容器 [root@docker ~]# docker conainer prune -f
3.4 查看镜像信息
# 查看系统中的镜像信息 [root@docker ~]# docker images # 查看镜像的详细信息 [root@docker ~]# docker images inspect nginx:latest(镜像的名称) # 查看对镜像的修改记录 [root@docker ~]# docker history nginx:latest
3.5 导出镜像(保存镜像)
#保存镜像 [root@docker ~]# docker image save nginx:latest -o nginx-latest.tar.gz # -o:指定导出镜像的位置; # 可以同时导出多个镜像到一个文件中 # 指定.tar.gz 可以导出并压缩。
3.6 删除镜像
[root@docker ~]# docker rmi nginx:latest # 查看状态 [root@docker ~]# docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA # 由于前面已经保存过镜像所以现在进行解压缩恢复 # 将tar包里面保存的Docker镜像解压缩 [root@docker ~]# docker load -i nginx-latest.tar.gz # 重新查看 [root@docker ~]# docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA nginx:latest f9ea18bfa4fa 240MB 66.7MB
3.7 容器内外复制数据
3.7.1 把容器外的文件复制到容器内部
开启容器
root@docker \~# systemctl restart docker
查看容器状态
root@docker \~# docker images
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
nginx:latest f9ea18bfa4fa 240MB 66.7MB U
registry.cn-guangzhou.aliyuncs.com/os_cmty/os_cmty:mario
0e74a25d8e8d 431MB 207MB U
运行nginx:latest这个容器
root@docker \~# docker run -d -- name webservers -p 80:80 nginx:latest
查看容器运行的状态
root@docker \~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ddffbce99cb8 nginx:latest "/docker-entrypoint...." 9 seconds ago Up 9 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp webservers
root@docker \~# vi index.html
hello world
将你写进去的东西复制到容器里面
root@docker \~# docker cp index.html webservers:/usr/share/nginx/html
Successfully copied 12B (transferred 2.05kB) to webservers:/usr/share/nginx/html
注意: 你要放进的文件必须是存在的,不然找不到
开启容器指令命令的
root@docker \~# docker exec -it webservers /bin/bash
root@ddffbce99cb8:/# ls /usr/share/nginx/html/
50x.html index.html
root@ddffbce99cb8:/# cat /usr/share/nginx/html/index.html
hello world
root@docker \~# curl 192.168.168.10
hello world
3.7.2 把容器内部的文件复制到容器外
先将写好的东西删掉,这样外面没有了容器里面还有
root@docker \~# rm -rf index.html
root@docker \~# docker cp webservers:/usr/share/nginx/html/index.html /mnt
Successfully copied 12B (transferred 2.05kB) to /mnt
root@docker \~# ls /mnt/
docker-ce-29.8.1.tar.gz hgfs index.html
root@docker \~# cat /mnt/index.html
hello world
root@docker \~#
四.小游戏
4.1 上传资源
注:这是博主老师发的资源,如果需要,请联系博主
# 这是主播之前创建的文件 [root@docker ~]# cd /root/docker/images/ [root@docker images]# ls mario.tar nginx-1.27.2.tar.gz nginx-latest.gz [root@docker images]# docker load -i mario.tar
4.2 运行容器
[root@docker images]# docker run -d --name mario -p 80:8080 registry.cn-guangzhou.aliyuncs.com/os_cmty/os_cmty:mario
4.3 浏览器输入虚拟机IP
