在项目根目录下,添加Dockerfile文件,此文件用来配置咱们自定义一个镜像所须要指定的依赖项、环境以及执行的命令等。内容格式以下:node
# 指定咱们的基础镜像是node,版本是v8.0.0 FROM node:10.13.0 # 指定制做咱们的镜像的联系人信息(镜像建立者) # MAINTAINER EOI # cd到app文件夹下 WORKDIR /home/admin/app # 将根目录下的文件都copy到container(运行此镜像的容器)文件系统的app文件夹下 ADD . /home/admin/app/ # 安装项目依赖包 RUN npm install # RUN npm rebuild node-sass --force # 配置环境变量 # ENV HOST 0.0.0.0 # ENV PORT 8000 # 容器对外暴露的端口号 # EXPOSE 8000 # 容器启动时执行的命令,相似npm run start CMD ["npm", "start"]
关于Dockerfile文件中的关键字,解释以下:react
FROMgit
- 语法:FROM
[:<tag>]
- 解释:设置要制做的镜像基于哪一个镜像,FROM指令必须是整个Dockerfile的第一个指令,若是指定的镜像不存在默认会自动从Docker Hub上下载。
MAINTAINERdocker
- 语法:MAINTAINER <name>
- 解释:MAINTAINER指令容许你给将要制做的镜像设置做者信息。
ADD shell
- 语法:ADD <src> <dest>
- 解释:ADD指令用于从指定路径拷贝一个文件或目录到容器的指定路径中,<src>是一个文件或目录的路径,也能够是一个url,路径是相对于该Dockerfile文件所在位置的相对路径,
是目标容器的一个绝对路径。
WORKDIR npm
- 语法:WORKDIR /path/to/workdir
- 解释:WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工做目录(默认为/目录),该指令在Dockerfile文件中能够出现屡次,若是使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。
RUN sass
- 语法:① RUN <command> #将会调用/bin/sh -c <command>
② RUN ["executable", "param1", "param2"] #将会调用exec执行,以免有些时候shell方式执行时的传递参数问题,并且有些基础镜像可能不包含/bin/sh- 解释:RUN指令会在一个新的容器中执行任何命令,而后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操做,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和能够基于镜像的任何一个历史点建立容器的好处,就像版本控制工具同样。
ENV app
- 语法:ENV <key> <value>
- 解释:ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,若是须要在运行时更改这些环境变量能够在运行docker run时添加–env <key>=<value>参数来修改。
- 注意:最好不要定义那些可能和系统预约义的环境变量冲突的名字,不然可能会产生意想不到的结果。
EXPOSE tcp
- 语法:EXPOSE <port> [ ...]
- 解释:EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在链接不一样的容器(使用–link参数)时使用这些信息。
CMD 工具
- 语法:
① CMD ["executable", "param1", "param2"] #将会调用exec执行,首选方式
② CMD ["param1", "param2"] #当使用ENTRYPOINT指令时,为该指令传递默认参数
③ CMD[ | ] #将会调用/bin/sh -c执行 - 解释:CMD指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,若是使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会做为ENTRYPOINT指令的默认参数,也就是说可使用CMD指令给ENTRYPOINT传递参数。
- 注意:RUN和CMD都是执行命令,他们的差别在于RUN中定义的命令会在执行docker build命令建立镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用exec执行时,命令必须为绝对路径。
在项目根目录下添加.dockerignore文件,此文件的做用相似.gitignore文件,能够忽略掉添加进镜像中的文件,写法、格式和.gitignore同样,一行表明一个忽略。本项目添加的忽略以下
# dependencies /node_modules /.pnp .pnp.js # testing /coverage # production /build # misc .DS_Store .env.local .env.development.local .env.test.local .env.production.local npm-debug.log* yarn-debug.log* yarn-error.log*
➜ ~ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/deploy 1.0 2646a0cda7e0 10 hours ago 1.14GB deploy 1.0 2646a0cda7e0 10 hours ago 1.14GB lzqs/deploy 1.0 2646a0cda7e0 10 hours ago 1.14GB <none> <none> 2aa256b547c4 10 hours ago 1.14GB node 10.13.0 58375a768efa 3 weeks ago 893MB
➜ my-app git:(master) ✗ docker build -t deploy:1.0 . ''''''''' Successfully built d8f0875e967b Successfully tagged deploy:1.0
deploy是镜像名,1.0是镜像的版本号,到此你已经成功构建了一个新的镜像,你能够经过docker images,查看你的镜像。
➜ my-app git:(master) ✗ docker images REPOSITORY TAG IMAGE ID CREATED SIZE deploy 1.0 666b40a937b7 About a minute ago 2.35GB
➜ my-app git:(master) ✗ docker run -d -p 9000:8000 deploy:1.0 508739047fba955bebf709b822d9837c5b41ee31f574ffece0e3e350448c786d ➜ my-app git:(master) ✗ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 508739047fba deploy:1.0 "npm start" 20 seconds ago Up 19 seconds 0.0.0.0:9000->8000/tcp nifty_kilby
docker run -d -p 9000:8000 deploy:1.0中-d表示后台运行,-p 9000:8000表示指定本地的9000端口隐射到容器内的8000端口。 deploy:1.0为咱们要运行的镜像。经过docker ps -a查看docker的进程(容器的运行自己就是一种特殊的进程)运行状况,发现咱们的容器已经在运行。本地能够访问localhost:9000。
经过docker logs能够查看咱们容器内应用进程的运行日志。docker logs <CONTAINER ID>
➜ my-app git:(master) ✗ docker logs 508739047fba > my-app@0.1.0 start /home/admin/app > cross-env NODE_ENV=dev react-scripts start Starting the development server... Compiled successfully! You can now view my-app in the browser. Local: http://localhost:3000/ On Your Network: http://172.17.0.2:3000/ Note that the development build is not optimized. To create a production build, use yarn build.
docker stop <CONTAINER ID>能够中止容器运行 docker start <CONTAINER ID>能够启动容器运行 docker restart <CONTAINER ID>能够重启容器 docker rm <CONTAINER ID> -f能够强制删除在运行的容器
➜ my-app git:(master) ✗ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: *** Password: Login Succeeded
docker tag deploy:1.0 dockerlogin/deploy:1.0
docker push dockerlogin/deploy:1.0
my-app git:(master) ✗ docker push deploy:1.0 The push refers to repository [docker.io/library/deploy] a624588532de: Preparing e472c10d9b1b: Preparing 7ef8f9a2435f: Preparing bc995157b3fa: Preparing 56b4f883ebdc: Preparing d8293569bfa4: Waiting c4d021050ecd: Waiting 9978d084fd77: Waiting 1191b3f5862a: Waiting 08a01612ffca: Waiting 8bb25f9cdc41: Waiting f715ed19c28b: Waiting denied: requested access to the resource is denied
未完待续。。。。