微服务:3 docker 自定义镜像实战

1. docker镜像制作的方法

  • 基于Docker Commit制作
  • 基于dockerfile制作,该方式为主流的制作镜像方式

2. Commit方式构建自定义镜像

  • 对容器修改及保存
  • 启动并进入容器 docker run -it centos:7 /bin/bash

  • 再home下创建xd : mkdir xd

    安装ifconfig命令: yum -y install net-tools

  • 重启容器,看xd文件夹还在否:

    docker restart 2675c91a2007
    xd文件夹仍在

  • 删除容器,再启动一个容器看有无xd文件夹

    docker stop 2675c91a2007
    docker rm 2675c91a2007
    docker run -it centos:7 /bin/bash
    xd文件夹不存在

  • 构建镜像
  • 原容器创建xd文件夹
[root@slave1 ~]# docker exec -it 08f6849f45ff /bin/bash
[root@08f6849f45ff /]# cd /home/
[root@08f6849f45ff home]# ls
[root@08f6849f45ff home]# mkdir xd
[root@08f6849f45ff home]# ls
xd
  • docker commit 08f6849f45ff mycento:7

  • docker commit -a “XD” -m “mkdir /home/xd” 08f6849f45ff mycento:7
    -a : 标注作者
    -m : 注释
    查看详细说明 docker inspect 08f6849f45ff

  • 查看镜像: docker images

