摘要
- Docker是什么?镜像,容器都是做什么的?
- 什么是虚拟化技术?有什么实际的好处?
- 如何快速的应用Docker?
- docker-compose 又是什么?
点我跳转:本文Youtube视频链接(牛哥能处:一个视频搞定Docker)
Docker介绍
官方定义:Docker 是一个开源的引擎,允许开发者将应用打包进容器(container),然后在任何支持Docker的系统上运行。
白话版:Docker是一门虚拟化技术 ,docker本身也是一个软件,在linux系统下提供虚拟化服务。
为了简单化,这里暂时先这么理解,并且聚焦linux,在文章最后我们会单独展开
什么是虚拟化?
白话版:
- 软件都是运行在物理机器上:比如你的台式机,笔记本或者互联网上的服务器;
- 软件运行是需要环境支持的:比如你安装一个游戏,游戏会要求你比如DX12,要有MSVRT库等;
- 不同的物理机器是存在差异的:就想刚刚说的,系统版本不一样;DX的版本不一样;显卡不一样
基于以上:
- 我们就会遇到问题,在不同的机器上就需要单独的调整环境,以支持软件运行;
- 即便可以运行了,还是会因为一些版本差异(很多软件是同时支持不同版本的环境的,比如一些游戏DX10以上就可以玩,但是在DX10,DX11,DX12等环境下表现是不同的)
虚拟化:
在系统提供的基本环境下,构造出一个虚拟化环境:可以简单理解,之前软件运行时调用系统的资源是直接调用的,现在需要调用虚拟化环境提供的资源。
进一步,我们可以定义这个分层以便于理解:
- 应用层:就是实际要运行的软件,比如:刚刚提到的游戏;
- 虚拟层:他是一个桥梁,连接应用和物理环境;将应用环境的差异平划掉,提供一致性的环境;
- 物理层:就是真实的物理环境;如上文所述,存在这各种差异;
这里的物理层比较宽泛,便于理解,我们不展开了,可以简单理解为:CPU | 内存 | 硬盘等硬件 + 操作系统 + 基础的软件环境
这个虚拟层所做的事情就是构建并提供了虚拟化。
回到最初的问题:什么是Docker?
Docker 是一个软件,功能就是构建这个虚拟层。
进一步总结一下:构建这个虚拟化环境有什么好处?
- 环境一致性 :对于应用层都是一样的环境,没有差异
- 方便迁移 | 部署 :你在本地基于虚拟化构建的应用,在服务器上基于虚拟化运行没有差异和区别;
- 一对多部署:如果你需要多个服务器都配置这个应用,那么基于虚拟化的也可以保证其运行效果一致,且快速部署
- 方便管理:有的时候我们经常需要重启一些应用,比如游戏运行不正常的时候,我们会重启主机,基于Docker,我们可以重启这个应用
- ……
Docker 怎么用?
安装docker
docker 运行在linux下,不同的linux系统版本安装命令稍有不同,以ubuntu为例:
sudo apt install docker
遇到yes/no提示键入 Y
其他系统安装命令基本类似,如无特殊需求,推荐使用ubuntu
从哪里获取Linux服务器?
- 学习环境 :如果你是使用windows11,那么直接通过系统提供的WSL2 构建一个Ubuntu环境即可;关于这一块可以自行查阅资料,如有需要,以后我们专门做一期视频
- 生成环境:直接去各种云服务商买一个基本配置的VPS或者云服务器即可,比如亚马逊云,阿里云,腾讯云
服务商 网址 服务器基本配置 年套餐价格范围 亚马逊云(AWS) aws.amazon.com 依据实例类型变化 依据实例类型和区域变化 阿里云 aliyun.com 2核4G至8核32G 386.93元/年至4271.04元/年 腾讯云 cloud.tencent.com 2核2G等多种配置 从118元/年起
一般一个腾讯云的 2核2G 就轻松够用了,一年100块很划算,【腾讯云】年度爆款2核2G4M云服务器118元/年,新老用户同享]
Docker的组成?
- 交互界面:Docker是基于命令行提供基本控制能力的
GPT定义:有一些开源web服务对docker命令做了封装,提供可视化的配置能力,屏蔽了命令行,但本质没有区别,建议对于基本的docker命令还是要有了解的
- 镜像(Image):镜像是什么?镜像就是应用安装包
GPT定义:Docker 镜像是一个轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、运行时环境、库、环境变量和配置文件。镜像是静态的定义,可以认为是应用程序及其环境的快照。通常情况下,一个镜像会基于另一个镜像进行构建,添加一些个性化设置。你可以从 Docker Hub 这样的公共仓库下载镜像,也可以创建并上传你自己的镜像。
- 容器(Container):容器就是安装后的应用,可以运行
GPT定义:当 Docker 镜像被运行时,它存在于一个被称为容器的执行环境中。容器是镜像的运行实例。它可以被启动、开始、停止、删除,每个容器都是相互隔离、保证安全的平台。容器可以被认为是一个简化的 Linux 环境和运行在其中的应用程序,它是轻量级的,并且提供了标准化的环境,确保软件能在任何 Docker 环境中一致地运行。
镜像是容器的静态描述,而容器是镜像的动态运行时实例
常用Docker命令有哪些?
下面是一个关于 Docker 常用命令的表格,并根据其用途做了基本的三个分类,每条命令均包含了命令名称、参数、描述以及示例:
- 镜像的搜索、拉取及构建
命令名称 | 参数 | 描述 | 示例 |
---|---|---|---|
search | <term> | 在 Docker Hub 上搜索镜像 | search nginx |
pull | <image_name> | 从仓库拉取指定的镜像 | pull ubuntu |
build | -t <image_name> | 构建一个新的镜像 | build -t myimage . |
images | 无 | 列出本地的所有 Docker 镜像 | images |
rmi | <image_name> | 删除一个镜像 | rmi myimage |
search :搜索命令 | 比如docker search mysql,搜索mysql的镜像
NAME :镜像的名称
STARS :关注的次数,关注数越高,证明其有更多人使用并认可
OFFICIAL :代表着是官方的,官方就代表着安全,所以默认都是使用官方的
pull :拉取镜像
pull是可以指定版本的,默认是latest,也就是最新的版本,如果要指定某个版本,比如mysql的5.7.0,那么可以使用:docker pull mysql:5.7.0
如何知道有哪些版本?
命令行不提供这个能力,可以去docker hub里查看
- 容器的运行、启动和停止
命令名称 参数 描述 示例 run
-d -p <port>:<port>
运行一个容器 run -d -p 80:80 nginx
ps
-a
列出所有容器,包括未运行的 ps -a
stop
<container_id>
停止一个运行中的容器 stop container_id
start
<container_id>
启动一个已经停止的容器 start container_id
rm
<container_id>
删除一个容器 rm container_id
run : 通过镜像构建并启动一个容器,因为要制定各种参数,所以命令行很长,比如:
docker run –name mynginx -p 8080:80 -d nginx
-p :制定端口映射
-v :制定路径映射
-d :后台运行
–name :制定容器名称
-xxx : ……
我一般不用,知道就可以了
ps | stop | start | rm 都很简单,不单独说了
- 针对容器运行时的一些细节分析
命令名称 参数 描述 示例 exec
-it <container_id>
进入到一个正在运行的容器内部 exec -it container_id bash
logs
<container_id>
查看容器的日志 logs container_id
以上命令请记得实际使用时,在每个命令前加上 `docker`。例如,要在 Docker Hub 上搜索 nginx 镜像,使用 `docker search nginx`。 Docker Hub是什么我们后文单独介绍。
操作某个容器或者镜像时可以使用部分IMAGE ID缩写
假如我要删除它,可以使用以下两种方式: 1. 通过名字 :docker rmi mysql:5.7.26 (删除mysql tag为5.7.26这个镜像) 2. 通过ID :docker rmi e9c3 (删除IMAGE ID前几位是 e9c3 的镜像) 删除镜像是精确匹配的,如果需要批量删除: 删除所有容器 :sudo docker rm $(sudo docker ps -aq) 删除所有镜像 :sudo docker rmi $(sudo docker images -q)
什么是DockerHub ?
这是一个提供各种开源的镜像存储的网络,并提供一个网址进行交互检索:
在这里可以搜索需要的各种镜像:
Docker-Compose 介绍
GPT:
docker-compose
是一个用于定义和运行多容器 Docker 应用程序的工具。使用 docker-compose
,你可以通过一个 YAML 文件来配置应用服务。然后,只需使用一个简单的命令,就可以创建并启动你在配置文件中定义的所有服务。
主要特点:
- 多容器管理:
docker-compose
允许你在一个单独的文件中定义多个容器,包括它们的配置,这样可以确保在不同环境中的一致性和可重复性。 - 易于使用:通过一个命令即可管理所有服务的生命周期。
- 服务依赖定义:可以明确地定义服务间的依赖关系,确保容器按正确的顺序启动。
配置文件: docker-compose
的配置通常在一个名为 docker-compose.yml
的文件中定义。在这个文件中,你可以定义多个服务(容器),网络和卷。
白话版:
一种基于配置文件部署的docker方式:
- 基于配置文件:配置文件可以提前编辑好并进行存储后多次使用
命令行每次都要输入;命令行比较麻烦
- 可以一次部署多个容器:一个配置文件可以直接描写多个部署
比如:我们部署一个web应用,需要一个服务程序 + 一个数据库,很多时候还需要数据库操作程序(phpmyadmin),redis,nginx(web代理),以上用docker命令需要5次,compose一个配置文件就搞定
怎么使用docker-compose
白话版:构造一个docker-compose.yml的文件,记事本编辑内容,按要求编辑完成,运行docker-compose命令部署。
docker-compose本身也是一个程序,所以需要安装,安装命令如下:
apt install docker-compose
安装同样遇到yes/no提示,输入 y
基本命令:
docker-compose up
:启动并运行整个应用程序。docker-compose down
:停止并移除所有由up
命令创建的资源。docker-compose build
:构建或重新构建服务。docker-compose run
:运行一次性命令针对服务
-d 参数:后台运行的意思,比如启动docker加上-d,就会在后台启动
docker-compose.yml文本结构
语法简单且固定,基本结构如下:
- 头部声明:yml文件固定的开始部分
version: '3'
serveices:
version : yml描述的版本,docker-compose本身也是一个程序,不同版本支持的yml版本也不同,一般给3就可以,太高有时候会不支持,比较麻烦
services :表示下面都是一个一个的服务,也就是一个一个的容器
- 容器列表:一个接一个定义就可以了
xxx_name: // 容器的名称,这个名字针对这个yml,而不是创建出的容器
image: xxx_image:version // 使用哪个docker镜像,version可选
container_name: xxx_docker_name // 这个是真正的运行后容器的名字
restart: always // 当容器非正常停止时,自动重启
ports:// 端口的映射情况
- local_port:docker_port
- 80:80
environment: // 环境变量
KEY: VALUE
MYSQL_ROOT_PASSWORD: 123456
volumes: // 文件的映射
- local_file_path:docker_file_path
- ../html:/usr/share/nginx/html
- 一般需要外部访问的端口需要映射,否则只能docker网络内部访问
- 需要修改或者存储的文件需要映射,docker内部的文件,重启后会丢失
- 所有段都不是必须的,如果不需要,可以直接去掉,比如:如果我们不需要自定义网络,那么就去掉networks部分
示例一:单容器
我们构建一个nginx的docker,yml内容如下:
version: '3'
services:
web:
image: nginx
container_name: nginx_container
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
这个yml描述定义了一个叫nginx_container的容器,使用nginx最新版本(latest),绑定了80端口,映射了当前目录下的html目录为nginx的web目录。
执行效果:
示例二:多容器
我们创建一个mysql+wordpress,yml描述如下:
version: '3'
services:
db:
image: mysql:5.7
container_name: mysql_container
volumes:
- ./db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wordpress_container
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- ./html:/var/www/html
创建了两个容器:
- 创建了基于mysql5.7版本镜像的容器mysql_container,定义了基本的root密码,和为wordpress使用的相关数据库信息(库名称,用户名,密码)
- 创建了基于wordpress最新版本镜像的容器wordpress_container,并且依赖第一个mysql的服务,通过环境变量把相关的数据库信息传递给wordpress
执行效果:
浏览器访问:127.0.0.1:8000
进阶:
Docker的不同系统部署
- Linux:Docker最初只在linux上存在,其本质是利用了linux的一些特性,其在linux上并不是虚拟机的模式,是介于系统与虚拟机之间,基于linux系统提供的一些特性来进行支撑。
- Windows:Windows下默认是不支持的,在windows上运行docker多数都是调试需要,github上提供了Docker Desktop 下载,安装后基于windows的WSL2提供的linux进行工作,实际使用上是稍有差异的,比如会提示docker没有启动等等。
如果遇到这个windows下WSL2里提示docker没有启动,请使用:service docker start 命令启动
- MacOS:Mac下是基于虚拟机实现的docker能力,安装后使用基本没什么特殊问题,用于调试测试等完全够用。
Mac下可以直接基于brew命令安装:brew install –cask docker,–cask 这个参数会安装图形界面,以方便管理,如果不需要图像界面,只需要命令行,可以去掉这个参数
自定义Docker私有网路
yml文件里通过networks可以自定义控制容器使用的网络,进而控制其 IP等,这一块属于进阶内容,本次就不再展开了,后续会专门做一期视频。
networks:
network_name: // 定义一个网络名称
ipv4_address: 10.10.0.100