Docker
前言
Docker作为一个项目生命周期中必不可少的一环,相信很多人都不陌生,但是,也有许多人并不清楚 Docker 到底是什么,今天特地写一篇帖子具体的讲一下Docker到底是什么,它是为了解决什么问题而诞生的。
定义
Docker是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发,并采用了Apache 2.0协议。Docker可以将我们的应用程序打包封装到一个容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可以实现方便快速并且与平台解耦的自动化部署方式,无论你部署时的环境如何,容器中的应用程序都会运行在同一种环境下。这是docker比较官方的定义,可能还有人不明白它的用处,那么请往下看:
例子
我写了一个Web项目,用到的技术栈比较广,后端用到了Flask,数据库用到了postgresql、redis,还用到了消息队列,前端用到了Vue,等等还涉及到了其他的各种技术栈。我将它部署在本地,由于自己的环境自己熟悉,所以自己部署起来还算比较快,但也花了一些时间,可以接受。如果这时别人也先部署我的服务,也需要在他人的环境部署这些各种各样的服务,也许一两个人,你还可以接受,但是如果有几十人几百人呢,这个部署成本谁都无法接受,而且还要解决部署过程中遇到的问题,因为每个人的系统版本环境都是不一样的。以上还是个人的场景,如果是公司的场景,客户成千上万,部署起来简直就是灾难。
这时候如果引入了docker,事情将变的将简单起来,首先docker可以将以上服务打包成镜像,这样就能保证所有人的环境得到了统一,也就不存在兼容的问题,其次,镜像下拉到用户本地,只需一行命令即可生成容器,启动服务,繁琐的部署流程瞬间简化到几秒,极大的提高了效率。而且docker还支持许多命令可以方便的管理容器。
相信看到这里,你已经明白了docker的作用了,它就是为了解决不同环境下繁琐的服务部署流程问题而诞生的。
上面提到了镜像和容器的概念,那么下面就讲一下 镜像-容器:
概念
docker核心的两个概念就是镜像-容器,镜像其实很好理解,相信作为程序猿,多多少都装过系统吧,装系统的时候是不是要先下载一个镜像,然后把镜像写入到U盘安装到电脑中,最后开机就可以进入到桌面了,这时候用户使用的系统可以称之为容器,这就是最基础的镜像-容器概念。容器其实就是镜像的实例。
回到我们的项目这里来,docker的原理就是把我们写的源码和需要的运行环境一起打包成镜像,上传到镜像库,当我们到另一个终端使用的时候就像git一样把镜像pull下来,然后通过创建容器命令启动这个服务,这就是docker的使用流程。
用法
docker的使用比较简单,以下列举一些docker的常用命令
docker pull python:3.10 #这里是拉取一个python3.10的镜像,核心还是一个微型的linux内核
docker images #查看已经拉取到本地的镜像
docker command --help #查看dockerd 某个命令的帮助
docker run -itd -p 80:8000 -v /home/project:/app/project --name pro --restart always python:3.10 bash
# 以上是一个命令组合,并不能直接拿来用,因为有些命令有冲突,在此是为了展示各个参数的作用
# run 命令为了启动容器
# -itd 一般不会一起用, -it组合是创建一个交互终端,-d是在后台启动容器
# -p 80:8000 将容器8000端口映射到宿主机80端口上
# -v /home/project:/app/project 将宿主机的/home/project路径映射到/app/project路径,方便调试文件
# --name pro设置容器名为pro
# --restart always 设置宿主机开机自动启动容器
# python:3.10 容器的镜像源
# bash 可以不写,临时启动容器的时候设置终端shell类型
# 真实用法:临时进入pro容器并进入
docker exec -it pro bash
docker rmi python:3.10 # 删除镜像
docker rm -f pro # 删除pro容器
docker stop pro # 停止容器
docker restart pro # 重启容器
docker logs -f pro # 查看容器日志
docker的命令还有很多,暂时只列举这些。
Dockrfile
docker还有一个重要的概念,就是dockerfile,它的使用场景就比较灵活,有时候我们的项目需要组合多个环境,可能还需要手动处理一些操作,比如一些静态文件的安装和环境变量的设置。这个时候就需要使用dockerfile将这些配置集成到一起然后打包成一个新的镜像,以下是一个dockerfile文件的示例:
From Python:3.10
From Mysql:5.7.0
# 设置工作目录
WORKDIR /usr/src/app
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 安装psycopg2依赖
RUN apt update \ && apt add postgresql-dev gcc python3-dev musl-dev
# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt
# 复制entrypoint.sh
COPY ./entrypoint.sh .
# 复制项目
COPY . .
# run entrypoint.sh
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]
进入dockerfile所在的目录,执行以下命令就可以构建镜像了
docker build -t newimg .
Docker-Compose
安装
docker-compose由于源码在国外,所以安装比较麻烦,这里下载好了linux的amd64位和arm64位的安装包
添加环境变量即可使用docker-compose命令
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
docker-compse --version
简介
docker-compose是docker加强的一个工具,有时候一个项目可能有几十个镜像需要拉起容器,依靠手工处理效率依旧不高,而使用docker-compose可以通过配置文件批量拉起容器,而且支持docker的所有参数命令,十分方便。docker-compose的配置文件通常是docker-compose.yaml,示例如下:
# 部署版本号,自定义
version: '3.3'
services:
guacd:
image: dushixiang/guacd:latest
volumes:
- ./data:/usr/local/next-terminal/data
restart:
always
next-terminal:
image: dushixiang/next-terminal:latest
environment:
DB: sqlite
GUACD_HOSTNAME: guacd
GUACD_PORT: 4822
ports:
- "8088:8088"
volumes:
- /etc/localtime:/etc/localtime
- ./data:/usr/local/next-terminal/data
restart:
always
相信熟悉docker之后再看以上docker-compose配置文件是不是很简单?
写好配置文件后一键拉起
docker-compose up -d # -d可以在批量后台拉起
docker-compose down # 批量停止容器
3 条评论
哈哈哈,写的太好了https://www.lawjida.com/
《一路爱情》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/41940.html
看的我热血沸腾啊https://www.jiwenlaw.com/