[root@slave1 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mycento      7         db204e9de691   2 minutes ago   204MB
<none>       <none>    04ab49404f3c   6 minutes ago   204MB
<none>       <none>    62a20aa04ec0   8 minutes ago   204MB
centos       7         8652b9f0cb4c   3 months ago    204MB
  • 删除原容器: docker rmi 08f6849f45ff
[root@slave1 ~]# docker stop 08f6849f45ff
08f6849f45ff
[root@slave1 ~]# docker rm 08f6849f45ff
08f6849f45ff
  • 启动镜像对应的容器
[root@slave1 ~]# docker run -itd mycento:7 /bin/bash
73de9091f862b113057f8c9bddc4686246a9adbbd12232cae4ad7078112ce4f1
[root@slave1 ~]# docker ps
CONTAINER ID   IMAGE       COMMAND       CREATED         STATUS         PORTS     NAMES
73de9091f862   mycento:7   "/bin/bash"   6 seconds ago   Up 4 seconds             happy_wing
  • 进入容器
[root@slave1 ~]# docker exec -it 73de9091f862 /bin/bash
[root@73de9091f862 /]# cd /home
[root@73de9091f862 home]# ls
xd

xd文件存在于镜像

3. Dockerfile构建镜像实战

  • 构建一个dockerfile的文本

    • 下面内容为dockerfile文本的内容
    FROM centos:7 
    MAINTAINER XD ss@qq.com 
    RUN echo "正在构建镜像!!!" 
    WORKDIR /opt/xd/
    COPY ee.txt /home/xd 
    
    [root@slave1 xd]# touch dockerfile
    [root@slave1 xd]# ls
    44.txt  456.txt  dockerfile  ee.txt
    [root@slave1 xd]# ls
    44.txt  456.txt  dockerfile  ee.txt
    [root@slave1 xd]# vi dockerfile
    [root@slave1 xd]# pwd
    /opt/xd
    
    • dockerfile和ee.txt都在/opt/xd目录
  • 构建镜像: docker build -t mycento:v2 .(.表示路径)

[root@slave1 xd]# docker build -t mycentos:v3 .
Sending build context to Docker daemon   5.12kB
Step 1/5 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/5 : MAINTAINER XD ss@qq.com
 ---> Running in 8531aa86fb10
Removing intermediate container 8531aa86fb10
 ---> 54489a9b0f44
Step 3/5 : RUN echo "正在构建镜像!!!"
 ---> Running in f864bec988d3
正在构建镜像!!!
Removing intermediate container f864bec988d3
 ---> 249a3773ad55
Step 4/5 : WORKDIR /opt/xd/
 ---> Running in 3bb75052b600
Removing intermediate container 3bb75052b600
 ---> 23204322d99c
Step 5/5 : COPY ee.txt /opt/xd
 ---> 73fd30777a3d
Successfully built 73fd30777a3d
Successfully tagged mycentos:v3
  • 查看镜像:

    [root@slave1 xd]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
    mycentos     v3        73fd30777a3d   About a minute ago   204MB
    mycento      7         db204e9de691   22 hours ago         204MB
    centos       7         8652b9f0cb4c   3 months ago         204MB
    
  • 验证

    [root@slave1 xd]# docker run -it mycentos:v3 /bin/bash
    [root@e81b4d2d0099 xd]# ll
    total 4
    -rw-r--r--. 1 root root 9 Feb  9 01:09 ee.txt
    
  • ee.txt 存在 /opt/xd目录下

4. 镜像分层结构

  • 查看分层
[root@slave1 xd]# docker history mycentos:v3
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
73fd30777a3d   2 hours ago    /bin/sh -c #(nop) COPY file:b0e33e0533c5cf9e…   9B
23204322d99c   2 hours ago    /bin/sh -c #(nop) WORKDIR /opt/xd/              0B
249a3773ad55   2 hours ago    /bin/sh -c echo "正在构建镜像!!!"                     0B
54489a9b0f44   2 hours ago    /bin/sh -c #(nop)  MAINTAINER XD ss@qq.com      0B
8652b9f0cb4c   3 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      3 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      3 months ago   /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB
  • 启动镜像的时候,一个新的可写层会加载到镜像的顶部。这一层通常称为“容器层”, 之下是“镜像层”。

    上述imageid均是镜像层id

  • 容器层可以读写,容器所有发生文件变更写都发生在这一层。镜像层read-only,只允许读取

  • 总结
  • 共享资源
  • 对容器的任何改动都是发生在容器层
  • 容器层是可写可读,镜像层只读

5. 常用的dockerfile指令

  • from 基于哪个镜像

  • MAINTAINER 作者

  • COPY 复制文件进入镜像(只能用相对路径,不能用绝对路径)

  • ADD 复制文件进入镜像(压缩包会解压)

  • WORKDIR 指定复制文件的工作目录,不存在会创建路径

  • ENV 设置环境变量

  • EXPOSE 暴露容器端口

  • RUN 构建镜像的时候执行其后的命令,作用于镜像层面

  • ENTRYPOINT 在容器启动的时候执行,作用于容器层,dockerfile里有多条时只执行最后一条

  • CMD

    • 在容器启动时执行,作用于容器层,dockerfile里有多条时只执行最后一条

    • 容器启动后执行默认的命令或参数,允许被修改

    • 命令格式:

      • shell命令格式:RUN yum install -y net-tools
      • exec命令格式:RUN [“yum”,“install”,"-y",“net-tools”

6. 构建JAVA网站镜像

  • 宿主机jdk配置

    export JAVA_HOME=/opt/jdk1.8.0_251
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    
  • 编写dockerfile

FROM centos:7
WORKDIR /opt/
ADD jdk-8u251-linux-x64.tar.gz /opt
ENV JAVA_HOME=/opt/jdk1.8.0_251
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ADD apache-tomcat-8.0.52.tar /opt
RUN mv /opt/apache-tomcat-8.0.52 /opt/tomcat8
EXPOSE 8080
ENTRYPOINT ["/opt/tomcat8/bin/catalina.sh","run"]

-- 创建镜像
[root@slave1 opt]# docker build -t mycentos:v4 .
Sending build context to Docker daemon  2.183GB
Step 1/9 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/9 : ADD jdk-8u251-linux-x64.tar.gz /opt
 ---> ea59e2b563f0
Step 3/9 : ENV JAVA_HOME=/opt/jdk1.8.0_251
 ---> Running in a4b4d2f20045
Removing intermediate container a4b4d2f20045
 ---> d4cd62a72bd6
Step 4/9 : ENV PATH=$JAVA_HOME/bin:$PATH
 ---> Running in 802aa9ba03b6
Removing intermediate container 802aa9ba03b6
 ---> d206ac9a3cdf
Step 5/9 : ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ---> Running in 91e0226a6e5a
Removing intermediate container 91e0226a6e5a
 ---> 8158340bc0f5
Step 6/9 : ADD apache-tomcat-8.0.52.tar /opt
 ---> 5c2f78855b3e
Step 7/9 : RUN mv /opt/apache-tomcat-8.0.52 /opt/tomcat8
 ---> Running in 3f58fb59e373
Removing intermediate container 3f58fb59e373
 ---> dbb92f38bb8f
Step 8/9 : EXPOSE 8080
 ---> Running in 94fbb09d64a0
Removing intermediate container 94fbb09d64a0
 ---> e84623d5659d
Step 9/9 : ENTRYPOINT ["/opt/tomcat8/bin/catalina.sh","run"]
 ---> Running in 746cb5bb32f5
Removing intermediate container 746cb5bb32f5
 ---> a499a7e02efd
Successfully built a499a7e02efd
Successfully tagged mycentos:v4
  • 宿主机创建目录,宿主机文件夹挂载到容器里

    [root@slave1 opt]# mkdir dockerweb
    [root@slave1 opt]# docker run -itd -p 80:8080 -v /dockerweb:/opt/tomcat8/webapps/ROOT mycentos:v4 /bin/bash
    erweb
    [root@slave1 dockerweb]# docker ps
    CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                  NAMES
    b5aa0edc1c11   mycentos:v4   "/opt/tomcat8/bin/ca…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->8080/tcp   priceless_nightingale
    e81b4d2d0099   mycentos:v3   "/bin/bash"              6 hours ago     Up 6 hours                            romantic_heyrovsky
    [root@slave1 dockerweb]#
    
  • 进入镜像,在镜像tomcat8/webapps/ROOT/下创建文件index.html

[root@slave1 dockerweb]# docker exec -it 34409c58771f /bin/bash
[root@34409c58771f /]# cd /opt/tomcat8/webapps/ROOT/
[root@34409c58771f ROOT]# ls
index.html
  • 宿主机网页验证
    http://192.168.250.130:8181/index.html

7. dockerfile构建redis镜像

  • 编写redis安装的shell脚本 /opt/redis_install.sh
#! /bin/bash
yum install -y gcc gcc-c++ make openssl openssl-devel
cd /opt/xd/redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir -p /usr/local/redis/conf/
cp /opt/xd/redis-4.0.9/redis.conf /usr/local/redis/conf/
sed -i '69s/127.0.0.1/0.0.0.0/' /usr/local/redis/conf/redis.conf 
sed -i '88s/protected-mode yes/protected-mode no/' /usr/local/redis/conf/
  • 编写dockerfile
FROM centos:7
ADD redis-4.0.9.tar.gz /opt/xd
COPY redis_install.sh /opt/xd
RUN sh /opt/xd/redis_install.sh
ENTRYPOINT /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
  • 测试redis

    • 构建 docker build -t mycentos:redis .
    • 启动容器 docker run -itd -p 6380:6379 mycentos:redis
    • 进入容器 docker exec -it xxxxx /bin/bash
    • 宿主机连接redis: /usr/local/redis/bin/redis-cli -p 6380

8. 快速部署mysql数据库并初始化

  • 下载mysql5.7镜像

    • docker pull mysql:5.7
  • 进入hub.docker.com官网

    • 启动mysql实例的代码
      $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:tag

      • some-mysql is the name you want to assign to your container
      • my-secret-pw is the password to be set for the MySQL root user
      • tag is the tag specifying the MySQL version you want
    • 进入容器命令

      [root@slave1 ~]# docker run --name some-mysql -p 3356:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
      c6d139793ef1bf6d3d4f22c31dfa4840084e7745bb833890bf4b076831bdf8a6
      [root@slave1 ~]# docker ps
      CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                               NAMES
      c6d139793ef1   mysql:5.7     "docker-entrypoint.s…"   18 seconds ago   Up 16 seconds   33060/tcp, 0.0.0.0:3356->3306/tcp   some-mysql
      34409c58771f   mycentos:v4   "/opt/tomcat8/bin/ca…"   44 hours ago     Up 44 hours     0.0.0.0:8181->8080/tcp              bold_solomon
      [root@slave1 ~]# docker exec -it c6d139793ef1 env LANG=C.UTF-8/bin/bash
      root@c6d139793ef1:/# mysql -uroot -proot
      root@c6d139793ef1:/# ls -lrt
      total 4
      drwxr-xr-x.   2 root root    6 Nov 22 12:37 home
      drwxr-xr-x.   2 root root    6 Nov 22 12:37 boot
      drwxr-xr-x.   1 root root   41 Jan 11 00:00 var
      drwxr-xr-x.   1 root root   19 Jan 11 00:00 usr
      drwxr-xr-x.   2 root root    6 Jan 11 00:00 srv
      drwxr-xr-x.   2 root root 4096 Jan 11 00:00 sbin
      drwxr-xr-x.   2 root root    6 Jan 11 00:00 opt
      drwxr-xr-x.   2 root root    6 Jan 11 00:00 mnt
      drwxr-xr-x.   2 root root    6 Jan 11 00:00 media
      drwxr-xr-x.   2 root root   34 Jan 11 00:00 lib64
      drwxr-xr-x.   1 root root   45 Jan 12 10:10 lib
      drwxr-xr-x.   2 root root    6 Jan 12 10:11 docker-entrypoint-initdb.d
      drwxr-xr-x.   1 root root   19 Jan 18 23:26 bin
      drwxr-xr-x.   1 root root   20 Jan 18 23:26 run
      lrwxrwxrwx.   1 root root   34 Jan 18 23:26 entrypoint.sh -> usr/local/bin/docker-entrypoint.sh
      dr-xr-xr-x.  13 root root    0 Feb 24 01:38 sys
      drwxr-xr-x.   1 root root   66 Feb 26 06:10 etc
      dr-xr-xr-x. 130 root root    0 Feb 26 06:10 proc
      drwxr-xr-x.   5 root root  340 Feb 26 06:10 dev
      drwxrwxrwt.   1 root root    6 Feb 26 06:10 tmp
      drwx------.   1 root root   28 Feb 26 06:15 root
      
  • docker-entrypoint-initdb.d 用来初始化数据库

  • 新建dockerfile初始化实践

  • dockerfile

    FROM mysql:5.7 
    WORKDIR /docker-entrypoint-initdb.d 
    ENV LANG=C.UTF-8 
    ADD init.sql .
    
  • init.sql 自行随便编写

    a. 构建镜像

[root@slave1 xd]# docker build -t mysql:5.7 .
Sending build context to Docker daemon  6.656kB
Step 1/4 : FROM mysql:5.7
 ---> a70d36bc331a
Step 2/4 : WORKDIR /docker-entrypoint-initdb.d
 ---> Running in eb21b512e98e
Removing intermediate container eb21b512e98e
 ---> faa10f1e4e62
Step 3/4 : ENV LANG=C.UTF-8
 ---> Running in 2b5563d18aef
Removing intermediate container 2b5563d18aef
 ---> 53fdd47fa9ba
Step 4/4 : ADD init.sql .
 ---> 24c58894bb32
Successfully built 24c58894bb32
Successfully tagged mysql:5.7
[root@slave1 xd]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       24c58894bb32   6 seconds ago   449MB

​ b.运行并进入容器

[root@slave1 xd]# docker run --name some-mysql -p 3356:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
fba20c2a1349867f16e51a913e3881ab172f05454ed8d1de796eac44822df48e
[root@slave1 xd]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                               NAMES
fba20c2a1349   mysql:5.7     "docker-entrypoint.s…"   6 seconds ago   Up 4 seconds   33060/tcp, 0.0.0.0:3356->3306/tcp   some-mysql
34409c58771f   mycentos:v4   "/opt/tomcat8/bin/ca…"   45 hours ago    Up 45 hours    0.0.0.0:8181->8080/tcp              bold_solomon
[root@slave1 xd]# docker exec -it fba20c2a1349 /bin/bash
root@fba20c2a1349:/docker-entrypoint-initdb.d# mysql -uroot -proot

​ c.验证容器是否将数据库初始化到库

mysql> use db_student;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from user;
+-------+--------+------+--------+-----+
| id    | name   | age  | class  | sex |
+-------+--------+------+--------+-----+
| 00001 | 小明   |   15 | 初三   | 男  |
| 00002 | 小红   |   13 | 初二   | 女  |
| 00003 | 小东   |   14 | 初一   | 男  |
+-------+--------+------+--------+-----+
3 rows in set (0.00 sec)

9. 制作nginx镜像

  • nginx_install.sh 脚本编写

    [root@slave1 xd]# cat nginx_install.sh
    #!/bin/bash
    yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
    cd /usr/local/nginx-1.16.1
    ./configure --prefix=/usr/local/nginx && make && make install
    
  • dockerfile编写

[root@slave1 xd]# cat dockerfile
FROM centos:7
ADD nginx-1.16.1.tar.gz /usr/local
COPY nginx_install.sh /usr/local
RUN sh /usr/local/nginx_install.sh
EXPOSE 80
  • 制作镜像

docker build -t mycentos:nginx

  • 注意事项

    • 在容器里nginx是以daemon方式启动,退出时,nginx 程序也会随之停止

    • 使用前台方式永久运行:/usr/local/nginx/sbin/nginx -g “daemon off;”

  • 检查验证

docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”

10. 分布式文件存储mino容器化部署

  • Docker容器化部署 https://docs.min.io/

    • 下载镜像

      docker pull minio/minio

    • 创建和启动容器

    docker run -p 11000:9000 \
    --name minio_xd \
    -v /opt/xd/mino:/data \
    -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
    -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \ minio/minio server /data
    
    • 运行成功

      容器存在:
      在这里插入图片描述

    运行成功:

在这里插入图片描述

  • 登录,localhost:11000

    用户名:AKIAIOSFODNN7EXAMPLE
    密码:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

11.快速部署nacos

1.docker构建
  • docker拉取镜像
docker pull nacos/nacos-server
  • 查看镜像
docker images
  • 启动Nacos
docker run --env MODE=standalone --name xdclass-nacos -d -p 8848:8848  nacos/nacos-server

//查看日志
docker logs -f 
  • 访问Nacos(记得开放阿里云的网络安全组)
http://公网ip:8848/nacos

# 登录密码默认nacos/nacos
2.Nacos注册中心配置mysql持久化

nacos数据库脚本

  • 导入数据库脚本(本章本集资料里面)
  • 新增一个用户 nacos/nacos
INSERT INTO `users` (`username`, `password`, `enabled`)
VALUES
  ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);
  • mysql最好使用5.7版本(业界用的比较多,稳定)

  • 启动命令

docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.250.130 \
-e MYSQL_SERVICE_PORT=3356 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=cloud_nacos \
-p 8848:8848 \
--restart=always \
--name nacos \
nacos/nacos-server 
  • 访问(大家改成自己的ip)
    • http://192.168.250.130:8848/nacos

12. 安装RabbitMq

#拉取镜像
docker pull rabbitmq:3.8.12-management-alpine

## 进入容器
docker run -d --hostname rabbit_host1 --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:3.8.12-management-alpine

#介绍
-d 以守护进程方式在后台运行
-p 15672:15672 management 界面管理访问端口
-p 5672:5672 amqp 访问端口
--name:指定容器名
--hostname:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的别名,并且将显示在容器的bash中

  • 注意

    • Linux服务器检查防火墙是否关闭
    • 云服务器检查网络安全组是否开放端口
    CentOS 7 以上默认使用的是firewall作为防火墙
    查看防火墙状态
    firewall-cmd --state
    
    停止firewall
    systemctl stop firewalld.service
    
    禁止firewall开机启动
    systemctl disable firewalld.service
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rong742954

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值