docker镜像及dockerfile使用
一、docker镜像管理
1.1 docker镜像特性–1
容器创建时需要指定镜像,每个镜像都由唯一的标示Image ID和容器的container ID一样,默认128位,可以使用前16为缩略形式,也可以使用镜像名与版本号两部分组合唯一标示,如果省略版本号,默认使用最新版本标签(latesr)
镜像的分层:
docker的镜像通过联合文件系统(union filesystem)将各层文件系统叠加在一起。
>boots:用于系统引导的文件系统,包括BootLoader和kernel,容器启动完成后会被卸载以节省内存资源。
>roots:位于bootfs之上,表现为docker容器跟文件系统。
>>传统模式中,系统启动时,内核挂载roots时会首先将其挂载为“只读”模式,完整性自检完成后将其挂载为读写模式。
>>docker中,rootfs由内核挂载为“只读”模式,而后通过UFS技术挂载一个“可写”层。
1.2 docker镜像特性–2
>已有的分层只能读不能修改
>上层镜像优先级大于底层镜像
二、dockerfile使用方法
容器>镜像:docker commit CID -t xx.xx.xx
镜像要正常运行,必须有一个工作在前台的守护进程。
1.1 手动将容器保存为镜像
docker commit 容器id或者容器的名字 新的镜像名字[:版本号可选]
1)基于容器制作镜像
2)将容器提交为镜像 docker commit oldboy centos6-ssh-httpd:v1
3)测试镜像功能是否可用
手动制作的镜像,传输时间长 镜像初始命令
① 制作nginx镜像
docker run -it -p 81:80 centos:6.9 /bin/bash
echo "192.168.37.202 mirrors.aliyun.com" >>/etc/hosts
curl -o/etc/yum.repos.d/CentOSBase.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
docker run -it -p 81:80 centos:6.9 /bin/bash
docker ps -a
docker container commit fed851e32883 centos6.9_nginx:v1
docker run -d -p 82:80 centos6.9_nginx:v1 nginx -g'daemon off;
② 制作tomcat镜像(扫雷)
docker run -it -p 81:80 centos:6.9 /bin/bash
curl -o/etc/yum.repos.d/CentOSBase.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install tomcat
vi / init.sh
#!/bin/bash
service tomcat start
tail -f /var/log/tomcat/catalina.out
#把容器提交为镜像
docker commit 4a8871d37633 centos6.9_tomcat7:v1
#上传扫雷文件到/opt目录下,并且解压
#启动容器
docker run -d -p 8081:8080 -v /opt/saolei:/var/lib/tomcat/webapps/ROOT
#进入容器,移动扫雷文件内容
mv saolei saolei.index
③制作一个kodexplorer网盘docker镜像。nginx + php-fpm(httpd + php)
docker container rm -f `docker ps -a -q`
docker run -it -p 80:80 centos6.9_nginx:v1 /bin/bash
which nginx
curl -o kodexplorer4.40.zip http://192.168.37.202/linux59/kodexplorer4.40.zip
#安装php-fpm
yum install -y php-fpm #可道云缺失PHP依赖 php-gd php-mbstring
#修改PHP-fpm配置文件
user = nginx
group = nginx
#修改nginx配置文件
vi /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /code;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;
include fastcgi_params;
}
}
}
#创建站点目录/code 将可道云包拉入站点目录并且解压
#授权为nginx
chown -R nginx:nginx .
#书写脚本
vi /init.sh
#!/bin/bash
service php-fpm start
nginx -g 'daemon off;'
yum install lrzsz -y
sysctl net.ipv4.ip_forward=1
#创建镜像
docker commit 5dc4b8f503fe kod:v2
#启动容器
docker run -d -p 81:80 kod:v2 /bin/bash /init.sh
④ 制作phpwind镜像(数据库)
docker container rm -f `docker ps -a -q`
docker run -it -p 80:80 centos6.9_nginx:v1 /bin/bash
which nginx
#安装php-fpm
yum install -y php-fpm #可道云缺失PHP依赖 php-gd php-mbstring
#修改PHP-fpm配置文件
user = nginx
group = nginx
#安装数据库
yum install -y mysql-server ###注意 php-mysql
#添加数据库用户
mysql> create database phpwind;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on phpwind.* to 'phpwind'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
#修改nginx配置文件
vi /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /code;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;
include fastcgi_params;
}
}
}
#创建站点目录/code 将phpwind包拉入站点目录并且解压
#授权为nginx
chown -R nginx:nginx .
#重启php-fpm mysqld nginx服务
#/bin/bash
service php-fpm start
service mysqld start
nginx -g 'daemon off;'
#创建镜像
docker commit 439e87da54cd phpwind:v2
#启动容器
docker run -d -p 81:80 phpwind:v2 /bin/bash /init.sh
注意:在安装完成phpwind以后无法登陆
#docker时区问题导致
/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
1.2 dockerfile :
dockerfile是一种被docker程序解释的脚本,dockerfile由一条一条的指令组成,每条指令对应linux下面的一条命令。docker程序将这些dockerfile指令翻译真正的linux命令。dockerfile有自己的书写格式和支持的命令,docker程序解决这些命令间的依赖关系,类似于Makefile。docker程序将读取dockerfile,根据指令生成定制的image
生成命令:docker build -t manxiaoji/jdk-tomcat.
FROM 这个镜像的妈妈是谁?(指定基础镜像 image)
# FROM centos7.2,有且只有一个
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
LABLE 描述,标签
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(会自动解压tar) 制作docker基础的系统镜像
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
dockerfile其他指令:
COPY 复制文件(不会解压)rootfs.tar.gz
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
1.2.1使用dockerfile自动构建镜像:
(1) 搭建nginx环境
1:手动制作一次docker镜像(收集命令)
echo "192.168.37.202 mirrors.aliyun.com" >>/etc/hosts
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
2:编写dockerfile文件
vi /opt/dockerfile/nginx/dockerfile
FROM centos:6.9
RUN echo "192.168.37.202 mirrors.aliyun.com" >>/etc/hosts
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
CMD ["nginx","-g","daemon off;"]
3:docker build自动构建docker镜像
docker image build -t centos6.9_nginx:v2 --network=host .
4:测试docker镜像
docker run -d -p 88:80 centos6.9_nginx:v2
(2) 搭建扫雷环境 (nginx Tomcat)
1:手动制作一次docker镜像(收集命令)
echo "192.168.37.202 mirrors.aliyun.com" >>/etc/hosts
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install tomcat -y
cd /var/lib/tomcat/webapps/ && \
curl -o saolei.tar.gz http://192.168.37.202/linux59/saolei.tar.gz && \
tar -xf saolei.tar.gz && \
mv saolei ROOT
2:编写dockerfile文件
vi /opt/dockerfile/saolei/dockerfile
FROM centos6.9_nginx:v3
RUN curl -o/etc/yum.repos.d/CentOSBase.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install tomcat -y
RUN cd /var/lib/tomcat/webapps/ && \
curl -o saolei.tar.gz http://192.168.37.202/linux59/saolei.tar.gz && \
tar -xf saolei.tar.gz && \
mv saolei ROOT
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
(3) 搭建kod环境
1.手动制作镜像
2.编写dockerfile文件
[root@docker kod]# cat dockerfile
FROM centos6.9_nginx:v1
RUN curl -o/etc/yum.repos.d/CentOSBase.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install php-fpm php-gd php-mbstring unzip -y
RUN mkdir /code
WORKDIR /code
ADD kodexplorer4.40.zip /code/
RUN unzip kodexplorer4.40.zip
RUN chown -R nginx:nginx .
ADD nginx.conf /etc/nginx/nginx.conf
ADD php.conf /etc/php-fpm.d/www.conf
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
(4)搭建phpwind环境
[root@docker phpwind]# cat dockerfile
FROM centos6.9_nginx:v1
RUN curl -o/etc/yum.repos.d/CentOSBase.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install php-fpm php-gd php-mysql unzip mysql-server -y
RUN service mysqld start && \
mysql -e "create database phpwind;" && \
mysql -e "grant all on phpwind.* to 'phpwind'@'localhost' identified by '123456';"
RUN mkdir /code
WORKDIR /code
ADD phpwind_UTF8_8.7.1.zip /code/
RUN unzip phpwind_UTF8_8.7.1.zip
RUN chown -R nginx:nginx /code/*
ADD nginx.conf /etc/nginx/nginx.conf
ADD php.conf /etc/php-fpm.d/www.conf
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]