一、常用指令

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菜鸡一只。