Docker镜像与利用dockerfile 创建ssh、mysql、nginx、tomcat、systemctl服务容器

一、Docker镜像

1.1 什么是Docker镜像

  • 在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。

  • 由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化,所以Docker镜像是分层的

1.2 Docker镜像的分层

  • Dockerfile的每个指令都会创建一个新的镜像层
  • 镜像层将被缓存和复用
  • 当dockerfile指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效。
  • 某一层的镜像缓存失效之后,它之后的镜像缓存都会失效
  • 镜像层是不可改变的,如果在某一层中添加了一个文件,然后在下一层中删除它,则镜像中依然会包含该文件。
  • 镜像 Dockfile生成 。 镜像分层,自下而上制作镜像
层数关键词
第一层FROM ubuntu:14.04 基于一个基础镜像,服务基于这个基础镜像之上
第二层ADD run.sh/ 指定一个脚本(在宿主上写,写完拷贝到容器)
第三层VOLUME /data 挂载宿主共享空间
第四层CMD ["./run.sh"] 定义启动容器时执行哪一条指令

1.3 Docker镜像创建的三种方式

  • 基于已有镜像的创建
    将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项] 容器ID/名称   仓库名称:[标签]
-m  说明信息
-a   作者信息
-p  生成过程中停止容器的运行
  • 基于本地模板创建‘
    通过导入操作系统模板文件生成新的镜像
    使用wget命令导入为本地镜像
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz ## 下载模板文件
[root@docker opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
[root@docker opt]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daoke               new                 487145d2411f        8 seconds ago       215MB
  • 基于Dockerfile创建
    Dockerfile 是由一组指令组成的文件
    Dockerfile结构文件
    基础镜像文件
    维护者信息
    镜像操作指令
    容器启动时执行指令
    Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以"#"号 开头的注释
    Dockerfile
指令含义
FROM镜像 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER 名字说明新镜像的维护人信息
RUN 命令在所基于的镜像执行命令,并提交到新的镜像中
CMD [ “要运行的程序”,“参数1”,“参数2”]指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条
EXPOSE 端口号指定新镜像加载到Docker时要开启的端口
ENV 环境变量 变量值设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录 目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME [“目录”]在容器中创建一个挂载点
USER 用户名/UID指定运行容器时的用户
WORKDIR 路径为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD 命令指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK健康检查

二、dockerfile容器的构建

2.1 dockerfile 构建ssh

FROM centos:7
MAINTAINER this is wang CentOS Project
RUN yum -y update
RUN yum -y install openssh* net-tools losf telnet passwd
RUN echo '123456' | passwd -stdin root
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/s^/#/' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
[root@localhost sshd]# docker build -t sshd:new .
[root@localhost sshd]# docker run -d -P sshd:new
[root@localhost sshd]# docker run -d -P sshd:new
2dd22ce391862097ba3539e8460fb3abfba8ac0c031dea4700dc833abfa99ede
[root@localhost sshd]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS                            PORTS                   NAMES
2dd22ce39186        sshd:new              "/usr/sbin/sshd -D"      17 seconds ago       Up 17 seconds                     0.0.0.0:32768->22/tcp   loving_wing
[root@localhost sshd]# ssh localhost -p 32768
The authenticity of host '[localhost]:32768 ([::1]:32768)' can't be established.
RSA key fingerprint is SHA256:L/TLtYtX7BcjlVOc+cVl63pPJXxZhQpP2+363tFvwC0.
RSA key fingerprint is MD5:c2:58:df:b8:a6:e8:4c:cc:7b:9e:e2:10:f9:72:4c:8a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:32768' (RSA) to the list of known hosts.
root@localhost's password: 

2.2 dockerfile 构建systemctl服务

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);\
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" ]
[root@localhost systemctl]# docker build -t systemd:new  .
[root@localhost systemctl]# docker run --privileged -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:new /sbin/init &
[1] 4229
[root@localhost systemctl]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                        PORTS                   NAMES
54c259dccde0        systemd:new           "/sbin/init"             27 seconds ago      Up 26 seconds                 22/tcp                  amazing_goldstine
[root@localhost systemctl]# docker exec  -it 54c259dccde0 bash
[root@54c259dccde0 /]# systemctl  status  sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:sshd(8)
           man:sshd_config(5)
[root@54c259dccde0 /]# systemctl  start  sshd

2.3 dockerfile 构架nginx服务

ADD 既负责把压缩包复制到容器中,还负责解压压缩包
[root@localhost ~]# mkdir nginx
[root@localhost ~]# cd nginx/
[root@localhost nginx]# vim Dockerfile
FROM systemd:new
MAINTAINER  this is syystemctl + nginx
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz  /usr/local/src
WORKDIR /usr/local/src
WORKDIR nginx-1.12.2
RUN  ./configure  --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
RUN  ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
[root@localhost nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx                      
[root@localhost nginx]# docker build -t nginx:new .
docker run -d -p nginx:new

2.4 dockerfile 构建Tomcat

Tomcat CMD 命令起不来  要用ENTRYPOINT 才起得来
[root@localhost ~]# mkdir  tomcat
[root@localhost ~]# cd tomcat/

FROM centos:7
MAINTAINER this is tomcat
ADD jdk-8u91-linux-x64.tar.gz  /usr/local
WORKDIR /usr/local/
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java/bin
ENV JRE_HOME /usr/local/java/jre
ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
ADD apache-tomcat-9.0.16.tar.gz /usr/local
WORKDIR /usr/local/
RUN mv apache-tomcat-9.0.16  /usr/local/tomcat8
EXPOSE 8080
#CMD [ "/usr/local/tomcat8/bin/catalina.sh","run"]
ENTRYPOINT [ "/usr/local/tomcat8/bin/catalina.sh","run"]
~                                                           
[root@localhost tomcat]# docker build  -t tomcat:centos .
[root@localhost tomcat]# docker run -d --name tomcat01 -p 1234:8080 tomcat:centos

2.5 dockerfile 构建mysql

5:mysql容器(手工编译)
【构建MySQL镜像】

mkdir mysqld
cd mysqld

vim my.cnf

[client]
port=3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock

[mysql]
port=3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock

[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
character_set_server=utf8
pid-file=/usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
server-id=1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

vim Dockerfile

FROM centos:7
MAINTAINER This is MySQL
RUN yum -y install  \
ncurses \
ncurses-devel \
bison \
cmake \
make \
gcc \
gcc-c++
RUN useradd -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_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 && 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/bash \nsystemctl enable mysqld" > /run.sh
RUN chmod 755 /run.sh
RUN sh /run.sh
CMD ["init"]

docker build -t mysql:centos .

docker run --name=mysql_server -d -P --privileged mysql:centos

docker exec -it xxxxxxxx bash

grant all privileges on *.* to 'root'@'%' identified by '123456';

安装 MariaDB
[root@localhost mysqld]# yum -y install mariadb mariadb-server
[root@localhost mysqld]# systemctl start mariadb


mysql -h 192.168.233.100 -uroot -P 32768  -p123456
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值