Docker介绍及其基础简介(一)

Docker简介及部署方法

一.Docker的简介

1.1Docker的简介

Docker之父Solomon Hykes:Docker就好比传统的货运集装箱

2008 年LXC(LinuX Contiainer)发布,但是没有行业标准,兼容性非常差

docker2013年首次发布,由Docker, Inc开发

1.1.1什么是容器

一句话理解

docker是一个 OS 级虚拟化容器平台:

用 镜像 打包应用和依赖,用 容器 隔离运行,用 仓库 分发镜像。

容器 = 镜像 + 可写层 + 隔离环境 + 资源限制

Docker是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术

它具有以下几个重要特点和优势:

  1. 轻量级虚拟化:Docker 容器相较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省系统资源。

例如,启动一个 Docker 容器可能只需要几秒钟,而启动一个虚拟机则可能需要几分钟。

  1. 一致性 . 致性:确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。

无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。

  1. 可移植性:可以轻松地将 Docker 容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差异。

比如,在本地开发的容器可以无缝部署到云服务器上。

  1. 高效的资源利用:多个 Docker 容器可以共享主机的操作系统内核,从而更有效地利用系统资

源。

  1. 易于部署和扩展:能够快速部署新的应用实例,并且可以根据需求轻松地进行水平扩展。

总之,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://docs.docker.com/

国内站点: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

相关推荐
sbjdhjd8 小时前
云安全 | Docker 容器逃逸复盘(三):docker.sock 挂载与 Docker-in-Docker 风险
经验分享·网络安全·docker·云原生·容器·kubernetes·云安全
热爱Liunx的丘丘人8 小时前
1、什么是K8s
云原生·容器·kubernetes
openFuyao1 天前
新增Agent沙箱调度能力!openFuyao v26.09社区发行版上线,AI原生基础设施能力进一步升级
云原生·ai-native·ai推理·openfuyao·多样化算力集群软件
阿里云云原生1 天前
云效工作项智能优化:先澄清,再开工
云原生
阿里云云原生1 天前
阿里云日志服务 SLS 全新升级,打造 Agent 时代的智能数据引擎
云原生
阿里云云原生1 天前
从“治已病”到“治未病”:浩瀚能源与阿里云共建充电补能异地双活高可用体系实践
云原生
wzq11_6661 天前
kubernetes集群——灰度发布
云原生·容器·kubernetes
阿里云云原生1 天前
阿里云发布 Alibaba Cloud AI Agent Handbook,阐述“智能面积”
云原生
Zhu7582 天前
在k8s环境中,离线部署与使用Topograph
云原生·容器·kubernetes