Docker构建自定义镜像
Posted Ricky_0528
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker构建自定义镜像相关的知识,希望对你有一定的参考价值。
文章目录
1. 镜像制作的两种方法
- 基于Docker Commit制作镜像
- 基于Dockerfile制作镜像,该方法为目前主流的方式
2. Commit构建自定义镜像
- 启动并进入容器:
docker run -it centos:7 /bin/bash
- 在/home路径下创建test文件夹:
mkdir /home/test
- 安装ifconfig命令:
yum -y install net-tools
- 重启容器,查看容器的test文件夹还在不在:
docker restart 67862569d4f7
- 删除容器,再重新启动一个容器进入查看有没有这个test文件夹:
docker rm 67862569d4f7 && docker run -it centos:7 /bin/bash
发现test文件夹没有了
- 构建镜像:
docker commit eeb6ee3f44bd mycentos:7
docker commit -a "Ricky" -m "mkdir /home/test" eeb6ee3f44bd mycentos:7
- -a:标注作者
- -m:注释
- 查看详细镜像详细信息:
docker inspect c98e30feab0f
- 启动容器:
docker run -itd c98e30feab0f /bin/bash
- 进入容器:
docker exec -it 2a4d38eca64f /bin/bash
3. Dockerfile构建镜像
- Dockerfile
# this is a dockerfile FROM centos:7 MAINTAINER XD 123456@qq.com RUN echo "正在构建镜像!!!" WORKDIR /home/xdclass COPY 123.txt /home/xdclass RUN yum install -y net-tools
- 构建:
docker build -t mycentos:v2 .
- 查看:
docker images
4. 镜像的分层结构
- 镜像层与容器层共享资源
- 对容器的任何改动都是发生在容器层
- 容器层是可读可写,而镜像层只读
5. Dockerfile基础指令
- FROM:基于哪个镜像
- MAINTAINER:注明作者
- COPY:复制文件进入镜像(只能使用相对路径,不能用绝对路径)
- ADD:复制文件进入镜像(加入文件是.tar.gz的压缩文件,会自动被解压,且源文件会被删除)
- WORKDIR:指定工作目录,加入路径不存在会自动创建
- ENV:设置环境变量
- EXPOSE:暴露容器的端口
- RUN:在构建镜像的时候执行,作用于镜像层
- ENTRYPOINT:在容器启动的时候执行,作用于容器层,Dockerfile里面有多条时只允许执行最后一条
- CMD:
- 在容器启动的时候执行,作用域容器层,Dockerfile里有多条时只允许执行最后一条
- 容器启动后执行默认的命令或者参数,允许被修改
- 命令格式:
- shell命令格式:RUN yum install -y net-tools
- exec命令格式:RUN [“yum”, “install”, “-y”, “net-tools”]
6. Java服务器镜像构建
- 文件准备:jdk-8u211-linux-x64.tar.gz和apache-tomcat-8.5.35.tar.gz放到宿主机目录下
- 宿主机配置jdk
export JAVA_HOME=/usr/local/jdk export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
- 写入到配置文件:
vi /etc/profile
- 更新当前环境变量:
source /etc/profile
- 检查:
java --version
- Dockerfile
FROM centos:7 ADD jdk-8u211-linux-x64.tar.gz /usr/local RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk ENV JAVA_HOME=/usr/local/jdk ENV JRE_HOME=$JAVA_HOME/jre ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH ADD apache-tomcat-8.5.35.tar.gz /usr/local RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat EXPOSE 8080 ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
- 启动容器:
docker run -itd -p 80:8080 -v /root/test/ROOT:/usr/local/tomcat/webapps/ROOT mycentos:jdk /bin/bash
- 访问localhost:80,成功
7. nginx镜像构建
- 文件准备:nginx-1.16.0.tar.gz放到宿主机目录下
- Dockerfile
FROM centos:7 ADD nginx-1.16.0.tar.gz /usr/local COPY nginx_install.sh /usr/local RUN sh /usr/local/nginx_install.sh EXPOSE 80
- 安装Nginx的shell脚本nginx_install.sh,可以直接使用
#!/bin/bash yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel cd /usr/local/nginx-1.16.0 ./configure --prefix=/usr/local/nginx && make && make install
- 制作Nginx镜像:
docker build -t mycentos:nginx .
- Nginx镜像启动注意
- 在容器里Nginx是以daemon方式启动,退出容器时,Nginx程序也会随着停止:
/usr/local/nginx/sbin/nginx
- 使用前台方式永久运行:
/usr/local/nginx/sbin/nginx -g "daemon off;"
- 在容器里Nginx是以daemon方式启动,退出容器时,Nginx程序也会随着停止:
- 启动容器:
docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
- 访问localhost:80,成功
8. Redis镜像构建
- 文件准备:redis-4.0.9.tar.gz放到宿主机目录下
- Dockerfile
FROM centos:7 ADD redis-4.0.9.tar.gz /home COPY redis_install.sh /home RUN sh /home/redis_install.sh ENTRYPOINT /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
- 安装Redis的脚本redis_install.sh
#!/bin/bash yum install -y gcc gcc-c++ make openssl openssl-devel cd /home/redis-4.0.9 make && make PREFIX=/usr/local/redis install mkdir -p /usr/local/redis/conf/ cp /home/redis-4.0.9/redis.conf /usr/local/redis/conf/ sed -i '69s/127.0.0.1/0.0.0.0/' /usr/local/redis/conf/redis.conf sed -i '88s/protected-mode yes/protected-mode no/' /usr/local/redis/conf/redis.conf
- 测试Redis
- 启动容器:
docker run -itd -p 6380:6379 mycentos:redis #6380是宿主机端口,6379是容器的端口
- 进入容器:
docker exec -it 9b402baeaba7 /bin/bash
- 宿主机连接Redis:
/usr/local/redis/bin/redis-cli -p 6380
- 验证:
127.0.0.1:6380> set name Ricky OK 127.0.0.1:6380> get name "Ricky" 127.0.0.1:6380>
- 启动容器:
9. 快速部署mysql并初始化
- 将MySQL镜像拉到本地:
docker pull mysql:5.7
- 启动:
docker run --name some-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
- 进入容器:
docker exec -it 4336ae28fbfa env LANG=C.UTF-8 /bin/bash
- Dockerfile
FROM mysql:5.7 WORKDIR /docker-entrypoint-initdb.d ENV LANG=C.UTF-8 ADD init.sql .
以上是关于Docker构建自定义镜像的主要内容,如果未能解决你的问题,请参考以下文章
Docker -- 自定义镜像(Dockerfile)基于Ubuntu镜像构建一个新镜像基于java:8-alpine镜像将一个Java项目构建为镜像