美文网首页
3、Docker核心必备之自定义镜像实战

3、Docker核心必备之自定义镜像实战

作者: 日落_3d9f | 来源:发表于2021-07-25 20:29 被阅读0次

3.1 构建自定义镜像的意义与应用场景

简介:介绍自定义镜像的重要性

  • docker目前镜像的制作有俩种方法:
    • 基于Docker Commit制作镜像
    • 基于dockerfile制作镜像,Dockerfile方式为主流的制作镜像方式

3.2 Commit构建自定义镜像

简介:对容器的修改以及保存

  • 启动并进入容器:docker run -it centos:7 /bin/bash
  • 在/home 路径下创建xdclass文件夹:mkdir /home/xdclass
  • 安装ifconfig命令:yum -y install net-tools
  • 重启容器,查看容器的xdclass文件夹还在不在:docker restart 67862569d4f7
  • 删除容器,再重新启动一个容器进入查看有没有xdclass文件夹:
    • docker rm 67862569d4f7 && docker run -it centos:7 /bin/bash
  • 构建镜像:
    • docker commit 4eb9d14ebb18 mycentos:7
    • docker commit -a "XD" -m "mkdir /home/xdclass" 4eb9d14ebb18 mcentos:7
    • -a:标注作者
    • -m:说明注释
    • 查看详细信息:docker inspect 180176be1b4c
  • 启动容器:docker run -itd 180176be1b4c /bin/bash
  • 进入容器查看:docker exec -it 2a4d38eca64f /bin/bash

3.3 核心必备知识之Dockerfile构建镜像实战

简介: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
  • 进入验证:验证成功

3.4 Docker核心知识之镜像分层结构剖析

简介:介绍镜像的分层结构

使用dockerfile构建镜像

使用dockerfile构建镜像的时候,每一个步骤都会生成一个镜像ID。

使用docker history命令可以查看docker构建镜像的过程。

查看历史 docker分层结构
  • 总结:
    • 共享资源
    • 对容器的任何改动都是发生容器层
    • 容器层是可写可读,而镜像层只读

3.5 不得不掌握的Dockerfile基础指令

简介:介绍一些常用的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"]
  • dockerfile

#第一个
FROM centos:7
RUN echo "images building!"
CMD ["echo","container","starting..."]
ENTRYPOINT ["echo","container","starting !!!"]
#第二个
FROM centos:7
RUN echo "images building!"
CMD ["echo","containe1r","starting..."]
CMD ["echo","container2","starting..."]
ENTRYPOINT ["echo","container2","starting !!!"]
ENTRYPOINT ["echo","container2","starting !!!"]
#第三个
FROM centos:7
CMD ["-ef"]
ENTRYPOINT ["ps"]
构建镜像

执行第一个dockerfile,我们会发现仅执行run的时候出现images building提示,在CMD、ENTRYPOINT 命令时候没有提示。这是因为run命令作用于镜像层面,CMD、ENTRYPOINT命令作用于容器层。另外容器启动的时候,我们看到了CMD、ENTRYPOINT命令的执行。

docker提示

执行第二个dockerfile,如下:


执行第二个dockerfile

跟执行第一个dockerfile类似,启动构建的容器:

image.png

我们发现ENTRYPOINT、CMD dockerfile里有多条时只允许执行最后一条。

执行第三个dockerfile,过程如下图所示:


docker构建过程

执行镜像:


执行镜像 自己添加命令可以覆盖CMD命令

3.6 实战系列之Dockerfile构建JAVA网站镜像

简介:Dockerfile构建java环境

本地宿主机配置jdk

vi /etc/profile
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
  • 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"]
  • EXPOSE:功能为暴漏容器运行时的监听端口给外部

  • 启动容器,并挂载目录:

docker run -itd -p 80:8080 -v /root/test/ROOT:/usr/local/tomcat/webapps/ROOT
mycentos:jdk /bin/bash
  • 网页进行访问验证

3.7 实战系列之Dockerfile构建nginx镜像

简介:Dockerfile构建nginx

  • 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脚本

#!/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;"
  • 检查验证:

    • docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"

3.8 实战系列之Dockerfile构建redis镜像

简介:Dockerfile构建redis

  • 编写redis编译安装shell脚本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
  • 编写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:
    • 启动容器: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
    • 验证:
[root@localhost home]# /usr/local/redis/bin/redis-cli -p 6380
127.0.0.1:6380> set name xdclass
OK
127.0.0.1:6380> get name
"xdclass"
127.0.0.1:6380>

3.9 实战系列之docker快速部署mysql数据库并初始化

简介:Dockerfile快速部署mysql数据库并初始化

  • 官方网址:

  • 启动命令:

    • 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 .
  • 初始化sql语句:
-- 建库
create database `db_student`;
SET character_set_client = utf8;
use db_student;
-- 建表
drop table if exists `user`;
CREATE TABLE user (
id tinyint(5) zerofill auto_increment not null comment '学生学号',
name varchar(20) default null comment '学生姓名',
age tinyint default null comment '学生年龄',
class varchar(20) default null comment '学生班级',
sex char(5) not null comment '学生性别',
unique key (id)
)engine=innodb charset=utf8;
-- 插入数据
insert into user values('1','小明','15','初三','男');
insert into user values('2','小红','13','初二','女');
insert into user values('3','小东','14','初一','男');
insert into user values('4','小西','12','初二','男');

相关文章

网友评论

      本文标题:3、Docker核心必备之自定义镜像实战

      本文链接:https://www.haomeiwen.com/subject/lurymltx.html