此文仅记录博主学习实践docker技术之后的基本认识以及初次部署实践,如有错误,敬请指正。

初识docker

一:docker组成

在这里插入图片描述

Docker的工作原理

Docker是基于C/S结构的系统,Docker的守护进程运行在Linux服务器(宿主机)上,当我们在Liunx服务器上(Docker-Client)输入Docker相关命令就会被发送给Doker-Server

二:docker host【认识】

1.镜像(image)

Docker镜像相当于一个文件系统,携带了创建特定类型容器所需的所有数据,根据某一类型的镜像可以创建出很多容器实例。

2.容器(container)

容器可以看做是一个简易版的Linux系统,运行在宿主机上,但是它有自己的文件系统和网络等。

三:docker client【交互】

注意:下述内容对各对象的各种行为做出分类,按照流程逻辑可分为对该对象的 crud action、config action、host action、controll action四种行为。以下内容仅关注各对象的基本行为逻辑,具体命令自行搜索查阅。

1.管理docker服务

crud action
  • 安装(C): linux / window
  • 描述(R)
docker version
docker info
  • 卸载(D)
config action
  • 设置镜像仓库
  • 设置阿里云镜像加速

设置步骤:进入阿里云 -> 注册阿里云账号 -> 搜索进入容器镜像服务 -> 在镜像中心选项卡下选择镜像加速器 -> 里面可以看到加速器地址以及各系统下的配置方式

controll action
  • (开机自)启动docker服务
  • 关闭docker服务

2.管理docker镜像

crud action
  • 拉取(C):pull
  • 构建(C):build
  • 查看(R)
# findAll
docker images
# findOne
docker search 镜像名
# detail
docker inspect 镜像id
  • 删除(D)
# deleteAll
docker rmi -f $(docker images -aq) 
# deleteOne
docker rmi -f 镜像id                      
# deleteMany
docker rmi -f 镜像id 镜像id 镜像id 镜像id

3.管理docker容器

crud action
  • 创建(C)
docker run 可选参数 镜像名
# 可选参数
--name=”xxx“    # 容器名字
-d              # 后台模式运行
-it             # 使用交互模式运行,进入容器查看内容
-p(小学)         # 指定端口映射 如:-p 8080(宿主机):8080(容器)
-P(大写)         # 随机端口映射
--net           # 网络模式
-v              # 数据卷
  • 查看(R)
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# detail
docker inspect 容器id
  • 删除(D)
# deleteAll
docker rm -f $(docker ps -aq)
# deleteOne
docker rm -f 容器id
host action
  • 文件传输
docker cp 容器id:文件路径(容器内) 目的路径(宿主机)
[root@MT ~]docker cp 1a9a6785c37c:/home/c.java /home/
  • 进程
docker top 容器id
  • 共享文件,共享网络(运行镜像获得容器实例时以参数形式指定)
controll action
  • 启动和停止
docker start 容器id      # 启动容器
docker restart 容器id    # 重启容器
docker stop 容器id       # 停止正在运行的容器
docker kill 容器id       # 强制停止
  • 进入和退出
# 进入
docker exec -it 容器ID /bin/bash
# 退出
exit          # 容器直接退出
Ctrl + P + Q  # 容器不停止退出
  • 查看日志
docker logs -tf 容器id             # 查看实时日志  
docker logs -t --tail 数量 容器id  # 查看指定数量的日志   

四:docker Registry【参考】

docker Registry是集中存放镜像文件的场所,imageName和imageTag共同确定一个image。

1.docker Hub

官网:https://hub.docker.com/,扮演与github类似的角色,需要的镜像可以在这里搜索后翻阅文档。

2.阿里云 仓库

国内的公开仓库,镜像下载速度快。

实践docker部署

第一步:项目开发阶段【输出git repo(project and dockerfile)】

1.编写dockerfile

什么是dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

dockerfile常用配置项
  • 英文好的看官方文档,英文差的看菜鸟教程等资料。
前端项目部署示例dockerfile

注:由于采用的部署方式是nginx代理到多个http服务的方式,以下示例只是构建一个单独的基于node环境的http服务镜像。

FROM node:12

RUN mkdir -p /home/docs
WORKDIR /home/docs

ADD package.json .
RUN yarn config set registry 'https://registry.npm.taobao.org'
RUN yarn

COPY . /home/docs

RUN yarn docs:build

EXPOSE 3386
# 以下server.js即是一个在node环境下,通过express框架搭建http服务的脚本。
CMD ["node", "server.js"]

2.准备data and script(dockerfile中涉及到的)

project code(data)
server.js(script)
// express依赖
const http = require('http')
const path = require('path')
const bodyParser = require('body-parser')
const express = require('express')
// ecstatic依赖
const ecstatic = require('ecstatic')
// connect-history-api-fallback依赖
const history = require('connect-history-api-fallback')

const app = express()
app.use(bodyParser.json())

app.use(history())

app.use(ecstatic({ root: path.join(__dirname, './dist') }))

http.createServer(app).listen(process.argv[2] || 3386)

第二步:前端打包阶段【输入git repo,输出image(after test)】

1.Clone

# 在打包机上
mkdir codePath
cd codePath
git clone https://github.com/xx/xx.git

2.Build

cd projectPath
docker build -t xx/node:tagName .

3.Run

docker run -d -p 3386:3386--name containerName xx/node:tagName
curl 127.0.0.1:7788 # test

4.Share

未作实践,另行参考https://www.runoob.com/docker/docker-repository.html

第三步:服务器运行容器阶段【输入image,running】

注:以下项目部署方式是 nginx容器 + 多个http server容器的方式

1.nginx服务

需求:nginx一级路由控制访问不同项目,如127.0.0.1/project1访问project1项目,127.0.0.1/project2访问project2项目。

first:拉取nginx服务、创建nginx容器、启动nginx容器
  • 拉取创建启动:养成从Docker Hub查找镜像后翻阅文档的习惯(授之以鱼不如授之以渔,哈哈)。
  • 注意点:跨容器转发,由于宿主以及各容器各有各自的网络和端口,所以需要做好网络和端口映射,可通过让nginx容器以–net=host的方式,让nginx容器与宿主机共享网络,进而实现nginx容器-> host -> project容器的请求转发需求(注意,在实践中,docker for window环境下出现预期外错误,linux正常)。
second:添加特定路由的请求转发配置
  • 添加代理配置
docker ps
# 进入容器
docker exec -it nginxId /bin/bash
# 修改配置
vi /etc/nginx/conf.d # vi编辑器问题,1.command not find:执行 apt-get install vim 2.找不到包:apt-get update
--- conf.d
# 对应server下添加如下配置
	location /project1{
		proxy_pass http://127.0.0.1:3386;
	}
---

2.project服务

运行测试project的http服务
docker run -d -p 3386:3386 --name containerName xx/node:tagName
curl 127.0.0.1:3386# test
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