Dockerfile练习

root
233
文章
0
评论
2020年5月15日23:42:48 评论 6428字阅读21分25秒

Dockerfile练习

实验一:要求使用centos7基础镜像,搭建httpd+sshd+php的镜像,实现httpd与sshd服务能够正常访问

创建存放dockerfile的目录

mkdir -p /opt/kk/
vim /opt/kk/dockerfile
# Centos-sshd-httpd
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum makecache && yum -y install httpd openssh* php php-mysql
RUN mkdir /var/run/sshd && echo "UseDNS no" >>/etc/ssh/sshd_config && sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd && echo "123456"|passwd --stdin root && /usr/bin/ssh-keygen -A
ADD ./init.sh /
VOLUME ["/var/www/html"]
EXPOSE 22
EXPOSE 80
ENTRYPOINT ["/bin/bash","/init.sh"]

写一个init.sh的多服务启动脚本

#!/bin/bash
/usr/sbin/httpd
/usr/sbin/sshd -D

使用docker制作镜像

[root@kk kk]# docker build -t "kk/cen7_sshd_httpd:v1" .

启动镜像容器

[root@kk kk]# docker container run -d --name="cen7_sshd_httpd" --restart=always -p 220:22 -p 800:80 -v /opt/vol/html/:/var/www/html/ 5024f8ae8a2d

查看容器状态

[root@kk kk]# docker container ls 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                      NAMES
ee0952f8d9c8        5024f8ae8a2d        "/bin/bash /init.sh"   6 minutes ago       Up 6 minutes        0.0.0.0:220->22/tcp, 0.0.0.0:800->80/tcp   cen7_sshd_httpd

进行服务测试

2.应用容器化练习

所有应用镜像都是使用centos基础镜像写dockerfile制作

容器1:httpd+php(页面展示数据查询):容器数量2

创建相关目录

mkdir ~/httpd

cd ~/httpd

vim dockerfile

# Centos7_HTTPD_PHP
FROM centos:7
RUN yum -y install httpd php php-mysql
ADD index.php /var/www/html
VOLUME /var/www/html
ENTRYPOINT ["/usr/sbin/httpd","-D","FOREGROUND"]

vim index.php

<!DOCTYPE HTML>
<html>
    <head>
        <title>小泊随記-留言板</title>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
        <meta name="keywords" content="小泊随記,漂小泊,卞荣成,小泊随记,漂小泊轻松学前端,piaoxiaobo,xiaobosuiji,随記,随记,itsolotime," />
        <meta name="description" content="因为心无所恃,所以才随遇而安​​" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <link rel="apple-touch-icon" sizes="180x180" href="static/images/apple-touch-icon.png" />
        <link rel="icon" type="image/png" sizes="32x32" href="static/images/favicon-16x16.png" />
        <link rel="icon" type="image/png" sizes="16x16" href="static/images/favicon-32x32.png" />
    <style type="text/css">
      table{
        border: 1px solid black;
        border-color:#F06;
        padding:10px;
        border-collapse:collapse;
      }
      table tr th{
        border: 1px solid black;
        border-color:#F06;
        padding:10px;
        border-collapse:collapse;
      }
      table tr td{
        border: 1px solid black;
        border-color:#F06;
        padding:10px;
        border-collapse:collapse;
      }
    </style>
</head>

<body>
  <table>
    <caption>消息列表</caption>
    <tr><th>编号</th><th>姓名</th><th>邮箱</th><th>留言</th></tr>
    <?php
    header("Content-Type:text/html;charset=utf-8");//设置页面字符编码
    

    // 第一步,连接数据库
    $conn = mysqli_connect('172.17.0.5','kk','123');

    // 第二步,选择指定的数据库,设置字符集
    mysqli_select_db($conn,"message");
    mysqli_query($conn,'SET NAMES UTF8');

    // 显示数据
    $query = 'SELECT * FROM kk';
    $result = mysqli_query($conn,$query);

    // 把结果集转换成数组赋值给$row,如果有数据为真
    while(!!$row = mysqli_fetch_array($result)){
        echo"<tr><td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["mailbox"]."</td><td>".$row["dream"]."</td><tr>";
    }
    mysqli_close($conn);
  ?>
  </table>
</body>

制作镜像

docker build -t "httpd:v1" .

制作容器

docker container run -d --name="httpd01" --restart=always -v /opt/vol/html:/var/www/html httpd:v1
docker container run -d --name="httpd02" --restart=always -v /opt/vol/html:/var/www/html httpd:v1

 

容器2:mysql(存放页面查询的数据,数据持久化):容器数量:1

mdkir ~/mariadb

cd ~/,mariadb

vim dockerfile

# CentOS7_MariaDB
FROM centos:7
ADD mariadb.repo /etc/yum.repos.d/
RUN yum -y install MariaDB-server
ADD init.sh /
VOLUME /var/lib/mysql
CMD ["/bin/bash","/init.sh"]

vim init.sh

