目录
一 认识Docker
1 定义
Linux container 是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,Docker是基于Linux container技术优化实现(资源隔离(Namespace)、资源限额(CGroups)、分层存储(union FS))
Docker设想是交付环境如同海运,OS如同货轮,在每个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,集装箱(软件打包==>镜像)内容可以由用户自定义,也可以由专人制造

2 docker 解决了什么问题?(开发人的痛点)
(1)环境一致性与标准化
- 解决了“明明在我的电脑上能运行啊”的问题,极大提升了平台的可移植性,降低开发和部署成本
(2)更高效的利用系统资源&&秒级启动
- 与传统的虚拟机技术不同,Docker 容器不需要像虚拟机那样模拟完整的操作系统,而是共享宿主机的内核,这使得 Docker 容器启动速度极快,一般只需秒级即可启动
(3)持续交付和部署
- 在传统的应用部署过程中,开发人员需要在目标服务器上手动安装操作系统、配置运行环境、部署应用程序及其依赖项,这一过程耗时且易出错,docker可以通过定制应用镜像,上传到镜像仓库。运维人员在生产服务器上,通过一条命令就可以从镜像仓库拉取镜像并启动容器,来实现持续集成、持续交付、部署
3 docker和虚拟机的区别
| 比较 | Docker | 虚拟机 |
|---|---|---|
| 虚拟化类型 | 轻量级虚拟化:共享宿主机内核,可以通过运行容器,实现多个操作系统 | 传统虚拟化:通过 Hypervisor 模拟硬件,每个虚拟机有独立操作系统和内核 |
| 资源占用 | 资源利用率高:多个容器共享宿主机内核,占用资源少,内存、CPU 等开销小 | 资源利用率低:每个虚拟机需独立操作系统及模拟硬件,内存、CPU 等资源消耗多 |
| 启动速度 | 启动速度快:秒级启动,因无需启动操作系统,直接启动应用 | 启动速度慢:需启动完整操作系统,通常需数十秒甚至数分钟 |
| 隔离性 | 隔离性相对较弱:容器间共享内核,虽有资源隔离机制,但安全性和隔离性不如虚拟机 | 隔离性强:每个虚拟机有独立操作系统和硬件资源,相互隔离性好 |
| 应用场景 | 适合快速部署、迭代开发、微服务架构,可快速构建和部署应用,方便管理和扩展 | 适合需运行不同操作系统、对隔离性和安全性要求高的场景,如企业关键业务系统 |
| 迁移和移植 | 简单 | 复杂:需考虑虚拟机操作系统、硬件等兼容性 |
| 镜像大小 | 镜像轻量级 | 镜像较大 |
| 部署灵活性 | 部署灵活性高:可快速创建、删除、启动和停止容器,实现应用动态伸缩 | 部署灵活性相对较低:创建和配置虚拟机耗时较长,不适合频繁变更场景 |
二 Docker三要素
1 镜像
- 操作系统的组成:kernel+rootfs,对于
Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持;Docker 镜像(Image),和宿主机共用一个内核,自身就相当于是一个特殊的文件系统;
例子:为什么能在centos系统上启动一个Ubuntu容器?
Ubuntu基础镜像(Base Image)带着一个rootfs ,和宿主机共用一个内核,Ubuntu系统就起来了
类比日常:镜像好比是预先精心打包好的旅行箱模板。根据不同旅行需求,放置特定的物品,比如针对登山旅行,箱内放置了登山鞋、登山绳、冲锋衣等专业装备;若是海滨度假旅行箱模板,则放置了泳衣、沙滩巾、防晒霜等物品;这个模板旅行箱(Docker 镜像)包含了进行某类旅行(运行某个应用程序)所需的一切物品(代码、运行时环境、库、配置文件等),是创建实际旅行箱(容器)的基础,而且模板本身是只读的,不会轻易被修改。
2 容器
- 镜像运行时的实体
类比日常:根据旅行箱模板实际组装并使用的旅行箱。比如当你决定要去登山,就按照登山旅行箱模板的物品配置,组装出一个实际的旅行箱并带着它出发;在旅行过程中(应用程序运行时),你可以根据实际情况对旅行箱内物品进行使用和调整(对容器内文件系统进行读写操作)。不同类型旅行的实际旅行箱(不同应用的容器)相互独立,互不干扰,且可以在不同地方(不同环境)使用
3 仓库
官方仓库:hub.docker.com
- 集中存放镜像文件的地方
类比日常:可以看作是一个大型的旅行箱存放中心;这个存放中心(Docker 仓库)分为公共和私有两种,公共的就像大家都能去的公共仓库,任何人都可以去挑选自己需要的旅行箱模板;私有的则类似企业或组织内部自己建的存放中心,只有内部特定人员能进入挑选。如果你自己精心配置出一个很棒的旅行箱模板,也可以把它推到这个存放中心。
三 Docker 安装部署(centos7)
1 安装前准备
(1)检查系统及内核版本
Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10
cat /etc/redhat - release 查看系统的具体版本信息
uname -r 查看内核版本
(2)关闭防火墙和SELinux (谨慎操作!!)
Docker 在运行过程中,容器与宿主机以及容器之间需要进行网络通信,容器可能会使用随机端口进行通信。开启防火墙后,它可能会阻挡这些容器之间以及容器与宿主机之间的网络连接
在生产环境中,直接关闭防火墙和 SELinux 会带来一定安全风险。更好的做法是对防火墙规则和 SELinux 策略进行针对性的配置和调整
systemctl disable firewalld
systemctl stop firewalld
iptables -F
sed -i '7s/enforcing/disabled/' /etc/selinux/config
setenforce 0
getenforce #Disabled
#记得重启!!!
(3)卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
(4)安装依赖及镜像源
sudo yum install -y yum-utils
国内源
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
官方源(国外 有网络隔离问题 建议用国内源)
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
2 安装docker
更新yum源缓存
yum clean all && yum makecache
指定版本:20.10.24:主版本.次版本.补丁版本
查看yum仓库历史版本命令:yum search docker-ce --show-duplicates
sudo yum install docker-ce-20.10.24-3.el7.x86_64 docker-ce-cli-20.10.24-3.el7.x86_64 containerd.io docker-compose-plugin
不指定版本 默认最新版本
sudo yum install docker-ce docker-ce-cli containerd.io
3 启动&&测试docker
systemctl enable docker
systemctl start docker
systemctl status docker
systemctl status containerd
&验证是否安装成功
docker run hello-world # Hello from Docker! 安装成功
> clint contacted the Docker daemon(server)
> Docker daemon pull from Docker Hub server去仓库拉取
> Docker daemon created a new container server创建一个容器
> Docker daemon streamed that output to client server把输出信息返回给clint
4 配置加速器(可不配)
修改配置
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://ung2thfc.mirror.aliyuncs.com",
"https://mirror.ccs.tencentyun.com"
]
}
重启docker
systemctl restart docker
四 docker 常用基础命令大全!!!码住😄😄😄
cat /etc/os-release # 查看系统信息
docker info # 显示server和clint信息
docker search nginx # 搜索
--------------------------------------镜像------------------------------------------
docker pull 仓库名:TAG(默认latest) # 拉取镜像.默认地址是 Docker Hub(docker.io)
例:docker pull centos:7
docker pull --help
docker pull registry.cn-beijing.aliyuncs.com/xxhf/nginx:1.22.1 # 从自己的仓库拉取镜像
docker push # 推送镜像到远程仓库
docker images # 列出本机所有的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
仓库名 仓库标签 镜像ID 时间 大小
hello-world 1.22.1 0f8498f13f3a 13 months ago 142MB
以上如果出现<none> 则为虚悬镜像,失去了价值 可以任意删除
docker rmi IMAGE ID --force # 删除镜像
docker rmi $(docker images -q **) --force # 删除所有镜像或**
docker system df # 查看镜像、容器、数据卷所占用的空间
docker images --no-trunc # image id 显示全
docker tag hello-world hello # 重命名镜像
------------------------------------导入导出镜像-------------------------------------
docker save busybox:latest -o busybox.img # 导出镜像
docker load -i busybox.img # 导入镜像
---------------------------------------容器-----------------------------------------
docker run busybox:latest echo hello world # 启动容器但不进入执行命令
docker run -it ubuntu bash/sh # 进入容器的shell中 前台交互运行;
# -i:交互式操作 -t:终端
docker run -it centos:7 # 进入容器的shell中 前台运行
docker run -d nginx:1.22.1 # 启动容器 后台运行
docker run -d -p 80:80 nginx:1.22.1 # 启动容器 监听本机的80端口
docker run -d --name=nginx-666 nginx:1.22.1 # 启动容器并起名 后台运行
docker run -d -h 主机名 nginx:1.22.1 # 修改容器主机名 进去次才看见
docker run -d --restart=always nginx:1.22.1 # docker或服务器重启后容器跟着重启
docker run -d redis # 启动容器 后台运行
docker ps # 查看当前正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器ID 镜像 命令 时间 状态 应用端口 容器名
docker ps -a # 显示所有的容器(正在运行、已经退出的)
docker ps ---no-trunc # 容器 id 显示全
docker stop CONTAINER ID # 关闭容器
docker start CONTAINER ID # 启动容器
docker logs -f CONTAINER ID # 查看容器日志
docker inspect CONTAINER ID # 查看容器详细信息
docker inspect CONTAINER ID | grep -i ipaddr # 查容器的IP
docker inspect -f '{{ .NetworkSettings.IPAddress}}' CONTAINER ID # 精确查容器IP
docker exec -it CONTAINER ID sh # 进入到正在运行容器的shell中
docker exec CONTAINER hostname # 不进入正在运行的容器只执行命令
docker rm CONTAINER ID --force # 删除一个正在运行的容器
docker rm CONTAINER ID CONTAINER ID --force # 删除多个容器
docker rm $(docker ps -a | awk '{print $1}' | grep -v 'CONTAINER') --force #删除所有容器
docker rm $(docker ps -a -q) --force # 删除所有容器
docker stats CONTAINER ID # 查看容器资源使用情况
docker run --dns 8.8.8.8 -d nginx:1.22.1 # 修改容器DNS
➕ 蛋蛋不迷路~ 有疑问随时留言哦😯 不定时更新!
下文持续更新Dokcerfile详解 敬请期待....


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



