电子说
八、Dockerfile**
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
以熟悉的centos为例:https://hub.docker.com/_/centos/
指明构建的新镜像是来自于哪个基础镜像,例如:
FROM centos: latest
指明镜像维护着及其联系方式(一般是邮箱地址),例如:
MAINTAINER JC Zhang zhangsan@163.com
不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如
LABEL maintainer=“zhangsan.cn”
构建镜像时运行的Shell命令,例如:
RUN [“yum”, “install”, “httpd”]
RUN yum install httpd
启动容器时执行的Shell命令,例如:
CMD ["-C", “/start.sh”]
CMD ["/usr/sbin/sshd", “-D”]
CMD /usr/sbin/sshd -D
声明容器运行的服务端口,例如:
EXPOSE 80 443
设置环境内环境变量,例如:
ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45
拷贝文件或目录到镜像中,PS:如果是URL或压缩包,会自动下载或自动解压,例如:
ADD …
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html
拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:
COPY ./start.sh /start.sh
启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序。
ENTRYPOINT ["/bin/bash", “-C”, “/start.sh”]
ENTRYPOINT /bin/bash -C ‘/start.sh’
PS:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。
指定容器挂载点到宿主机自动生成的目录或其他容器,例如:
VOLUME ["/var/lib/mysql"]
PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。
为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:
WORKDIR /data
创建目录
mkdir -p /export/docker/jdk8
将jdk-8u241-linux-x64.tar.gz上传到服务器(虚拟机)中的/export/docker/jdk8目录
创建文件Dockerfile
cd /export/docker/jdk8/
vi Dockerfile
#依赖镜像名称和id
FROM centos:latest
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JAR_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
docker build -t=‘jdk1.8’ .
注意后面的空格和点,不要省略,点表示当前目录
Hub默认centos镜像
准备编写DockerFile文件vim Dockerfile
FROM centos:latest
MAINTAINER zhangjc
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
docker build -t mycentos:1.1 .
docker run -it mycentos:1.1
在 Docker 中,当我们执行docker pull xxx的时候 ,它实际上是从 registry.hub.docker.com这个地址去查找,这就是Docker公司为我们提供的公共仓库。
在工作中,不可能把企业项目push到公有仓库进行管理。为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时允许搭建本地私有仓库。介绍registry、harbor两种私有仓库搭建。
Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了。
docker pull registry:2
docker run -di -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。
浏览器访问http://node1.itcast.cn:5000/v2/_catalog,出现下面情况说明registry运行正常
现在通过push镜像到registry来验证一下。
查看本地镜像
docker images
要通过docker tag将该镜像标志为要推送到私有仓库:
docker tag nginx:latest localhost:5000/nginx:latest
通过docker push命令将nginx镜像push到私有仓库中:
docker push localhost:5000/nginx:latest
访问 http://node1.itcast.cn:5000/v2/_catalog 查看私有仓库目录,可以看到刚上传的镜像了:
docker pull localhost:5000/镜像名:版本号
docker pull localhost:5000/nginx:latest
首先需要有一个阿里云的账号
镜像仓库申请地址:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
$ sudo docker login --username=xxx@aliyun.com registry.cn-hangzhou.aliyuncs.com
全部0条评论
快来发表一下你的评论吧 !