Docker概念
隔离的进程独⽴于宿主和其它的隔离的进程 - 容器
GO语⾔开发
特点
⾼效的利⽤系统资源
快速的启动时间
⼀致的运⾏环境
持续交付和部署
更轻松的迁移
对⽐传统虚拟机总结
特性 容器 虚拟机
启动 秒级 分钟级
硬盘使⽤ ⼀般为 MB ⼀般为 GB
性能 接近原⽣ 弱于
系统⽀持量 单机⽀持上千个容器 ⼀般⼏⼗个
三个核⼼概念
镜像
容器
仓库
Docker基本使⽤
构建⼀个Nginx服务器
1. 拉取官⽅镜像
# 拉取官⽅镜像
docker pull nginx
# 查看
docker images nginx
# 启动镜像
mkdir www
echo 'hello docker!!' >> www/index.html
# 启动
# www⽬录⾥⾯放⼀个index.html
docker run -p 80:80 -v $PWD/www:/usr/share/nginx/html -d nginx
# 查看进程
docker ps
docker ps -a // 查看全部
# 伪终端 ff6容器的uuid
# -t 选项让Docker分配⼀个伪终端(pseudo-tty)并绑定到容器的标准输⼊上,
# -i 则让容器的标准输⼊保持打开
docker exec -it ff6 /bin/bash
# 停⽌
docker stop ff6
# 删除镜像
docker rm ff6
Dockerfifile定制镜像
#Dockerfile
FROM nginx:latest
RUN echo '
Hello, Kaikeba!
' > /usr/share/nginx/html/index.html
# 定制镜像
docker build -t mynginx .
# 运⾏
# -d 守护态运⾏
docker run -p 80:80 -d mynginx
定制⼀个程序NodeJS镜像
npm init -y
npm i koa -s
// package.json
{
"name": "myappp",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "myappp",
"dependencies": {
"koa": "^2.7.0"开课吧web全栈架构师
}
}
// app.js
const Koa = require('koa')
const app = new Koa()
app.use(ctx => {
Math.random() > 0.8 ? abc() : ''
ctx.body = 'Hello Docker'
})
app.listen(3000, () => {
console.log('app started at http://localhost:3000/')
})
#Dockerfile
#制定node镜像的版本
FROM node:10-alpine
#移动当前⽬录下⾯的⽂件到app⽬录下
ADD . /app/
#进⼊到app⽬录下⾯,类似cd
WORKDIR /app
#安装依赖
RUN npm install
#对外暴露的端⼝
EXPOSE 3000
#程序启动脚本
CMD ["node", "app.js"]
# 定制镜像
docker build -t mynode .
# 运⾏
docker run -p 3000:3000 -d mynode
Pm2 - 利⽤多核资源
# .dockerignore
node_modules
// process.yml
apps:
- script : app.js
instances: 2
watch : true
env :
NODE_ENV: production
# Dockerfile
FROM keymetrics/pm2:latest-alpine
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN npm config set registry https://registry.npm.taobao.org/ && \
npm i
EXPOSE 3000
#pm2在docker中使⽤命令为pm2-docker
CMD ["pm2-runtime", "start", "process.yml"]
# 定制镜像
docker build -t mypm2 .
# 运⾏
docker run -p 3000:3000 -d mypm2