Docker容器化

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常用命令

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 数据卷名称
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值