Docker简介与概念
一、什么是容器化技术?优势是什么?
容器化技术:
一种操作系统级的虚拟化技术;简单理解为“微型的虚拟机”;
-
特点:
-
一致性:应用在不同环境(从开发者电脑到生产服务器)运行效果一致,避免 “在我电脑上能跑,到你电脑上跑不了” 的问题。
-
轻量级:容器共享宿主机操作系统内核,比虚拟机更轻量,启动快、资源占用少,能在一台机器上运行更多容器。
-
易移植:容器可快速在不同服务器、云平台间迁移,部署更便捷。
-
版本控制和组件复用:Docker 允许开发者使用 Dockerfile 来定义应用的环境,并通过 Docker Hub 等平台共享和复用容器镜像,简化了应用的构建和管理过程。
-
隔离性:每个容器相互隔离,一个容器出问题不会影响其他容器。
-
易于扩展:Docker 容器可以快速创建和销毁,非常适合需要弹性扩展的应用场景,如微服务架构。
-
功能与优势:
1.实现应用之间隔离运行;
2.实现应用的一键“打包”,将应用服务、依赖环境打包成镜像;
3.让应用可以在不同的系统中拥有一致的运行环境;
4.对不同的容器进行资源限制和管理;
5.一键运行容器;
二、Docker简介?
Docker
-
Docker是使用Go语言开发的一种容器管理工具、容器运行时(Container run time);
-
RUNC、Podman、Containerd、LXC、CRI-O
-
Docker 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。
三、容器与镜像:
-
容器:一个运行中的镜像,类似于一个进程;
-
镜像:容器的模板,是静态文件,类似一个安装包;
-
镜像仓库:存放各种镜像的下载站点;官方Docker hub;公司内部可以搭建私有仓库;
四、容器与虚拟机的区别:

-
优点
-
应用程序运行环境强隔离
-
虚拟机操作系统与底层操作系统无关化
-
虚拟机内部操作不会影响到物理机
-
-
缺点
-
虚拟机中的操作系统会占用部署资源及存储
-
网络传输效率低
-
当应用程序需要调用硬件响应用户访问时间延迟大
-

-
优点
-
可以实现应用程序的隔离
-
直接使用物理机的操作系统可以快速响应用户请求
-
不占用部署时间
-
占用少量磁盘空间
-
1、架构对比
| 特性 | 虚拟机 | Docker容器 |
|---|---|---|
| 隔离级别 | 硬件级别虚拟化 | 操作系统级别虚拟化 |
| 操作系统 | 每个VM需要完整OS | 共享宿主机OS内核 |
| 资源占用 | 重量级,占用较多资源 | 轻量级,资源占用少 |
| 启动时间 | 分钟级别 | 秒级别 |
| 性能开销 | 较大 | 接近原生性能 |
| 镜像大小 | GB级别 | MB级别 |
2、容器 VS 虚拟机架构

