一、基于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