Docker简介
我们希望有一个工具可以帮助我们一键智能部署,假如你要部署在多台不同的机器上,可以不用担心不同系统,不同版本的差异,以及运行之前需要安装不同软件的痛苦。
当红的虚拟化软件:Dockerhttps://www.docker.com
Docker的进化
- 传统的虚拟机,虚拟硬件以后,需要在上面安装一个完整的操作系统
- Docker: 推出了容器的概念,每个容器不需要安装完成的操作系统,里面的进程直接运行在Docker创造的宿主内核中,不需要虚拟硬件
Docker的有点
- 更快速的启动速度
- 更少的资源占用
- 一致的运行环境
- 微服务架构,docker天生适配微服务架构
下载使用Docker
下载地址: https://www.docker.com/products/docker-desktop
docker-images
可以在https://hub.docker.com/search?q=&type=image中获取各种官方的镜像,并且可以上传你自己定义镜像
Docker镜像仓库获取镜像的命令是docker pull
bash
# 下载镜像
docker pull <image-name>:<tag>
# 查看以及下载的镜像
docker images
# 删除镜像
docker rmi <image-id>
# 上传
docker push <username>/<repository>:<tag>
使用镜像代理
javascript
"registry-mirrors": [
'https://docker.mirrors.ustc.edu.cn',
'https://reg-mirror-qiniu.com'
]
Docker Container
启动Docker容器
bash
docker run -d -p 81:80 --name container-name image-name
# -d 后台运行
# -p 端口映射 81为主机的端口,80为镜像中的端口
# --name 自定义容器名称
# image-name 镜像名称,假如本地没有下载,会先自动 pull 一次镜像
其他命令
bash
# 查看所有容器
docker ps
# 停止容器
docker stop container-id
# 删除容器
docker rm container-id
# 启动已终止容器
docker container start container-id
进入容器内部
bash
docker exec -it <container-id> command
-i: 即使没有附加也保持STDIN打开
-t: 分配一个伪终端
持久化容器数据
使用 -v参数
bash
docker run -d -p 81:80 -v host:container image-name
创建对应的volumn
bash
# 创建
docker volume create <volumn-name>
# 使用volumn启动
docker run -d -v <volumn-name>:/data/db mongo
# 检查
docker volume inspect <volumn-name>
# 删除
docker volumn remove mongo
使用Dockerfile自定义镜像
Dockerfile是一个特殊的文本文件,里面包括一系列的指令,用来构建对应的镜像
所有指令: https://docs.docker.com/engine/reference/builder/#from
bash
# 指定基础镜像 从node14构建
FROM node:14
# 创建对应的文件夹,作为项目运行的位置
RUN mkdir -p /usr/src/app
# 指定工作区,后面的运行任何命令都是在这个工作区中完成的
WORKDIR /usr/src/app
# 从本地拷贝对应的文件到 工作区
COPY server.js /usr/src/app/
# 告知当前Docker image暴露的是3000端口
EXPOSE 3000
# 执行启动命令,一个 Dockerfile 只能有一个
CMD node server.js
Docker build构建自定义镜像
bash
# 这里特别注意上下文的概念,不要在根目录使用Dockerfile
docker build [选项] <上下文路径/URL/->
多个容器互相通信
信条:Docker中每一个container应该只完成一个工作,并且把它给做好
有点:
- 解耦,这样不同的服务和后端代码都可以完全分离开来,方便管理以及未来的扩展
- 服务的更新以及升级都是完全独立的
- 在一个container中,启动多个不同的进程,需要一个进行管理器
Docker compose
Docker compose是Docker官方推出的工具,用来管理和共享多个容器的应用。
安装
Mac和Windows假如安装客户端的话,是会自动安装Docker compose的
javascript
docker-compose version
Linux需要单独安装,文档在这里:https://docs.docker.com/compose/install/
配置
docker compose通过一个特殊的yml文件,进行配置,这个文件必须命名为docker-compose.yml
docker-compose所有的字段参考文档:https://docs.docker.com/compose/compose-file/compose-file-v3/
启动以及关闭
bash
# 启动
docker-compose up -d
# 关闭
docker-compose down
Docker镜像构建优化
优化镜像大小
什么是Alpine Linux: https://alpinelinux.org/
Alpine的优点
- Small 小
默认软件包,alpine选择busybox
c 运行库,一般会用glibc, alpine选择musl - 最简依赖,Simple
很多内置软件的插件都去掉
国际化内容都被删除 - Scure 安全
部署到服务器
安装Docker
Ubuntu:
- https://www.runoob.com/docker/ubuntu-docker-install.html
- https://docs.docker.com/engine/install/ubuntu/
配置用户组
因为是root安装,普通用户执行对应的命令的时候有可能会报错
需要将对应的用户添加到docker的用户组中
bash
# usermod命令 修改用户账户
# a --append 添加 -G --groups 组的名称
sudo usermod -aG docker 你的用户名
# 如果组不存在 添加对应的 docker 组
sudo groupadd docker
# 查看一个用户所属的组
groups
添加下载镜像
bash
# root
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn/",
"https://reg-mirrors.qiniu.com"
]
}
运行
bash
# 拉最新的代码
git pull
# 先查看目前端口是否被占用
# 如果被占用,释放端口
# 或者改变 docker-compose.yml 的映射端口
docker-compose up -d
Github Actions 简介
学习YAML
YAML是一种标记语言,它使用空格作为缩进,看起来非常的简洁,可读性非常的好,非常适合一些内容大纲和配置文件。
bash
# document start
# scalars 纯量,不能再分割的量
key: value
a_number_value: 100
boolean: true
# 字符串是不需要使用引号的,但是使用了也不会报错
quote_string: 'quote string'
# 多行字符串可以使用 literal block, 也就是竖线
mutiple_string:
line one
line two
line three
# COLLECTION TYPES 集合类型
# 使用缩进表示层级关系,最好是两个空格
# 不是也没关系,只要对齐就可以
person:
name: viking
age: 30
address:
city: 'shanghai'
# Sequences 数据或者列表
hobbies:
- Item 1
- Item 2
- name: 'weson'
-
Github官方的CI/CD工具,作为github的亲儿子,和github几乎是完美的无缝衔接的,功能非常强大
- Github actions https://docs.github.com/en/actions
- Travis https://www.travis-ci.com
- CircleCI https://circleci.com/
- Jenkins https://www.jenkins.io/
- 讨论: https://www.zhihu.com/question/306195033/answer/1870322118
Workflow
https://docs.github.com/cn/actions/learn-github-actions/understanding-github-actions#workflows
Workflow是一个可配置的自动化流程,可以包含多个jobs,通过一个在repo当中的yml文件来定义的流程,一个repo可以包含多个workflow
Events
Event是触发workflow的特殊事件,比如pull request, push或者issue,也可以完全自定义,完整列表查看:https://docs.github.com/cn/actions/learn-github-actions/events-that-trigger-workflows
Jobs
Job是Workflow当中一系列的可执行步骤,每个Job是在同一个runner中进行的(Runner是指处于github的一台特殊的虚拟机,支持各种操作系统),每个步骤或者是一个shell脚本,或是一个可执行的action,每个步骤是按顺序执行,并且互相依赖的
Actions
Action是github actions中的一个自定义应用,它可以运行一系列复杂的并且常用的任务,使用action可以帮我们减少workflow中写重复代码,Github提供了非常多的action,可以在这里查阅:https://github.com/marketplace?type=actions同时我们也可以写自己的action.
使用ssh-action完成远程登录
文档地址:https://github.com/appleboy/ssh-action