3、使用场景对比
虚拟机适用场景:
-
需要完全隔离的环境
-
运行不同操作系统的应用
-
需要硬件级别的安全隔离
Docker容器适用场景:
-
微服务架构
-
CI/CD流水线
-
应用快速部署和扩展
-
开发环境标准化
五、容器的底层技术是什么?
容器的底层主要依赖 Linux 的三项核心技术:
-
命名空间(Namespaces):Linux内核中提供命名空间功能,用于隔离进程、隔离网络、隔离文件系统,让容器内的进程感觉自己是在一个独立的环境中运行。
-
控制组(Cgroups):资源限制,用于限制和分配容器可以使用的资源(如 CPU、内存、磁盘 I/O 等),防止某个容器过度占用资源影响其他容器或宿主机。
-
分层文件系统(OverlayFS):镜像文件分层技术,用于创建镜像的分层结构,使得镜像可以共享底层的公共部分,减少存储空间占用,同时也支持容器的可写层。
六、Docker可以做什么?
1.快速部署应用服务;
2.可以统一开发、测试、生产环境,避免因环境问题导致的服务异常;
安装Docker
-
配置Docker镜像加速
Centos7安装Docker的步骤(尝试失败)
systemctl stop firewalld
setenforce 0
mount /dev/cdrom /media
#安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#下载Docker官方yum源
wget https://download.docker.com/linux/centos/docker-ce.repo -P /etc/yum.repos.d/
#替换为清华源
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
#卸载旧版本
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
#安装Docker
yum -y install docker-ce
===========================安装不上==================================
#备份并删除原有源配置:先清理失效的官方源和之前添加的 extras 源,避免冲突
#备份原有源(可选,防止后续需要恢复)
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
#仅保留 Docker CE 源(如果之前配置过,若没有可忽略此步)
mv /etc/yum.repos.d/backup/docker-ce.repo /etc/yum.repos.d/
# CentOS 官方将停止维护的 7版本镜像迁移到了 vault.centos.org,手动创建CentOS7归档源配置文件(关键,提供可用依赖)
cat > /etc/yum.repos.d/CentOS-Vault.repo << EOF
[base]
name=CentOS-7 - Base (Vault)
baseurl=http://vault.centos.org/7.9.2009/os/\$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-7 - Updates (Vault)
baseurl=http://vault.centos.org/7.9.2009/updates/\$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-7 - Extras (Vault)
baseurl=http://vault.centos.org/7.9.2009/extras/\$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-CentOS-7
EOF
#这里使用 7.9.2009(CentOS 7 最后一个稳定版本)的归档源,确保依赖包完整可用。
#EPEL 7 也需使用归档源,避免源地址失效(提供 fuse-overlayfs 等)
cat > /etc/yum.repos.d/epel-vault.repo << EOF
[epel]
name=Extra Packages for Enterprise Linux 7 - \$basearch (Vault)
baseurl=http://download.fedoraproject.org/pub/epel/7/\$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=\$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
EOF
#清理缓存并重建源索引
yum clean all && yum makecache fast
#执行后会加载归档源的包索引,此时应无 404 错误。
#重新 Docker 依赖
#安装 container-selinux(从 extras 归档源获取)
yum -y install container-selinux
#安装 fuse-overlayfs 和 slirp4netns(从 EPEL 归档源获取)
yum -y install fuse-overlayfs slirp4netns
#再次安装 Docker CE
yum -y install docker-ce
====================================================================
#启动Docker
systemctl start docker
#设置开机自启
systemctl enable docker
#显示结果:Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
#验证启动
systemctl status docker
#验证版本
docker -v
#显示结果:Docker version 26.0.1, build d260a54
Ubuntu安装Docker的步骤
# 1.卸载残留Docker软件包(之前没安装过的可跳过)
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
# 1、更新Ubuntu软件包列表和已安装软件的版本升级
sudo apt update
sudo apt upgrade
后面会出现两个粉色框框,我默认选的OK
# 2、安装Docker依赖
apt-get -y install ca-certificates curl gnupg lsb-release
# 3、自动清理 “自动安装且当前无依赖” 的冗余包
sudo apt autoremove -y
# 4、添加Docker官方GPG密钥,最终回显OK表示运行命令正确
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 5、添加Docker软件源,按回车键
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 6、安装Docker
apt-get -y install docker-ce docker-ce-cli containerd.io
# 后面Docker安装好会自动启用
docker client 与 daemon分离
# 1、关闭docker(因为Docker是默认开启的)
systemctl stop docker
# 2、设置docker配置文件,默认没有,用registry-mirrors设置国内镜像站,加速下载镜像(写三五个镜像就行,都写也行)
[root@zuolaoshi ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
"https://5tqw56kt.mirror.aliyuncs.com",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn",
"http://mirror.azure.cn",
"https://hub.rat.dev",
"https://docker.chenby.cn",
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://dockerpull.org",
"https://dockerhub.icu",
"https://proxy.1panel.live",
"https://docker.1panel.top",
"https://docker.1ms.run",
"https://docker.ketches.cn"
],
"insecure-registries": [
"http://192.168.57.200:8099"
],
"hosts": [
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
]
}
# 3、重载docker服务、重启docker生效配置
systemctl daemon-reload
systemctl restart docker
---------------------------------------------------------
### 如果这里出错(改完错回第三步重新加载、重启)
# 如果日志显示没错但还不能启动Docker,那先停止手动启动的Docker
Ctrl + C(没退出的话先停止,退出就跳过)
sudo pkill -f dockerd
然后再重启
# 如果是启动命令有问题,查看Docker 服务的启动命令
grep ExecStart /lib/systemd/system/docker.service
正常默认配置应为:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 如果是dockerd--containerd 连在一起了,中间缺少空格
nano /lib/systemd/system/docker.service
然后找到ExecStart行,把“-H fd://”删掉
---------------------------------------------------------
### 下次尝试直接替换
sudo sed -i 's/ExecStart=\/usr\/bin\/dockerd -H fd:\/\/ --containerd=\/run\/containerd\/containerd.sock/ExecStart=\/usr\/bin\/dockerd --containerd=\/run\/containerd\/containerd.sock/' /lib/systemd/system/docker.service
---------------------------------------------------------
# 4、查看docker的监听地址和2375端口
[root@zuolaoshi ~]# netstat -ntpl |grep 2375
会显示tcp6 0 0 :::2375 :::* LISTEN 21219/dockerd
Docker常用命令
镜像常用命令:
# 1.查找镜像
docker search ubuntu
# 2.下载镜像
docker pull 镜像:版本
# 3.查看本地镜像
docker images
# 4.查看镜像的详细信息☆☆☆
docker inspect 镜像:版本
# 5.查看所有镜像的 ID
docker images -aq
# 6.将镜像保存为tar文件
docker save 镜像:版本 -o 镜像.tar
# 7.删除镜像
docker rmi 镜像名
# 8.将镜像文件加载到本地镜像仓库
docker load -i 镜像.tar
# 9.删除所有镜像、清空镜像仓库
docker rmi $(docker images -aq)
或者docker rmi `docker images -aq`
# 10.批量导入所有镜像
for img in 'ls *.tar';do docker load -i $img;done
容器常用命令:
# 1.查看正在运行的容器
docker ps
# 2.查看运行与曾运行的容器
docker ps -a
# 3.使用镜像运行容器
docker run
常用参数:
--name #给容器起名,起ID
-i #交互式启动
-t #分配终端
-d #后台执行容器,守护进程
-v或者--volume #目录映射,容器目录挂载到宿主机目录 格式: 真机路径:容器路径
-p #指定端口映射,格式:真机端口:容器内部端口
-P #随机端口映射,(49153起始 49153到65535)
-e #设置容器中的环境变量
--network #指定网络,NAT、桥接、无网络模式
--rm #容器停止时,自动删除容器和容器中的数据
-u #以什么用户身份创建容器,一般默认root
-h #指定容器的主机名,一般默认是容器ID的前n位
-m #设置容器可以使用内存的最大值
docker run -itd --name nginx-01 -p 80:80 nginx:1.26
# 4.进入容器,执行命令与操作
docker exec -it 容器名称或ID /bin/bash
# 5.将容器导出为镜像文件
docker export -o 导出后镜像文件名 容器ID
docker export -o mynginx.tar nginx-test
# 6.将镜像容器生成的文件导入本地镜像仓库
docker import 镜像文件名 镜像:版本
# 7.直接将容器生成镜像到本地仓库
docker commit nginx-test mynginx:2.0
# 8.停止容器
docker stop nginx-test
# 9.删除容器
docker rm nginx-test
# 10.复制
docker cp
仓库管理命令:
# 登陆镜像站
docker login http://192.168.57.200:8099/
用户名:admin 密码:root123
### 上传到镜像仓库
# 1.修改标签镜像名
docker tag h5-game:1.0 192.168.57.200:8099/yun11/h5-game:1.0
# 2.将镜像上传到私有镜像站
docker push 192.168.57.200:8099/yun11/h5-game:1.0
案例:docker安装Nginx
# 拉取镜像(如官方Nginx镜像)
docker pull nginx:latest
# 查看本地镜像
docker images
# 运行容器
docker run -d --name nginx-01 -p 80:80 nginx:1.26
# 查看运行中的容器(查看是否安装成功)
docker ps
# 构建镜像(基于当前目录的Dockerfile)
docker build -t my-app .
# 进入容器内部
docker exec -it <容器ID> /bin/bash
Docker实战
-
Docker安装部署MySQL一主两从集群
# 安装MySQL8.0.20版本
docker pull mysql:8.0.20
# 查看是否下载成功
docker images
# Master主库安装
docker run -p 3306:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root123 -d mysql:8.0.20
# slave1从库安装
docker run -p 3307:3306 --name mysql-slave1 \ \
-v /mydata/mysql-slave1/log:/var/log/mysql \
-v /mydata/mysql-slave1/data:/var/lib/mysql \
-v /mydata/mysql-slave1/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root123 -d mysql:8.0.20
# slave2从库安装
docker run -p 3308:3306 --name mysql-slave2 \
-v /mydata/mysql-slave2/log:/var/log/mysql \
-v /mydata/mysql-slave2/data:/var/lib/mysql \
-v /mydata/mysql-slave2/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root123 -d mysql:8.0.20
# 查看创建结果
ls /mydata
# 检测容器是否成功运行
docker ps
# Master主库配置
vim /mydata/mysql-master/conf/my.cnf
-------------------------------------
[mysql]
default-character-set=utf8mb4
[mysqld]
#设置server_id,同一局域网中需要唯一
server_id=1
#指定不需要同步的数据库名称 binlog-do-db 为需要同步的数据库
binlog-ignore-db=mysql
#开启二进制日志功能
log-bin=micro-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
-------------------------------------
# 使配置生效
docker restart mysql-master
# 进入容器(然后主机名会变成Master的容器ID)
docker exec -it mysql-master /bin/bash
# 进入数据库
mysql -uroot -proot123
# 创建名slave为用户供从库连接
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 授权表示可以从任意ip使用此用户名和密码连接到主数据库
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%';
# 刷新权限并退出
FLUSH PRIVILEGES;
\q
# 退出Master的容器
exit
# 从库配置
vim /mydata/mysql-slave1/conf/my.cnf
--------------------------------------
[mysql]
default-character-set=utf8mb4
[mysqld]
#设置server_id
server_id=2
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=micro-mysql-slave-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
#relay_log配置中继日志
relay_log=micro-relay-log-bin
#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#slave设置为只读(具有super权限的用户除外)
read_only=1
--------------------------------------
# 使配置生效
docker restart mysql-slave1
# 第二个从库同理
vim /mydata/mysql-slave2/conf/my.cnf
--------------------------------------
[mysql]
default-character-set=utf8mb4
[mysqld]
#设置server_id
server_id=3
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=micro-mysql-slave-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
#relay_log配置中继日志
relay_log=micro-relay-log-bin
#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#slave设置为只读(具有super权限的用户除外)
read_only=1
--------------------------------------
# 使配置生效
docker restart mysql-slave2
# 启动主从复制
# 获取binlog日志名称和日志偏移量
docker exec -it mysql-master /bin/bash
mysql -uroot -proot123
show master status;
\q
exit
# 查看容器详情,找到IP地址
docker inspect mysql-master
找到IP地址,这里显示是172.17.0.2
# 进入对应从库,配置主从连接关系
进入从库1的数据库:docker exec -it mysql-slave1 mysql -uroot -proot123
进入从库2的数据库:docker exec -it mysql-slave2 mysql -uroot -proot123
------------------------------------
CHANGE MASTER TO
MASTER_HOST='172.17.0.2',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='micro-mysql-bin.000001',
MASTER_LOG_POS=859,
MASTER_CONNECT_RETRY=30, #连接失败重试的时间间隔,单位为秒
MASTER_PORT=3306;
-------------------------------------
# 启动主从复制
start slave;
# 查看同步情况
show slave status \G;
# 如果已经同步,可以测试一下
# 创建一个test数据库,进入其中,创建一个student表
create database test;
use test;
CREATE TABLE student (
id int NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
gender varchar(10) NOT NULL,
birthday date NOT NULL,
address varchar(100) NOT NULL,
phone varchar(20) NOT NULL,
PRIMARY KEY (id)
);
# 往表中插入数据
insert into student (id,name,gender,birthday,address,phone) VALUEUES(1,'xiaoming','man','2023-06-16','guangzhou','13700137000');
#最后看看是否同步即可
课后作业:
-
Docker安装一个项目:blog、电商、游戏、网盘、视频网站
-
通过Docker命令创建一个自己的镜像
Docker网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
37d54792812e bridge bridge local
7ce6ad227662 host host local
3b5e5c90b035 none null local
# bridge 桥接模式,创建docker0网卡,每个容器都有一个自动分配的IP地址,建立虚拟局域网,容器间ip+port通信,外部访问容器通过宿主机的ip+port,端口映射(容器可以和宿主机通信,可以通过宿主机的端口映射访问外网);172.17.0.1/16
# host 主机模式,让容器直接使用主机的网络(IP地址和端口)
# 优点:网络的效率最高
# 缺点:会占用主机端口
# none 无网络模式,不联网,没有IP
# Overlay Network 层叠网络,可以跨主机通信,VXLAN(隧道技术),容器的集群部署中使用该模式
# 查看当前docker网络
docker network ls
# 创建docker网络,使用桥接模式
docker network create test-network -d bridge
# 使用docker网络,启动容器时,指定--network参数
docker run -itd --network=test-network --name ubuntu-test ubuntu:
latest
# 将创建好的容器添加到docker网络中
docker network connect test-network 容器名称或ID
# 当网络没有被占用或不再被使用时,可以删除
docker network rm test-network
Docker自带网络管理系统,可以有效管理容器之间、容器与主机以及外部网络之间的通信。Docker提供了多种网络模式来满足不同的需求,如 bridge 网络(默认)、host 网络和 overlay 网络等。
功能:
-
管理容器间的网络通信。
-
支持不同的网络模式,以适应不同场景下的需求。
Docker存储
docker 数据卷(Data Volume)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 的 mount 操作。
数据卷创建、挂载、删除、数据共享;
# 查看所有数据卷
docker volume ls
# 创建数据卷 ,默认会存放在目录:/var/lib/docker/volumes/数据卷名称/
docker volume create 数据卷名称
# 直接指定系统目录
-v 系统目录:容器目录
# 在运行容器时直接挂载数据卷
docker run -itd --name nginx-test -p 8080:80 -v test_volume:/etc/nginx nginx:1.26
# 多个容器可以共享同一个数据卷
docker run -itd --name nginx-test-2 -p 8081:80 -v test_volume:/etc/nginx nginx:1.26
# 查看数据卷的详细信息
docker volume inspect 数据卷名称
# 当数据卷未被占用时,可以删除数据卷
docker volume rm 数据卷名称
1709

被折叠的 条评论
为什么被折叠?



