Docker(5)Dockerfile-1使用
2020-04-15
以交互的方式进入容器,修改代码,使用docker commit制作镜像,不建议使用(比如nginx)
这是运行nginx容器并且映射80端口
docker run --name webserver -d -p 80:80 nginx
启动如图
我们希望改成欢迎 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
的内容。
现在我们再刷新浏览器的话,会发现内容被改变了。
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
端口。
访问后如图:
慎用 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