docker是什么?
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
如何理解轻量级的、可移植的、自给自足?
轻量级的:它能够在相对较少的资源消耗下运行。Docker使用了操作系统级虚拟化技术,如容器化,它允许应用程序在隔离的环境中运行,而无需启动完整的虚拟机。相比传统虚拟机,容器更加轻量级,占用更少的内存、磁盘空间和处理器资源。
可移植的:Docker容器在不同的环境中均能够运行,包括开发环境、测试环境、生产环境等。Docker利用容器的封装性和依赖管理机制,将应用程序及其所有的依赖项和配置打包成一个独立的容器。这意味着您可以将容器轻松地从一台计算机迁移到另一台计算机,而无需担心环境差异或依赖项的缺失。
自给自足:指容器可以包含应用程序所需要的所有依赖项,而无需依赖于宿主操作系统的配置。容器内部包含了应用程序的可执行文件、运行时环境、系统库和依赖项等。这意味着您可以将容器部署在不同的操作系统上(例如Windows、Linux),甚至在没有网络连接的情况下工作。
优势
Docker的轻量级、可移植性和自给自足性使得它成为一个强大的工具,能够简化应用程序的部署和交付过程,并提供一致的运行环境,从而提高开发、测试和生产效率。
用来做什么?
打包、分发、部署
打包:就是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包(也就是镜像)
分发:你可以把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装(创建一个容器)
部署:拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一摸一样的运行环境,不管是在 Windows/Mac/Linux。
容器与镜像与仓库
镜像:可以理解为软件安装包,可以方便的进行传播和安装。
容器:软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器
仓库:安装包上传的地方,可以提供给其他人安装与下载。
安装Docker
官网安装
桌面版:https://www.docker.com/products/docker-desktop
MAC系统可使用homebrew安装
brew install docker
docker --version //验证docker是否安装成功
配置镜像加速源(“registry-mirrors”: [“https://registry.docker-cn.com”])
镜像加速器 | 镜像加速器地址 |
---|---|
Docker 中国官方镜像 | https://registry.docker-cn.com |
腾讯云 | https://mirror.ccs.tencentyun.com |
Docker开发中的常用命令
docker login 仓库地址 -u name -p password
docker run: 用于创建和启动一个新的容器。
docker ps: 显示正在运行的容器列表。
docker push: 将本地镜像推送到远程仓库。
docker pull: 从远程仓库下载一个镜像。
docker images: 显示本地镜像列表。
docker save:命令用于将Docker镜像保存到一个压缩的存档文件中。这个存档文件可以用于在其他机器上加载和导入镜像。
docker stop: 停止一个或多个正在运行的容器。
docker start: 启动一个或多个已停止的容器。
docker restart: 重启一个或多个正在运行的容器。
docker rm: 删除一个或多个容器。
docker rm container-id: 删除指定 id 的容器
docker stop/start container-id :停止/启动指定 id 的容器
docker rmi image-id: 删除指定 id 的镜像
docker volume ls :查看 volume 列表
docker network ls: 查看网络列表
docker build :根据dockerfile文件构建镜像
Docker快速安装软件
直接安装:安装麻烦,时间长,需要手动安装指定版本,一个软件的多版本不能在一台电脑上共存等
docker安装:一行命令安装,快速方便,有大量的镜像可以使用,没有不同系统兼容性问题,用完就丢,不占用电脑内存。
演示 Docker 安装 Redis
Redis 官网:https://redis.io/
官网下载安装教程只有源码安装方式,没有 Windows 版本。想要自己安装 windows 版本需要去找别人编译好的安装包。
Docker 官方镜像仓库查找 Redis :https://hub.docker.com/
一个命令安装并启动:
`docker run -d -p 6379:6379 --name redis redis:latest`
制作自己的镜像
为自己的 Web 项目构建镜像
编写dockerfile文件
# 基于某个基础镜像构建新的镜像
FROM node:16
# 复制代码
ADD . /app
# 将本地文件复制到镜像中
COPY . .
#设置镜像中的工作目录
WORKDIR /app
# 执行容器启动时的命令
CMD node app.js
Build 为镜像(安装包)和运行
编译 docker build -t test:v1 .
-t
设置镜像名字和版本号
. 会自动在该目录下找dockerfile文件进行构建(将当前目录作为构建上下文)
运行 docker run -p 8080:8080 --name test-hello test:v1
-p
映射容器内端口到宿主机
--name
容器名字
-d
后台运行
本地8080端口访问
目录挂载
使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新build
和run
,容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了
使用目录挂载解决上述问题
常用的挂载方式
bind mount
直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上volume
由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上
挂载演示
bind mount` 方式用绝对路径 `-v D:/code:/app
volume` 方式,只需要一个名字 `-v db-data:/app
示例:
docker run -p 8080:8080 --name test-hello -v D:/code:/app -d test:v1
补充:目录挂载后 修改宿主机代码容器内代码也会跟着改变,但是需要重新启动下容器来正常访问
多容器通信
项目往往都不是独立运行的,需要数据库、缓存这些东西配合运作。
在 Docker 中,可以创建自定义的网络,使得容器可以在同一个网络中进行通信。可以使用以下命令创建网络
docker network create mynetwork
然后,在启动容器时,将其连接到该网络:
docker run --network=mynetwork --name=container1 image1
docker run --network=mynetwork --name=container2 image2
这样,container1
和 container2
就可以通过网络进行通信,可以使用容器名或 IP 地址进行通信。
Dokcer-Compose
如果项目依赖更多的第三方软件,我们需要管理的容器就更加多,每个都要单独配置运行,指定网络。
我们需要使用 docker-compose 把项目的多个服务集合到一起,一键运行。
这里以web项目与redis为例
编写脚本
要把项目依赖的多个服务集合到一起,我们需要编写一个docker-compose.yml
文件,描述依赖哪些服务
version: "3.7"
services:
app:
build: ./
ports:
- 80:8080
volumes:
- ./:/app
environment:
- TZ=Asia/Shanghai
redis:
image: redis:5.0.13
volumes:
- redis:/data
environment:
- TZ=Asia/Shanghai
volumes:
redis:
在docker-compose.yml
文件所在目录,执行:docker-compose up
就可以跑起来了。
在后台运行只需要加一个 -d 参数docker-compose up -d
查看运行状态:docker-compose ps
停止运行:docker-compose stop
发布与部署
镜像仓库用来存储我们 build 出来的“安装包”,Docker 官方提供了一个 镜像库,里面包含了大量镜像,基本各种软件所需依赖都有,要什么直接上去搜索。
我们也可以把自己 build 出来的镜像上传到 docker 提供的镜像库中,方便传播。
当然你也可以搭建自己的私有镜像库,或者使用国内各种大厂提供的镜像托管服务,例如:阿里云、腾讯云
上传我们的镜像
- 首先你要先 注册一个账号
- 创建一个镜像库
- 命令行登录账号:
docker login -u username
- 新建一个tag,名字必须跟你注册账号一样
docker tag test:v1 username/test:v1
- 推上去
docker push username/test:v1
- 部署试下
docker run -dp 8080:8080 username/test:v1
docker-compose 中也可以直接用这个镜像了
version: "3.7"
services:
app:
# build: ./
image: helloguguji/test:v1
ports:
- 80:8080
volumes:
- ./:/app
environment:
- TZ=Asia/Shanghai
redis:
image: redis:5.0.13
volumes:
- redis:/data
environment:
- TZ=Asia/Shanghai
volumes:
redis:
开发时常用:
1.本地编写Dockerfile
2.构建镜像
docker build -t <镜像名称> <Dockerfile路径>
:构建一个镜像,可以通过指定 Dockerfile 文件和镜像名称来完成。
3.登录公司镜像仓库地址
docker login 仓库地址 -u name -p password
4.将镜像推送到公司镜像仓库
docker push <镜像名称>
:将本地的镜像推送到 Docker 镜像仓库。
5.拉取镜像源
docker pull <镜像名称>
:从 Docker 镜像仓库中拉取指定的镜像。
6.运行该容器
docker run <镜像名称>
:根据指定的镜像创建并运行一个容器。
脚本构建
编写为build.sh自动化脚本完成构建打包流程
补充:
docker 服务的默认端口是?
Docker服务的默认端口是2375(非加密通信)和2376(使用TLS加密通信)。这些端口用于与Docker守护程序进行通信,允许您管理和操作Docker容器和镜像。2375端口用于非加密的通信,而2376端口通过TLS协议进行加密通信,提供更高的安全性。通过连接到这些端口,您可以使用Docker客户端与Docker守护程序进行交互。