Docker(5)Dockerfile-1使用

2020-04-15

以交互的方式进入容器,修改代码,使用docker commit制作镜像,不建议使用(比如nginx)

这是运行nginx容器并且映射80端口
docker run --name webserver -d -p 80:80 nginx

启动如图
image.png

我们希望改成欢迎 Docker 的文字,我们可以使用 docker exec 命令进入容器,修改其内容。
docker exec -it webserver bash

echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

exit

我们以交互式终端方式进入 webserver 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。

然后,我们用 <h1>Hello, Docker!</h1> 覆盖了 /usr/share/nginx/html/index.html 的内容。

现在我们再刷新浏览器的话,会发现内容被改变了。
image.png

Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。

docker commit 的语法格式为:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

我们可以用下面的命令将容器保存为镜像:

$ docker commit \
    --author "Tao Wang <twang2218@gmail.com>" \
    --message "修改了默认网页" \
    webserver \
    nginx:v2

其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。
我们可以在 docker image ls 中看到这个新定制的镜像:

docker image ls nginx
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v2                  07e334659748        9 seconds ago       181.5 MB
nginx               1.11                05a60462f8ba        12 days ago         181.5 MB
nginx               latest              e43d811ce2f4        4 weeks ago         181.5 MB```

我们还可以用 docker history 具体查看镜像内的历史记录,如果比较 nginx:latest 的历史记录,我们会发现新增了我们刚刚提交的这一层。

docker history nginx:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
07e334659748        54 seconds ago      nginx -g daemon off;                            95 B                修改了默认网页
e43d811ce2f4        4 weeks ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon    0 B
<missing>           4 weeks ago         /bin/sh -c #(nop)  EXPOSE 443/tcp 80/tcp        0 B
<missing>           4 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx/   22 B
<missing>           4 weeks ago         /bin/sh -c apt-key adv --keyserver hkp://pgp.   58.46 MB
<missing>           4 weeks ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.11.5-1   0 B
<missing>           4 weeks ago         /bin/sh -c #(nop)  MAINTAINER NGINX Docker Ma   0 B
<missing>           4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B
<missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:23aa4f893e3288698c   123 MB

新的镜像定制好后,我们可以来运行这个镜像。

docker run --name web2 -d -p 81:80 nginx:v2

这里我们命名为新的服务为 web2,并且映射到 81 端口。
访问后如图:
image.png

慎用 docker commit
  • 会导致程序臃肿。
  • 使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,以后并不记得修改了什么,维护痛苦。

Dockerfile使用

简单使用构建一个tomcat镜像。

  • 下载tomcat镜像
docker pull tomcat
cd /usr/local/
mkdir docker
cd docker
mkdir tomcat
cd tomcat
touch Dockerfile
vim Dockerfile
#指定基础镜像,将要继承的镜像,只能作为第一个命令
FROM tomcat
#进入这个工作目录
WORKDIV /usr/local/tomcat/webapps/ROOT/
#删除多余的东西
RUN rm -fr *
#执行命令行命令的,运行命令
RUN echo "hello docker" > /usr/local/tomcat/webapps/ROOT/index.html
#保存退出就要构建镜像了
#docker build -t编译为镜像
#mytomcat镜像名
#v3标签,版本
#.指定上下文路径,当前整个目录(表面上命令是在宿主机执行的,其实他是通过远程调用的方式使用Docker服务端执行的,获取上下文后docker build会得知这个路径,然后上传给docker引擎,这样docker收到这个上下文包后,展开后就会获得构建镜像的一切文件)
docker build -t mytomcat:v3 .
#运行命令
docker run -p 8080:8080 mytomcat
#至此访问 服务器ip:8080,就会出现hello docker字样

#Dockerfile之制作jdk镜像

  • 在 /root 下创建 docker/jdk 目录
mkdir -p /root/docker/jdk
  • 进入 /root/docker/jdk 目录
cd /root/docker/jdk
  • 上传 jdk 到当前目录
  • 创建 Dockerfile 文件
touch Dockerfile

编辑 Dockerfile 文件

#基于alpine-glibc进行二次开发
FROM centos:7
#维护者和联系方式
MAINTAINER ZhangFan 2868508839@ww.com

#使用root用户执行命令
USER root

#在/root目录下执行命令
WORKDIR /root

#拷贝宿主机当前目录下的jdk到镜像内的/root目录
COPY jdk-8u221-linux-x64.tar.gz /root

#解压jdk
RUN tar -xvf jdk-8u221-linux-x64.tar.gz

#剪切jdk到/usr/local/jdk
RUN mv jdk1.8.0_221 /usr/local/jdk

#删除jdk压缩包
RUN rm -f jdk-8u221-linux-x64.tar.gz

#配置JAVA_HOME环境变量
ENV JAVA_HOME=/usr/local/jdk

#配置CLASSPATH环境变量
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

#配置PATH环境变量
ENV PATH $PATH:$JAVA_HOME/bin

#在容器启动时输出jdk版本号
CMD java -version
  • 使用 docker build -t jdk-v1 . 命令构建镜像
  • 构建失败需要先删除失败的镜像,再重新构建
  • 运行镜像,查看是否成功

#使用Dockerfile制作eureka镜像

  • 打包 eureka-server 项目,并上传
  • 创建 Dockerfile 文件
#基于Java镜像的二次开发
FROM java
#维护者和联系方式
MAINTAINER ZhangFan 2868508839@qq.com
#设置执行命令用户为root用户
USER root
#设置执行命令目录/usr/local/docker/eureka
WORKDIR /usr/local/docker/eureka
#设置容器8761端口需要映射到宿主机
EXPOSE 8761
#拷贝宿主机当前目录下的 jar 文件到镜像内的/usr/local/docker/eureka目录
COPY eureka.jar /usr/local/docker/eureka
#在容器启动后使用 java -jar xx.jar 命令启动 eureka-server 程序
CMD java -jar eureka.jar
  • 构建eureka-server 镜像
docker build -t eureka-server .
  • 以后台模式运行eureka-server 镜像,用宿主机的8080端口映射docker的8761端口
docker run -d -p 8080:8761 eureka-server
  • 在浏览器中访问IP:8080
  • 一个容器一个电脑的,使用的时候必须把所有的IP都修改成你使用的服务器的IP

标题:Docker(5)Dockerfile-1使用
作者:张范
地址:http://misterzhang.top/articles/2020/04/13/1586748858469.html