Docker镜像
一、Docker镜像分层
Dockerfile中的每个指令都会常见一个新的镜像层
镜像层被换出和复用
当Dockerfile的指令修改,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
某一层的镜像缓存失效之后,他之后的镜像层缓存都会失效
镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除他,则镜像依然会包含该文件
二、Docker镜像的创建
1、Docker镜像
应用发布的标准格式
支撑一个Docker容器的运行
2、Docker镜像的创建方法
①基于已有镜像创建
#将容器里面运行的程序及运行的环境打包成新的镜像
docker commit [选项] 容器ID/名称 仓库名称:[标签]
-m 说明信息
-a 作者信息
-p 生产过程中停止容器的运行
[root@localhost ~]# docker commit -m “new” -a “fyf” e63a4b50cd90 nginx01:fyf
②基于本地模板创建
#通过导入操作系统模板文件生产新的镜像
#使用wget命令导入为本地镜像
wget
http://download.openvz.org/template/precreated/debian-7.0-x86-minima.tar.gz
[root@localhost ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - new:fyf
③基于Dockerfile创建
3、Dockerfile
Dockerfile是由一组指令组成的文件
Dockerfile结构四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”开头的注释
指令 | 含义 |
---|---|
FROM镜像 | 指定新镜像所基于的镜像,第一条指定必须为FROM指令,每创建一个镜像就需要一条FROM指令 |
MAINTAINER名字 | 说明新镜像的维护人信息 |
RUN命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD[“要运行的程序”,“参数1.参数2”] | 指令启动容器时要运行的脚本或命令,Dokcerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行 |
EXPOSE端口号 | 指定新镜像加载到Dokcer时要开启的端口 |
ENV环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD源文件/目录 目录文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同的目录中,或者是一个URL |
COPY源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL |
VOLUMEP[目录] | 在容器中创建一个挂载点 |
USER用户名/UID | 指定运行容器时的用户 |
WORKDIR路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ONBUILD命令 | 指定所生成的镜像作为一个基础镜像时所需要运行的命令 |
HEALTHCHECK | 健康检查 |
三、构建sshd容器服务
sshd为secure shell的简称,可以通过网络在主机中开机shell的服务
操作步骤:
-
下载基础镜像
-
建立工作目录
-
创建那个编写Dokcerfile文件
-
生成镜像
-
启动容器
[root@fyf opt]# mkdir sshd #创建一个sshd的目录
[root@fyf sshd]# vim Dockerfile #创建一个Dockerfile镜像的目录
[root@fyf sshd]# vim Dockerfile
FROM centos #基于的基础镜像
MAINTAINER FYF #作者的名字,可随意写
RUN yum -y update #更新一下yum
RUN yum install -y openssh* net-tools lsof telnet passwd #镜像操作安装shhd所需的软件
RUN echo ‘123123’ | passwd --stdin root #给root用户添加一个密码,如果需要远程登录则输入这个密码就行
RUN sed -i ‘s/UsePAM yes/UsePAM no/g’ /etc/ssh/sshd_config #镜像操作将UsePAM=yes替换成 UsePAM=no
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key #镜像操作生成了密钥对
RUN sed -i ‘/^session\s+required\s+pam_loginuid.so/s/^/#/’ /etc/pam.d/sshd #将session required pam_loginuid.so注释掉
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh #创建一个隐藏目录,给他root权限,以及700的权限
EXPOSE 22 #暴露端口号
CMD ["/usr/sbin/sshd","-D"] #启动sshd服务
[root@fyf sshd]# docker run -d -P sshd:new #创建容器
[root@fyf sshd]# ssh localhost -p 49153 #测试进行远程登录
四、构建systemctl容器服务
systemctl是管制服务的主要工具,他整合了chkconfig与service功能于一体
操作步骤
- 建立工作目录
- 创建并编写Dockerfile
- 生成镜像
- 启动容器
- 验证systemctl
[root@fyf opt]# mkdir systemctl #创建一个systemctl目录
[root@fyf systemctl]# vim Dockerfile #创建一个Dockerfile镜像目录
FROM sshd:new #基于的基础镜像
ENV container docker #设置环境变量的值
RUN (cd /lib/systemd/system/sysinit.target.wants/;for i in *;do [$i == \systemd-tmpfiles-setup.service ] || rm -f $i;done);\ #进入目录,进行for循环,进行遍历目录,寻找systemd-tmpfiles-setup.service ,或者删除遍历出来的
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*;\
rm -f /lib/systemd/system/sockets.target.wants/*udev*;\
rm -f /lib/systemd/system/sockets.target.wants/*initctl*;\
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME ["/sys/fs/cgroup"] #进行挂载
CMD ["/usr/sbin/init"] #运行init
[root@fyf systemctl]# docker build -t systemd:new . #创建镜像
[root@fyf systemctl]# docker run --privileged -ti -v /sys/fs/cgroup/:/sys/fs/cgroup:ro systemd:new /sbin/init & #启动容器,–privileged是不降级处理,-v是进行挂载,ro是只读
五、构建Nginx容器
FROM centos:7
MAINTAINER test
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
–prefix=/usr/local/nginx \
–user=nginx \
–group=nginx \
–with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
RUN echo “daemon off;” >> /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 777 /run.sh
CMD ["/run.sh"]
#创建启动脚本
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
[root@fyf nginx]# docker build -t nginx:new .
[root@fyf nginx]# docker run -d -P nginx:new
六、构建Tomcat镜像
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir tomcat
[root@localhost opt]# cd tomcat/
[root@localhost tomcat]# vim Dockerfile
FROM centos:7
MAINTAINER FYF
ADD jdk-8u91-linux-x64.tar.gz /opt
ADD apache-tomcat-9.0.16.tar.gz /usr/local/src
RUN mv /opt/jdk1.8.0_91 /usr/local/java
RUN mv /usr/local/src/apache-tomcat-9.0.16 /usr/local/tomcat
ENV JAVA_HOME /usr/local/java
ENV CLASSPATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh",“run”]
[root@localhost tomcat]# docker build -t tomcat:new .
[root@localhost tomcat]# docker run -itd -P tomcat:new
七、构建mysql容器
[root@localhost ~]# mkdir /opt/mysql/
[root@localhost ~]# cd /opt/mysql
[root@localhost ~]# vim Dockerfile
FROM centos:7
MAINTAINER KY08
RUN yum -y install
ncurses
ncurses-devel
bison
cmake
make
gcc
gcc-c++RUN useradd -M -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock
-DSYSCONFDIR=/etc
-DSYSTEMD_PID_DIR=/usr/local/mysql
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS=all
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1
-DMYSQL_DATADIR=/usr/local/mysql/data
-DWITH_BOOST=boost
-DWITH_SYSTEMD=1 && make -j2 && make installRUN chown -R mysql:mysql /usr/local/mysql/
RUN rm -rf /etc/my.cnf
ADD my.cnf /etc
RUN chown mysql:mysql /etc/my.cnf
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql/
RUN bin/mysqld
–initialize-insecure
–user=mysql
–basedir=/usr/local/mysql
–datadir=/usr/local/mysql/dataRUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
RUN echo -e “#!/bin/sh \nsystemctl enable mysqld” > /run.sh
RUN chmod 755 /run.sh
RUN sh /run.sh
CMD [“init”]
[root@localhost ~]# docker run --name=mysql_server -d -P --privileged mysql:new
[root@localhost ~]# docker exec -it mysql_server bash
#进入容器的mysql给权限
grant all privileges on . ‘root’ @ ‘%’ identified by ‘abc123’;grant all privileges on . ‘root’ @ ‘localhost’ identified by ‘abc123’;
#进行远程登录
mysql -h 192.168.200.13 -u root -P xxxx -pabc123