此文仅记录博主学习实践docker技术之后的基本认识以及初次部署实践,如有错误,敬请指正。
Docker是基于C/S结构的系统,Docker的守护进程运行在Linux服务器(宿主机)上,当我们在Liunx服务器上(Docker-Client)输入Docker相关命令就会被发送给Doker-Server
Docker镜像相当于一个文件系统,携带了创建特定类型容器所需的所有数据,根据某一类型的镜像可以创建出很多容器实例。
容器可以看做是一个简易版的Linux系统,运行在宿主机上,但是它有自己的文件系统和网络等。
注意:下述内容对各对象的各种行为做出分类,按照流程逻辑可分为对该对象的 crud action、config action、host action、controll action四种行为。以下内容仅关注各对象的基本行为逻辑,具体命令自行搜索查阅。
docker version
docker info
设置步骤:进入阿里云 -> 注册阿里云账号 -> 搜索进入容器镜像服务 -> 在镜像中心选项卡下选择镜像加速器 -> 里面可以看到加速器地址以及各系统下的配置方式
# findAll
docker images
# findOne
docker search 镜像名
# detail
docker inspect 镜像id
# deleteAll
docker rmi -f $(docker images -aq)
# deleteOne
docker rmi -f 镜像id
# deleteMany
docker rmi -f 镜像id 镜像id 镜像id 镜像id
docker run 可选参数 镜像名
# 可选参数
--name=”xxx“ # 容器名字
-d # 后台模式运行
-it # 使用交互模式运行,进入容器查看内容
-p(小学) # 指定端口映射 如:-p 8080(宿主机):8080(容器)
-P(大写) # 随机端口映射
--net # 网络模式
-v # 数据卷
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# detail
docker inspect 容器id
# deleteAll
docker rm -f $(docker ps -aq)
# deleteOne
docker rm -f 容器id
docker cp 容器id:文件路径(容器内) 目的路径(宿主机)
[root@MT ~]docker cp 1a9a6785c37c:/home/c.java /home/
docker top 容器id
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是集中存放镜像文件的场所,imageName和imageTag共同确定一个image。
官网:https://hub.docker.com/,扮演与github类似的角色,需要的镜像可以在这里搜索后翻阅文档。
国内的公开仓库,镜像下载速度快。
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"]
// 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)
# 在打包机上
mkdir codePath
cd codePath
git clone https://github.com/xx/xx.git
cd projectPath
docker build -t xx/node:tagName .
docker run -d -p 3386:3386--name containerName xx/node:tagName
curl 127.0.0.1:7788 # test
未作实践,另行参考https://www.runoob.com/docker/docker-repository.html
注:以下项目部署方式是 nginx容器 + 多个http server容器的方式
需求:nginx一级路由控制访问不同项目,如127.0.0.1/project1访问project1项目,127.0.0.1/project2访问project2项目。
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;
}
---
docker run -d -p 3386:3386 --name containerName xx/node:tagName
curl 127.0.0.1:3386# test