Dockerfile构建镜像实例

Dockerfile构建服务镜像

 

一、构建Tomcat服务镜像

创建目录

Mkdir tomcat

Cd tomcat

目录创建完成后,将jdk-8u81-linux-x64.tar.gz、apache-tomcat-8.5.16.tar.gz放在目录里

 

编写Dockerfile文件

 

 

 

FROM centos:7

MAINTAINER The liu

#解压java到目录/usr/local下,搭建tomcat环境

ADD jdk-8u91-linux-x64.tar.gz /usr/local/

WORKDIR /usr/local/

RUN mv jdk1.8.0_91 java

#设置环境变量

ENV JAVA_HOME /usr/local/java

ENV JRE_HOME /usr/local/java/jre

ENV CLASSPATH /usr/local/java/lib/:/usr/local/java/jre/lib

ENV PATH /usr/local/java/bin:$PATH

#解压安装Tomcat包

ADD apache-tomcat-8.5.16.tar.gz /usr/local/

WORKDIR /usr/local/

RUN mv apache-tomcat-8.5.16 /usr/local/tomcat

EXPOSE 8080

ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

 

 

 

创建镜像和容器

docker build -t tomcat.new .###注意别忘了“.”

 

 

 

查看端口号,到浏览器测试

docker run -d -P tomcat.new

 

 

 

 

 

 

 

二、构建ssh服务镜像

使用docker exec命令登录容器不需要密码,存在一定的风险。为提高安全性,构建ssh秘钥服务镜像,新建一个容器

创建目录sshd,存放Docker文件

mkdir sshd

cd sshd

 

构建镜像ssh

Vim Dockerfile

FROM centos:7

MAINTAINER this is ssh

#更新容器的yum源

RUN yum -y update

#安装ssh和其他服务软件包

RUN yum install -y openssh* net-tools lsof telnet passwd

#修改root用户密码

RUN echo "123456" | passwd --stdin root

#设置不使用ssh服务端的pam模块

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

#关闭pam.d机制里的ssh会话模块

RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^ /#/' /etc/pam.d/sshd

#创建ssh工作目录并放通权限

RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh

#开通端口

EXPOSE 22

#开启sshd服务,容器的centos7镜像里没有systemctl命令,故不能用服务的方式启动

CMD ["/usr/sbin/sshd","-D"]

 

 

 

 

生成镜像

Docker build -t sshd:new . #注意“.”不要忘记

启动容器并修改root密码

docker run -d -P sshd:new      # -P指随机分配一个端口映射

 

 

 

 

 

 

通过ssh端口登录容器

 

 

 

 

三、构建systemctl镜像

容器的 centos7镜像里没有systemctl命令,故不能使用此命令管理服务,需要构建。

创建目录,存放Dockerfile文件

mkdir systemctl

cd systemctl

 

vim Dockerfile

#基于ssh服务搭建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"]

 

 

 

生成镜像,启动容器

docker build -t systemd:new .

 

#privateged container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户

docker run --privileged -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:new /sbin/init

 

 

 

 

测试可以通过systemctl管理ssh服务

 

 

 

 

四、构建NGINX镜像

创建目录,存放Dockerfile文件

mkdir nginx

cd nginx/

将NGINX-1.12.2.tar.gz传到NGINX目录中

编写文件

Vim Dockerfile

FROM centos:7

MAINTAINER this is nginx

RUN yum install -y gcc gcc-c++ make pcre-devel zlib-devel

RUN useradd -M -s /sbin/nologin nginx

ADD nginx-1.12.2.tar.gz /opt/

WORKDIR /opt/nginx-1.12.2/

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  

#指定http和https端口

EXPOSE 443

EXPOSE 80

#关闭守护进程,这里必须设置

RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf

ADD run.sh /run.sh

RUN chmod 775 /run.sh

CMD ["/run.sh"]

 

 

 

编写启动脚本,放在同一目录下

Vi run.sh

#!/bin/bash

/usr/local/nginx/sbin/nginx

生成镜像,并启动容器

docker build -t nginx:new .

docker run -d -P nginx:new

 

 

 

验证测试

 

 

 

构建MySQL服务镜像

创建MySQL目录

mkdir mysqld

cd mysqld

将MySQL-boot-5.7.20.tar.gz上传到此目录

创建Dockerfile

Vim Dockerfile

FROM centos:7

RUN yum install -y gcc gcc-c++ ncurses ncurses-devel bison cmake make

#创建程序用户

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/

#删除原有my.cnf配置文件

RUN rm -rf /etc/my.cnf

#添加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

#指明服务端口

EXPOSE 3306

#优化路径

RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/

#配置开机自启

RUN echo -e "#!/bin/sh \nsystemctl enable mysqld" > /run.sh

RUN chmod 755 /run.sh

#启动

RUN sh /run.sh

CMD ["init"]

 

 

 

 

 

 

Vim my.conf修改MSQL配置文件

[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文件

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

 

 

 

创建MySQL镜像

docker build -t mysql:new

 

 

 

构建启动容器

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

 

 

 

进入容器   docker exec -it ad8253b3a2e4 /bin/bash

登录数据库 mysql -uroot -p

 

 

posted @ 2020-11-30 00:18  escape丶丶  阅读(160)  评论(0)    收藏  举报