#!/bin/bash
cp /usr/share/mysql/mysql.server /etc/init.d/mysql.mysql
mysql_install_db --user=mysql
sleep 3
chown -R mysql.mysql /var/lib/mysql
/etc/init.d/mysql.server start
sleep 3
mysql -e "grant all on *.* to kk@'%' identified by '123';grant all on *.* to kk@'localhost' identified by '123';"
mysql -ukk -p123 -e "create database message charset utf8mb4;"
mysql -ukk -p123 -e "use message;create table kk( id int auto_increment not null,name varchar(10) not null,mailbox varchar(20) no null,dream varchar(20) no null,primary key(id) );inset into kk values('1','hewenfu','30772818@qq.com','haha');"

tail -f /var/lib/mysql/`hostname`.err

制作镜像

docker build -t "mariadb:v1" .

制作容器

docker container run -d --name="mariadb01" -v /opt/vol/mysql:/var/lib/mysql --restart=always mariadb:v1

 

容器3:nginx(对容器1实现负载均衡):容器数量:1

mkdir ~/nginx

cd ~/nginx

vin dockerfile

# CentOS7_Nginx
FROM centos:7
ADD nginx.repo /etc/yum.repos.d/
RUN yum -y install nginx
ADD nginx.conf /etc/nginx/conf.d
ADD init.sh /
EXPOSE 80
ENTRYPOINT ["/bin/bash","/init.sh"]

vim nginx.conf

upstream httpd {
         server httpd01:80;
         server httpd02:80;
}
server {
     listen 80;
     server_name 192.168.1.3;
     location / {
              proxy_pass http://httpd;
     }
}

vim nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

vim init.sh

#!/bin/bash
nginx -g "daemon off;"

创建镜像

docker build -t "nginx:v1" .

创建容器

docker container run -d --name="nginx01" -p 809:80 --link=httpd01 --link=httpd02 --restart=always nginx:v1

 

实现访问nginx容器地址可负载到httpd容器,httpd容器从mysql容器中取数据。

容器4:zookeeper镜像制作

Dockerfile编写

FROM centos:7
WORKDIR /download
WORKDIR /data/zookeeper/zkdata
ADD ./apache-zookeeper-3.5.9-bin.tar.gz /download
ADD ./jdk-8u221-linux-x64.tar.gz /download
RUN mv /download/apache-zookeeper-3.5.9-bin /download/zookeeper \
    && echo "1" > /data/zookeeper/zkdata/myid
ADD ./zoo.cfg /download/zookeeper/conf/
ENV JAVA_HOME /download/jdk1.8.0_221
ENV RE_HOME /download/jdk1.8.0_221/jre
ENV CLASS_PATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin:$JRE_HOME/bin
ENV zookeeper_home /download/zookeeper
EXPOSE 2181 2888 3888
ENTRYPOINT ["/download/zookeeper/bin/zkServer.sh"]
CMD ["start-foreground"]

zoo.cfg配置文件

tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/data/zookeeper/zkdata
# the port at which the clients will connect
clientPort=2181

镜像制作

docker images build -t "zookeeper:3.5.9" .

启动容器

docker container run -d --name zookeeper -p 2182:2182 zookeeper:3.5.9

 

容器5:kafka镜像制作

Dockerfile编写

FROM centos-jre-gdal:0.1 
WORKDIR /download
ADD ./kafka_2.12-2.5.0.tgz /download
RUN mv /download/kafka_2.12-2.5.0 /download/kafka
ENV KAFKA_ZOOKEEPER_CONNECT zoo1:2181
ENV KAFKA_ADVERTISED_HOST_NAME localhost
ADD   ./run.sh  /download
EXPOSE 9092
ENTRYPOINT [ "sh", "-c", "/download/run.sh" ]

run.sh编写

#!/bin/bash
sed -i 's%zookeeper.connect=.*$%zookeeper.connect=zoo1:2181%g'  /download/kafka/config/server.properties
/download/kafka/bin/kafka-server-start.sh  /download/kafka/config/server.properties

镜像制作

docker images build -t "kafka:2.5.0" .

启动容器

docker container run -d --name kafka -p 9092:9092 --link zookeeper kafka:2.5.0

 

 

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2020年5月15日23:42:48
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Harbor镜像仓库 Docker

Harbor镜像仓库

Harbor镜像仓库 一、Harbor特性介绍 基于角色访问控制 每个人角色不同,需求也不同,因此就需要访问权限控制,根据角色分配相应的权限。例如,开发人员需要对项目构建这就需要用到读写权限(push...
Centos7解决systemctl无法使用 Docker

Centos7解决systemctl无法使用

systemd整合: 因为systemd要求CAPSYSADMIN授权,从而得到了读取到宿主机cgroup的能力,Centos7中已经用fakesystemd代替了systemd来解决依赖问题。如果仍...
Dockaer网络 Docker

Dockaer网络

Dockaer网络 docker本地网络类型 查看本地支持网络类型 docker network ls # docker network ls NETWORK ID NAME DRIVER SCOPE...
Docker-compose Docker

Docker-compose

Docker-compose 任务编排介绍 场景: 我们在工作中未来完成业务目标,首先把业务拆分成多个子任务,然后对这些子任务进行顺序组合,当子任务按照方案执行完毕后,就完成了业务目标 任务编排,就是...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: