Docker自定义镜像的两种方法

一、基于Docker Commit制作镜像(少用)

1、基于centos镜像构建,创建一个名称为mynginx的容器,然后进入容器

docker run -itd --name mynginx centos:7
docker exec -it mynginx /bin/bash

2、安装epel源

rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

3、安装nginx,修改nginx配置文件

yum install nginx -y 
vi etc/nginx/nginx.conf

增加一行daemon off;默认是on
在这里插入图片描述

  • deamon on | off 表示是否以守护进程的方式运行nginx,守护进程是指脱离终端并且在后头运行的进程,关闭守护进程执行的方式可以让我们方便调试nginx,也可以在启动容器时nginx命令后加-g 'daemon off;也就是让他前台启动,而不是使用默认的后台启动的方式。

  • docker运行nginx为什么要使用 nginx -g ‘daemon off;’
    Docker 容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker 容器pid=1的进程挂了,那么docker容器便会直接退出。Docker未执行自定义的CMD之前,nginx的pid是1,执行到CMD之后,nginx就在后台运行,bash或sh脚本的pid变成了1。所以一旦执行完自定义CMD,nginx容器也就退出了。

然后退出镜像

exit

4、docker commit 提交

docker commit -m "My Nginx" mynginx mynginx:v1

-m 描述为My Nginx ,镜像名称为mynginx,打标签为v1
查看镜像,自己构建的镜像比原本的大了不少
在这里插入图片描述

5、创建并启动一个容器来测试自己构建的镜像,要带镜像名称和标签,没有标签的话会直接找镜像最新的版本,有标签的话可以指定版本。将物理主机的81端口映射到容器的80端口,启动后执行nginx命令开启nginx服务

docker run --name mynginxv1 -itd -p 81:80 mynginx:v1 nginx

二、Dockerfile自动化构建nginx镜像(常用)

1、参数说明

  • FROM,基于哪个基础镜像
  • MAINTAINER,代表维护者信息
  • COPY,往镜像里添加文件
  • RUN,运行命令构建镜像
  • ENTRYPOINT,镜像启动时运行的命令,不可替换,如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
  • CMD,镜像启动时运行的命令,可替换

2、创建一个文件夹然后进入文件夹

mkdir -p /usr/local/dockerfile/nginx

3、vim install.sh 创建一个nginx安装脚本

[root@localhost nginx]# vim install.sh 
yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/src
wget 'http://nginx.org/download/nginx-1.14.2.tar.gz'
tar -zxf nginx-1.14.2.tar.gz
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx && make && make install
rm -rf /usr/local/src/*

4、vim nginxstart 创建一个nginx启动脚本

[root@localhost nginx]# vim nginxstart 
#!/bin/bash
/usr/local/nginx/sbin/nginx -g "daemon off;"

5、vim Dockerfile 创建一个Dockerfile文件

[root@localhost nginx]# vim Dockerfile 
FROM centos:7
COPY install.sh /tmp/install.sh
RUN sh /tmp/install.sh
COPY nginxstart /usr/bin/nginxstart
ENTRYPOINT ["nginxstart"]

6、创建wangxiaoyu:nginx这个镜像,如果已经在构建目录下的话就可以用 . 而不用写绝对路径

docker build -t wangxiaoyu:nginx /usr/local/dockerfile/nginx/

7、查看镜像
在这里插入图片描述

8、使用dockerfile构建的镜像启动一个容器

docker run -itd --name wangxiaoyunginx wangxiaoyu:nginx

在这里插入图片描述
9、进入镜像查看,可以看到nginx已经启动了
docker exec -it wangxiaoyunginx /bin/bash
在这里插入图片描述

三、Dockerfile构建redis镜像

1、创建一个名为redis的文件夹然后进入文件夹

mkdir -p /usr/local/dockerfile/redis

2、编写redis安装脚本install.sh

[root@localhost redis]# vim install.sh 
yum install -y wget gcc gcc-c++ make tar openssl openssl-devel cmake
cd /usr/local/src
wget 'http://download.redis.io/releases/redis-4.0.9.tar.gz'
tar -zxf redis-4.0.9.tar.gz
cd redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir -pv /usr/local/redis/conf/
cp redis.conf /usr/local/redis/conf/
rm -rf /usr/local/src/*

3、编写redis启动脚本
vim redisstart

#!/bin/bash
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

chmod +x redisstart

4、编写Dockerfile

[root@localhost redis]# cat Dockerfile 
FROM centos:7
COPY install.sh /tmp/install.sh
RUN sh /tmp/install.sh
COPY redisstart /usr/bin/redisstart
CMD ["redisstart"]

5、构建redis镜像

docker build -t wangxiaoyu:redis /usr/local/dockerfile/redis/

6、使用构建的镜像创建一个容器,然后进入容器查看,可以看到有redis进程

docker images
docker run --name wangxiaoyuredis -itd wangxiaoyu:redis
docker exec -it wangxiaoyuredis /bin/bash

在这里插入图片描述在这里插入图片描述
四、Dockerfile构建nginx+redis多进程镜像

多进程镜像需求

  • Docker容器启动一个进程对于微服务是比较有用的
  • 但有时候Docker容器需要负责一个业务,一个业务往往有多个进程

1、创建一个文件夹然后进入

mkdir -p /usr/local/dockerfile/nginxredis

2、编写nginx安装脚本
vim install_nginx.sh

yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/src
wget 'http://nginx.org/download/nginx-1.14.2.tar.gz'
tar -zxf nginx-1.14.2.tar.gz
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx && make && make install
rm -rf /usr/local/src/*

3、编写redis安装脚本
vim install_redis.sh

yum install -y wget gcc gcc-c++ make tar openssl openssl-devel cmake
cd /usr/local/src
wget 'http://download.redis.io/releases/redis-4.0.9.tar.gz'
tar -zxf redis-4.0.9.tar.gz
cd redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir -pv /usr/local/redis/conf/
cp redis.conf /usr/local/redis/conf/
\rm -rf /usr/local/src/*

4、编写启动脚本然后加可执行权限,镜像启动时的最后一个命令要求是前台运行的,这个容器启动后才不会停止,其他命令在后台启动。
Script脚本 开头必须加 #!/bin/bash指定shell环境,否则会出现Standard_init_linux.go:190: exec user process caused “exec format error这样的错误。
vim allstart

#!/bin/bash
/usr/local/nginx/sbin/nginx
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

chmod +x allstart

5、编写Dockerfile
vim Dockerfile

FROM centos:7
COPY install_nginx.sh install_redis.sh /tmp/
RUN sh /tmp/install_nginx.sh
RUN sh /tmp/install_redis.sh
COPY allstart /usr/bin/
RUN sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/g' /usr/local/redis/conf/redis.conf
ENTRYPOINT ["allstart"]

6、镜像构建

docker build -t wangxiaoyu:nginxredis /usr/local/dockerfile/nginxredis/

如果之前已经使用过这个dockerfile进行过镜像构建,修改文件再构建的话可能会直接使用构建缓存,可以–no-cache参数取消使用缓存,因为有时候使用了缓存导致修改的文件没生效。

7、使用构建的镜像创建一个容器,然后进入容器查看,可以看到有nginx和redis进程。

docker run -d --name nginxredis wangxiaoyu:nginxredis
docker exec -it nginxredis /bin/bash

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值