一、常用指令
docker images
####查看当前镜像列表;
docker rmi 镜像ID或镜像名 [-f]
####删除指定镜像,-f表示强制删除;
docker pull 镜像名[:版本号]
####从公共库里拉取镜像,不指定版本号则默认最新版本latset;
docker build -t 镜像名 .
####注意最后有一个句号,表示依据当前目录下的dockerfile创建镜像,这一步容易报错,可以执行下npm cache clean --force
####多试几次,另外dockerfile的编写下面再说
docker run -p 本机端口号:docker端口号 --name 容器名 -v 当前项目路径:docker工作目录 所在镜像名
####在镜像里创建容器,指定端口映射,需要注意的是在window下"%cd%"表示当前目录,$PWD无效
docker ps [-a]
####查询启动的容器列表,-a表示所有的容器列表
docker rm [-f] 容器ID或容器名称
####删除容器,-f表示强制删除
docker stop/start/restart 容器ID或容器名称
####停止/启动/重启 容器
docker exec -it 容器ID bash
####进入指定容器内部
apt-get update
####更新容器 ctrl+d 或exit 即可退出
install vim
####安装vim编辑器,注意在此之前最好先执行一遍apt-get update
二、dockerfile
最好放在一个单独的文件夹内,不然与其他文件混在一块,在build时会把其他文件一并传给docker引擎打包
####第一部分:基础镜像信息
#基于centos镜像
FROM centos
####第二部分:维护人信息(新版本好像已经取消了)
#维护人的信息
MAINTAINER The CentOS Project
####第三部分:镜像操作命令队列
#安装httpd软件包
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件至镜像中web站点下
ADD index.html /var/www/html/index.html
#复制该脚本至镜像中,并修改其权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
####容器启动时执行的命令队列
#当启动容器时执行的脚本文件 如果有多个CMD,最后一个会把前面的覆盖掉
CMD ["/run.sh"]
常用指令:
from 基础镜像名[:版本号]
####指定依赖的基础镜像名
MAINTAINER 维护人信息
####备注维护人信息,更推荐使用 LABEL maintainer="维护人"
RUN ["yum", "install", "httpd"] ----exec模式
RUN yum install httpd ----shell模式
####构建镜像时运行的Shell命令
CMD ["-C", "/start.sh"]
CMD ["/usr/sbin/sshd", "-D"]
CMD /usr/sbin/sshd -D
####启动容器时运行的shell命令,如果有多个CMD,最后一个会把前面覆盖掉
EXPOSE 端口号
####服务运行的docker端口,不一定是访问时的,在启动容器时可以再映射
ADD 当前项目路径 docker路径
COPY 当前项目路径 docker路径
####两个都是拷贝文件或目录到镜像中,add会自动解压,copy不会,这个路径不必先创建,没有会自动创建
WORKDIR 工作路径
####指定docker工作目录路径,注意的是这个路径必须是事先创建好的
三、VUE项目部署
分为两种方式吧。(注意下面部署跟上面这个dockerfile没有关系哈)
一是我们先用npm build项目,然后把dist文件夹部署到docker上,这样好像项目开发完的最终部署。
另一种是直接把项目部署到docker上,打包神马的操作都在docker进行,其实是在docker里进行了npm的操作。这样部署完可以把镜像push上去,然后team内pull,有利于统一环境的版本,但是问题也是有的,在本地代码修改之后并不会立即响应到页面,得手动启用一下容器,有点卡蛋。
1.先说第一种方式,因为部署的是打包好的(先npm run build),所以不需要依赖node了,直接配置个nginx镜像就行了。
a.先获取nginx镜像
docker pull nginx
b.创建nginx config配置文件
在项目根目录下创建nginx文件夹,该文件夹下新建文件default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
这个文件可以看到首页的指向为 /usr/share/nginx/html/index.html, 所以我们可以一会把构建出来的index.html文件和相关的静态资源放到/usr/share/nginx/html目录下。
还将上面node服务代理出去了。容器内部 ip 通过查看docker inspect containerID
c.启动容器
docker run \
-p 8000:80 \
-d --name vuenginx \
--mount type=bind,source="%cd%"/vueclidemo/nginx,target=/etc/nginx/conf.d \
--mount type=bind,source="%cd%"/vueclidemo/dist,target=/usr/share/nginx/html \
nginx
命令太长可以用\换行。
-p 8000:80 是指把本地的8000端口映射到docker的80端口上;
-d 后台运行
--name vuenginx 指定容器的名称
--mount type=bind 没明白干啥的,后面的source表示当前项目的目录,target表示docker的目录
最后要跟上依赖容器的名称。
到此第一种部署结束了,在本地浏览器中用8000端口访问。
2.第二种方式,相对麻烦一些
a.先依赖于node镜像创建一个镜像,在项目根目录下创建一个dockerfile
#基于 node:latest 镜像而构建的
FROM node
#指定工作目录
WORKDIR /usr/src/app
#COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。
COPY package*.json ./
#安装依赖
RUN npm install
#将所有文件copy到工作目录
COPY . .
#声明运行时容器提供服务端口
EXPOSE 8080
#指定默认的容器主进程的启动命令
CMD [ "npm", "start" ]
b.build镜像
在Dockerfile目录运行下面的build命令, -t参数指定了创建好的镜像的名称:
docker build -t dockerdemo .
build成功后可以通过下面命令查询你的镜像列表:
docker images
c.启动容器
docker run -v "%cd%":/usr/src/app -p 8088:8080 --name container-test dockerdemo
-v "%cd%":/usr/src/app 绑定挂载目录
-p 8088:8080 把本地端口8088映射到docker的8080
--name container-test 指定容器的名字为container-test
最后为所在镜像的名称。
在本地浏览器访问8088端口。
不想每次启动这么麻烦可以在根目录下创建一个makefile.bat文件,内容如下:
echo off
set b=%cd%
if "%1"=="dev" docker run -v "%b%":/usr/src/app -p 8088:8080 --name container-test dockerdemo
然后每次启动只需要输入:
makefile.bat dev
我这里只配置了dev,其他模式还可以仿着配。
最后说几个自己遇到坑:
1.命令过长可以\换行
2.在浏览器访问时尽量不要用localhost:8088,最好换成自己的ip
3.在win系统下"%cd%"表示当前目录,网上资料里的$PWD无效
4.第二种部署方式里,vue项目的config/index.js配置文件中的port和dockerfile里EXPOSE端口号要保持一致,不然即便是映射以 后浏览器也访问到(不知道为啥,知道的大牛麻烦留言解释下,谢谢)
5.第二种部署方式里,vue项目的config/index.js配置文件中的host最好为"0.0.0.0",不用"localhost",不然即便是映射以后浏览器也有可能访问到(不知道为啥,知道的大牛麻烦留言解释下,谢谢)
6.还有给忘了,想起来再补吧。
上述的所有,是我自己初步了解docker遇到的,不对的地方欢迎指正,docker菜鸡一只。