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 install

RUN 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/data

RUN 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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值