学习任务
Dockerfile命令
copy
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置.
COPY package.json /usr/src/app/
ADD
<源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
ADD hello /
ADD test.tar.gz / #添加到根目录并解压
WORKDIR /root
ADD hello test/ # /root/test/hello
注意:大部分情况下,COPY
优于ADD
,ADD
除了COPY
还有额外功能:解压。添加远程文件/目录使用 curl
或者wget
。
WORKDIR
使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
WORKDIR <工作目录路径>
注意:用WORKDIR,不要使用RUN cd,尽量使用绝对路径。
ENV
用来设置常量
ENV MYSQL_VERSION 5.6
RUN apt-get install -y mysql-server=`${MYSQL_VERSION}`\
&& rm -rf /var/lib/apt/lists/*
RUN
执行命令并创建新的Image Layer。
CMD
设置容器启动后默认执行的命令和参数。
构建镜像
- 通过容器构建镜像
基于某个镜像创建
# 启动一个容器centos
docker run it centos
# 进入容器
docker exec -it -d container_old /bin/bash
# commit镜像(创建一个镜像)
# docker container commit
docker commit container_name newImag
# container_name:容器名称
# newImage: 创建的新镜像名称
启动容器的方式
将关闭容器重新启动的方式:
docker start 容器名
- 通过Dockerfile构建镜像(推荐方式)
需要创建一个Dockerfile文件,并写入相关的操作。
首先创建的Dockrfile文件需要项目文件在同一级目录下面。
在Dockerfile文件里面编写如下代码:
FROM ecr.esisoo.com:5000/node:8.12.0
ADD project /tmp/project
#ADD后第一个参数是项目名称,第二个参数是项目代码路径,指定项目路径将项目文件添加到Docker环境
WORKDIR project
#启动容器时进入工作目录project下。
RUN npm install --production
# 当添加--production后不会自动下载node-modules。表示单纯的使用包而不需要进行一些改动测试之类的。
EXPOSE 3000
# 暴露容器内部项目运行的端口
CMD ["npm","start"]
# 容器启动时运行项目的命令
创建镜像
docker build [选项] <上下文路径/URL/->
docker image build 简写成:docker build
docker build -t myImage .
# myImage:自定义的镜像名字。
- 注意:不要忘记最后一个点,它表示使用当前路径下的Dockerfile。
这样一个镜像就创建成功了。
运行容器
docker run -d --name mycontainer -p 8080:3000 myImage
注意:
- -d : 表示以后台的方式运行容器,并且将容器的ID返回。
- mycontainer:对容器重新进行的命名的名字,通过—name进行重命名
- -p :表示将端口映射出去,方便我们进行访问。在这里是通过将暴露的3000端口映射到8080端口。
- myImage :表示镜像。
三、问题和困惑
总结: 今天的工作学习中,对镜像有了更深刻的认识。通过docker push的方式上传镜像到anydrm的镜像仓库,然后对上传的镜像进行拉取下来,然后再通过dcker pull的方式将镜像拉取下来,在本地虚拟机中可以创建一个新的Dockerfile,在该Dockerfile中可以只编写该项目的代码以及该项目的镜像地址即可。
然后再通过docker run的方式启动并创建一个容器:
docker run -d --name mycontainer -p 8080:3000 myImage
- 注意: 在这之前需要将该地址添加到信任列表中,在/etc/docker/touch daemon.json中添加该地址即可。