1.Doker是什么
- Build,Ship and Run Any App,AnyWhere ——一次封装,到处执行。
- 基于Linux的高效、敏捷、轻量级的容器(轻量虚拟)方案
2.Docker的特点
- 高效的利用系统资源
- 快速的启动时间
- 一致的运行环境
- 持续交付和部署
Docker对比传统虚拟机:
特性 | Docker | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
3.初次使用 hello world
首先我们需要有一台Linux的云服务器,然后远程连接上这台服务器。
连接之后,输入以下的指令进行配置:
-
sudo apt-get update
(apt升级) -
sudo apt-get install
apt-transport-https
ca-certificates
curl
software-properties-common
(添加相关软件包) -
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
(下载软件包的合法性,需要添加软件源的 GPG 密钥) -
sudo add-apt-repository
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu
$(lsb_release -cs)
stable"
(source.list 中添加 Docker 软件源) -
sudo apt-get update
sudo apt-get install docker-ce
(安装 Docker CE) -
sudo systemctl enable docker
sudo systemctl start docker
(启动 Docker CE) -
sudo groupadd docker
sudo usermod -aG docker $USER
(建立 docker 用户组,这一步根据实际需要选择使用) -
docker run hello-world
(Helloworld测试) -
vi /etc/docker/daemon.json
(进行文件修改)
添加如下代码,可以直接复制上去
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"
]
}
- esc(退出编辑状态)
- :wq(退出编辑界面并保存当前修改)
- :w!(退出编辑界面并强行写入)
- :q!(强行退出)
- sudo systemctl daemon-reload
sudo systemctl restart docker(重启服务)
4.安装一个nginx
- docker pull nginx(拉取一个nginx镜像)
- docker images nginx(查看通过docker拉取的所有nginx镜像,image在docker中就代表镜像的意思)
- mkdir www(创建一个www文件夹)
- echo 'hello docker!!' >> www/index.html(写代码hello docker!!到www文件夹里的index.html文件中)
- cat www/index.html(查看并打印指定位置的代码)
- docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html -d nginx
(映射当前nginx的80端口到服务器的8000端口,并把www文件夹映射nginx的默认目录中,-d是让nginx后台启动的意思,成功启动会打印一串字符,是当前启动程序的uuid) - docker ps(查询docker进程)
- docker ps -a(查询所有的docker容器,不管有没有启动)
- docker stop c99(停止服务,c99是刚才启动的nginx容器的uuid前三位)
- docker start c99(启动服务)
在这里,我们输入命令行的地方,也就是当前所在位置一直都是当前服务器的根目录,如果我们想访问docker的内部,其实docker也就相当于当前linux里面的一个小的linux,一个小的虚拟机
-
docker exec -it c99 /bin/bash(此时命令行的前缀就不是刚才的linux的id了,而是当前进去的docker的uuid,接下来访问一下刚才写的代码,并退出当前所在的docker容器)
exit.png -
docker rm c99(删除镜像,运行着的是不能直接删的,可以先docker stop c99停止要删除的docker)
5.安装一个mysql
创建一个在3306端口的容器名称为mysql的Mysql容器,并在后台持续运行
docker run -itd --name mysql -p -d 3306:3306 -e MYSQL_ROOT_PRD=123456 mysql
指令解析:
docker run 命令来创建
itd交互式终端后台运行
name指定容器名称
p指定映射端口
最后Mysql比较特殊,需要指定MYSQL_ROOT_PASSWORD变量
如果安装成功了,则可以通过数据库的可视化工具如navicat,连接这个mysql
6.DockerFile定制镜像
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。
需求实现:根据刚才我们拉取的nginx镜像,我们通过Dockerfile,添加一个非常简单的网页,实现定制镜像
- 连接服务器,并cd source/docker进入到docker镜像,此时ls查看文件列表,当前镜像是空的
- mkdir nginx(创建一个nginx目录)
- vi Dockerfile(编辑定制镜像的描述文件,按Insert进入编辑模式,并输入以下代码)
- FROM nginx:latest
RUN echo '<h1>Hello, myProfile!</h1>' > /usr/share/nginx/html/index.html
(定制镜像的来源是最新版的nginx,大于号是输出的意思) - esc推出编辑模式,:wq存盘退出,此时再次ls会发现当前docker文件夹下有两个文件夹了:Dockerfile nginx
- mv Dockerfile nginx/(把Dockerfile文件移到nginx目录下)
- cd nginx/(进入到nginx文件夹,接下来开始定制镜像)
- docker build -t nginx:myProfile .(定制的镜像名字是nginx:myProfile,点的意思是定制的镜像是在当前目录下)
- docker run -p 8000:80 nginx:myProfile(运行我们刚才定制的镜像)
- 此时就可以通过公网ip:8000访问到刚才我们定制的内容,这里是
Hello, myProfile!
7.定制NodeJS镜像
首先还是连接远程服务器,然后cd source/docker,此时ls,当前只有刚才建立的nginx文件夹,我们建立一个新的文件夹,mkdir node
- cd node
- npm init -y(将这个node文件初始化为npm项目)
- npm i koa -S(安装koa)
- cat package.json(看看koa是否安装成功)
- vi app.js(编辑入口文件,因为只是简单的几行代码,我们直接在命令行工具中手敲)
const Koa = require('koa')
const app = new Koa()
app.use(ctx =>{
ctx.body = 'Hello NodeJS !!!'
})
app.listen(3000, () => {
console.log('app started at 3000')
})
-
vi Dockerfile(定制Dockerfile)
定制Dockerfile.png -
输入完成后esc+:wq退出
-
docker build -t mynode(试一下定制镜像是否成功,先建立镜像,最后的点的意思是定制的镜像是在当前目录下)
-
docker run -p 3000:3000 mynode(启动镜像)
-
这里的启动遇到个小插曲,因为有别的程序占用了当前服务器的3000端口,所以第一次启动失败了,此时我们通过docker ps指令,看到有个镜像占用了这个端口,这个镜像的containerID(也就是前面说的uuid)是307xxxxxx,接下来我们通过
docker stop 307
关闭掉这个镜像,然后再次启动,此时通过公网IP就可以正常访问刚才我们启动的node了
8.定制PM2
node运行的时候一般都会使用pm2,首先还是连接远程服务器,然后cd source/docker,pm2是基于node的,所以我们将刚才做的node文件夹拷贝一份,并命名成pm2,cp -R node pm2,,然后cd pm2进入到pm2文件夹
- vi process.yml(建立一个process.yml的文件去描述pm2的运行过程)
apps:
- script : app.js
instances: 2
watch : true
env :
NODE_ENV: production
- vi Dockerfile(编辑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
CMD ["pm2-runtime", "start", "process.yml"]
(pm2在docker中使用命令为pm2-docker,&& 把两个命令连接成了一个命令,\代表回车)
- docker build -t mypm2(编译)
- docker run -p 3000:3000 -d mypm2(运行)
- docker stop bc8(关闭)
9.初识docker-compose
如果需要启动很多个docker容器,则需要很多docer runxxxxx, docker start命令,这样操作又会十分的麻烦,docker compose可以对多个docker容器进行管理
- apt install docker-compose(安装)
- mkdir docker-compose(新建一个docker-compose文件夹)
- cd docker-compose
- vi docker-compose.yml(新建一个描述文件)
version: '3.1'
services:
image: hello-world
- docker-compose up(启动,正常情况下启动之后命令行工具会打印出来当前docker-compose的运行日志,这样就代表docer-compose安装成功)
docker-compose项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,接下来演示一下通过docker-compose快速安装mongo和mongo的客户端mongo-express,首先连接服务器,然后cd source/docker
- mkdir mongo
- cd mongo
- vi docker-compose.yml
version: '3.1'
services:
mongo:
image: mongo
restart: always
ports:
- 27017:27017
mongo-express:
image: mongo-express
restart: always
ports:
- 8000:8081
- docker-compose up(运行,正常情况下,此时通过公网IP:8000,可以看到我们安装的mongo express客户端)
网友评论