docker的优点
- 环境隔离(隔离,安全)
- 更高效的资源利用(节约成本)
- 更快速的交付部署(敏捷)
- 更易迁移扩展(可移植性)
- 更简单的更新管理(高效)
docker的用途
- 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境
- 提供弹性的云服务。因为Docker容器可以随开随关,很适合动态扩容和缩容
- 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构
Docker部署Node服务
基本步骤
- 本地写好nodejs应用,关联gitlab
- 服务器安装docker,配置国内镜像加速
- 拉取一个node镜像
- 编写Dockerfile文件,构建镜像或者直接通过docker-conmpose部署
- 根据镜像运行一个容器
- 本地进行访问
homebrew安装Docker
- 查找Docker相关安装包
brew search docker
- 查看包的具体详情
brew info docker
- 安装docker
brew install --cask docker
具体步骤
- 写Node应用
// 初始化
npm init
// 安装express模块
npm install express --save
// 项目根目录下新建 app.js ,当访问时返回Hello,Docker!,监听3000端口
// app.js
const express = require('express');
const app = express();
app.get('/', function (req, res) {
res.send('Hello,Docker!');
});
app.listen(3000);
console.log('Server is running on http://localhost:3000');
- 远程连接服务器,安装Docker
// 查看yum是否安装
yum --version
// 服务器上安装docker
yum install -y docker
// 安装成功之后,配置国内镜像加速,编辑/etc/docker/daemon.json文件
vim /etc/docker/daemon.json
编写如下内容
{
“registry-mirrors”: ["国内镜像加速地址"]
}
// 启动docker服务
systemctl start docker.service
// 设置开机启动
systemctl enable docker.service
注意:修改完配置文件后应该重启服务
- 拉取Node镜像
// 拉取node镜像,比如拉取9.2.0版本镜像
docker pull node:9.2.0
// 镜像拉取成功之后,查看已有的镜像
docker images
-
部署项目代码 将本地开发项目打包scp拷贝到远程服务器具体路径下,然后进行解压,解压到某个目录下面,比如目录是/home/project
-
编写Dockerfile文件,Docker通过读取Dockerfile中的指令自动生成镜像 Dockerfile文件里是一条条能被Linux执行的命令,docker能根据该文件构建镜像。该文件必须和项目文件放在一起,一般放在项目根目录下。比如这个目录是/home/project
cd project
vim Dockerfile
// Dockerfile具体内容如下:
# 基础镜像为node,版本为v9.2.0
FROM node:9.2.0
# 镜像作者,可以附加联系信息
MAINTAINER Qiao
# 创建容器内的项目存放目录(具体根据实际添加修改)
RUN mkdir -p /home/nodeApp # 用于在Image里创建一个文件夹,将会用于保存我们的代码
WORKDIR /home/nodeApp # 将我们创建的文件夹作为工作目录
# 将Dockerfile当前目录下所有文件拷贝至容器内项目目录并安装项目依赖(具体根据实际添加修改)
COPY . /home/nodeApp # 是把本机当前目录下的所有文件拷贝到Image的/home/nodeApp目录下
RUN npm install # 是用npm安装我们的node应用中的所有依赖包
# 容器对外暴露的端口号,要和node项目配置的端口号一致
EXPOSE 3000
# 容器启动时执行的命令
CMD [ "node", "app.js" ]
- 构建镜像,运行命令:docker build -t 镜像名称 . 在项目根目录下执行命令构建镜像:
// 比如
docker build -t project .
// 构建成功后查看镜像
docker images
屏幕会按照Dockerfile内的指令一条条执行并显示在屏幕上,构建完成,查看已有的镜像
- 创建一个镜像的容器, 运行docker容器,运行命令:docker run -d [--name [name]] [-p [对外端口]:[对内端口]] [业务镜像名]
通过镜像project创建一个容器并运行
docker run -d --name projectContainer -p 80:3000 project
// 查看容器的状态
docker ps -a
// 查看正在运行的容器
docker ps
// 查看容器错误日志
docker logs 容器名称
说明
-d 表示容器会在后台运行;
--name 容器名称,是我们给容器起的名字,这个名字是唯一的;
-p 表示端口映射,即将容器内的3000端口映射到宿主机器的80端口上,这样外部就可以通过80端口来访问容器内部运行的应用了。 业务镜像名:image Id或仓库REPOSITORY
- 本地访问 打开本地的浏览器,输入http://localhost:3000或服务器的IP即可访问
Dockerfile文件中常用指令
- FROM: 基础镜像
- MAINTAINER: 维护者信息
- ENV: 设置环境变量
- RUN: 构建镜像时要执行的命令
- ADD/COPY: 文件添加到容器中,即拷贝到docker工作目录中
- WORKDIR: 相当于cd工作目录,docker工作目录
- VOLUME: 指定持久化目录
- EXPOSE: 指定与外界交互的端口
- CMD: 运行命令,容器启动时调用
说明
RUN和CMD命令的区别
- RUN: RUN命令 image文件的构建阶段执行,执行结果都会打包进入image文件
- CMD命令则是在容器启动后执行
- 一个Dockerfile可以包含多个RUN命令,但是只能有一个CMD命令
Docker常用命令
- 查看docker版本 docker version
镜像常用命令
- 删除所有的image: docker rmi $( docker images -q )
- 查询镜像 docker search [name]
- 拉取镜像 docker pull [name]
- 查询所有镜像 docker images
- 使用镜像运行一个容器 docker run 镜像名
- 列出所有镜像 docker image ls
- 删除镜像 docker rm 镜像id
- 获取镜像的元数据 docker inspect [镜像id]
- 镜像登陆 docker login
容器常用命令
- 停止正在运行的容器 docker stop container_id
- 查看所有容器 docker container ls | docker ps -a
- 删除所有容器 docker rm $(docker ps -q)
- 删除所有退出的容器 docker container prune
- 删除容器 docker rm 容器id
- 进入容器 docker exec -it container_id command(container_id表示容器的id,command表示linux命令,如/bin/bash)
- 创建容器 docker create centos
- 启动/停止/重启容器 docker start/stop/reset 容器id
- 查看容器详情 docker inspect <container_id>
- 创建并启动容器 docker run(是docker create命令和docker start命令的合成)
- 在运行的容器中执行命令 docker exec (例如:docker exec -it nginx bash)
- 获取容器的元数据 docker inspect [容器id]
- 导出容器/导入容器
- 查看容器日志 docker logs 容器名称
// 将容器导出成一个tar文件
docker export -o nginx.tar [容器id]
// 导入容器,这里需要注意的是,使用docker import并非直接将容器导入,而是将容器运行时的内容以镜像的形式导入。所以导入的结果其实是一个镜像,而不是容器
docker import nginx.tar
- 容器与主机之间的数据拷贝 docker cp
- 终止容器运行 docker container kill [containID]
Docker部署Mysql环境
- docker中搜索可用镜像
docker search mysql
结果如下:
- 拉取MySQL镜像
docker pull mysql
docker pull mysql:5.6 指定版本拉取
docker pull mysql:latest 拉取官方的最新版本的镜像
- 查看本地镜像 使用以下命令来查看是否已安装了 mysql:
docker images
- 运行MySQL
安装完成后,我们可以使用以下命令来运行mysql容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -i -p 3306:3306 --restart=always mysql:5.6
#
docker run itd --name 容器名称 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 docker.io/mysql
参数说明:
- -p 3306:3306 :格式为主机(宿主)端口:容器端口,映射容器服务的3306端口到宿主机的3306端口,外部主机可以直接通过宿主机ip:3306访问到MySQL的服务
- MYSQL_ROOT_PASSWORD=123456:设置MySQL服务root用户的密码
- docker.io/mysql表示镜像名称
- --name 容器名称命名
- -e 配置信息,配置root密码
- -i 以交互模式运行容器
- --restart=always 当docker重启时,该容器自动重启
- -d 此容器在后台运行,并且返回容器的ID
问题
3306端口被占用
查看端口号占用情况,发现3306端口号被占用
netstat -tanlp
#
netstat -lnp|grep 3306
#
lsof -i:3306
查看/etc/services 文件 记录网络服务名和它们对应使用的端口号及协议
grep MySQL /etc/services
解决方案
- 杀掉占用进程:
// kill -9 进程id即彻底杀死进程
kill -9 18941
- 查看是否安装成功
docker ps -a
- docker登录mysql,进入容器
docker exec -it 容器名称 bash
mysql -u root -p
- 创建数据库 create DATABASE 数据库名称
// root用户创建数据库
mysql> create DATABASE RUNOOB;
// 普通用户创建数据库
mysqladmin -u root -p create 数据库名称
- 删除数据库和表 drop database <数据库名>;
//// 删除数据库和表
drop database 库名;
drop table 表名;
//// 删除数据库
// 例如删除名为 RUNOOB 的数据库
mysql> drop database RUNOOB
// 使用 mysqladmin 删除数据库
mysqladmin -u root -p drop RUNOOB
- 查看数据库 show databases
mysql> show databases
- 查看某个数据库中的所有表
use 数据库名称;
show tables;
- 创建数据库表
use 数据库名称;
create table 表名 (字段设定列表);
- 将表中记录清空
delete from 表名;
总结:
通过本篇文章我们了解了docker常用命令以及docker如何部署mysql和node服务。
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