以vuecli构建的一个简单的前端项目来做演示。 使用vue命令行创建一个docker-vue项目之后。在项目根目录创建nginx.conf文件并编辑
server {
listen 80;
root /www;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
然后创建Dockerfile文件并编辑
# 引用的docker镜像
FROM nginx:latest
# 执行的命令, 删除容器nginx下的默认配置
RUN rm /etc/nginx/conf.d/default.conf
# 将本地的nginx.conf复制到容器的nginx配置下
COPY nginx.conf /etc/nginx/conf.d/
# 复制本地的编译文件到容易的www下
COPY dist /www
这个时候我们将前端build之后,生成了dist目录。
然后我们将这个Dockerfile构造成一个镜像
# docker build -f Dockerfile -t docker-vue-test:0.0.1 .
$ docker build -t docker-vue-test .
Sending build context to Docker daemon 146MB
Step 1/4 : FROM nginx:latest
---> f949e7d76d63
Step 2/4 : RUN rm /etc/nginx/conf.d/default.conf
---> Running in a053a3e5b7ec
Removing intermediate container a053a3e5b7ec
---> 2b865704f5d1
Step 3/4 : COPY nginx.conf /etc/nginx/conf.d/
---> 619e4cd4ca05
Step 4/4 : COPY dist /www
---> 33dae375d730
Successfully built 33dae375d730
Successfully tagged docker-vue-test:latest
容器有146MB,这个肯定是不合理,太大了的。 研究了下发现是将node_modules也build进了镜像。 我们添加一个.dockerignore文件
node_modules
再次执行一下构建镜像
$ docker build -t docker-vue-test .
Sending build context to Docker daemon 1.576MB
Step 1/4 : FROM nginx:latest
---> f949e7d76d63
Step 2/4 : RUN rm /etc/nginx/conf.d/default.conf
---> Using cache
---> 2b865704f5d1
Step 3/4 : COPY nginx.conf /etc/nginx/conf.d/
---> Using cache
---> 619e4cd4ca05
Step 4/4 : COPY dist /www
---> Using cache
---> 33dae375d730
Successfully built 33dae375d730
Successfully tagged docker-vue-test:latest
这样明显就小了很多。现在我们来运行一下这个docker容器
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-vue-test latest 33dae375d730 54 seconds ago 127MB
$ docker run -p 8080:80 --name docker-vue-1 -d docker-vue-test
f81d85d84a3a7095e92590a4695673827e50eeaf34efd4eef5b04055707dcbca
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f81d85d84a3a docker-vue-test "nginx -g 'daemon of…" 4 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp docker-vue-1
我们本地访问localhost:8080看看,可以看到如下页面
代表我们成功了。
Dockerfile我们可以当成是一个shell脚本,会执行文件的一行行命令,然后可以使用docker命令来根据Dockerfile文件来生成镜像,之后就可以根据镜像来启动容器了。