docke--制作镜像

本文详细介绍了如何制作Docker镜像,包括使用busybox和centos基础镜像创建自定义镜像,以及结合nginx、flask和redis的应用。通过Dockerfile编写,解释了各项指令如FROM、COPY、RUN、EXPOSE等,并讨论了CMD与ENTRYPOINT的区别。此外,文章还涵盖了镜像原理和容器启动过程,以及镜像的导出和导入操作。
摘要由CSDN通过智能技术生成

镜像库:

http://hub.docker.com

1.为什么要自己制作镜像?

更加有安全性;可以根据自己的需求得到更加合适自己的镜像

2.镜像有什么?

操作系统

核心代码

工具

运行时的环境

dockerfile

dockerfile是制作镜像的配置文件

3.制作镜像

1.使用busybox基础镜像+自己编写的一个脚本制作一个简单镜像

创建文件夹
mkdir /myproject
cd /myproject/
#创建一个文件随意输入一些内容
vim hello
创建一个文件,输入下面内容
vim Dockerfile

FROM busybox
COPY ./hello /
RUN cat /hello

生成一个镜像文件
[root@localhost myproject]# docker build -t helloapp:v1 .

进入容器
[root@localhost myproject]# docker run --name sc-hallo -it helloapp:v1

FRO busybox 从docker hub下载一个叫busybox的镜像,作为我们自己制作的镜像的基础镜像 base imagecOPy ./将我们宿主机里的当前目录下所有的文件和目录都拷贝到容器里的/目录下

RUN cat /hello是在制作镜像的时候执行的命合

ENTRYPOINT["/while. sh"]容器启动的时候会执行的命合,让容器启动的时候行/while.sh脚本

helloapp:v1 镜像名字:标签名

2.使用centos基础镜+nginx+导入定制配置文件+用数据卷挂载制作镜像

用卷挂载文件怎么做

先要宿主机打开ipv4转发
在/etc/sysctl.conf增加一条:
net.ipv4.ip_forward = 1

可以通过跑脚本安装
vim install_nginx.sh

复制配置文件到本地(注意:这个配置文件是以前创建的nginx容器里面取出来的)然后可以根据需要修改配置文件
docker cp scnginx1-2:/usr/local/nginx1/conf/nginx.conf .


#可以通过跑脚本安装
#!/bin/bash
#解决软件的依赖关系,需要安装的软件包
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make
#download nginx
#mkdir -p /nginx
#cd /nginx
#解压下载的nginx的源码包
tar xf nginx-1.21.1.tar.gz
cd nginx-1.21.1
#生成编译前配置工作-->Makefile
./configure --prefix=/usr/local/nginx1 --with-threads --with-http_ssl_module --with-http_realip_module --with-http_v2_module --with-http_stub_status_module --with-stream
#编译
make
#编译安装--》将编译好的二进制程序安装指定录/usr/local/nginx
make install


2.下载nginx的源码文件
root@sc-docker-server nginx]# curl -O http://nginx.org/download/nginx-1.21.1.tar.gz

3.编写Dockerfile
[root@sc-docker-server nginx] vim Dockerfile
FROM centos:7
ENV NGINX_VERSION 1.21.1
ENV AUTHOR sanchuang
LABEL maintainer="cali<695811769@qq.com>"
RUN mkdir /nginx
WORKDIR /nginx
COPY . /nginx

RUN set -ex; \
    bash install_nginx.sh; \
    yum install vim iputils net-tools iproute -y
EXPOSE 80
ENV PATH=/usr/local/nginx1/sbin:$PATH
#将配置好的配置文件
COPY /nginx/nginx.conf /usr/local/nginx1/conf
STOPSIGNAL SIGQUIT
CMD ["nginx","-g","daemon off;"]


制作镜像
 docker build -t scnginx1:1.0 .

用镜像创造容器
docker run --name scnginx1-1 -d -p 4477:80 scnginx1:1.0

复制配置文件到本地
docker cp scnginx1-1:/usr/local/nginx1/conf/nginx.conf .

用卷的方式创建容器
docker volume create meiko-1
docker run -dp 3392:80 --name scnginx-2 --mount source=meiko-1,target=/usr/local/nginx1/html scnginx1:1.0

3.使用flask web框架 +redis数据库 镜像制作

一个容器跑flask,一个容器跑redis

add和copy一样,复制文件到镜像文件里面

requirements.txt 放依赖文件的包

Dockerfile命令解释

FROM 以什么为基础镜像

WORKDIR 规定打开容器进入的第一个目录

ADD 将外面文件复制到容器里面来

RUN 制作镜像时,执行命令

EXPOSE 暴露的端口

ENV 变量定义

CMD 开启容器的第一个命令

mkdir flask-app-redis
cd flask-app-redis/

编辑dockerfile文件
vim Dockerfile
FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install --trusted-host pypi.python.org -r requirements.txt
EXPOSE 80
ENV NAME world
ENV AUTHOR cali
CMD ["python", "app.py"]

编辑requirements.txt文件
Flask
Redis

编辑app.py文件
from flask import Flask
from redis import Redis,RedisError
import os
import socket
#Connect to Redis
redis = Redis(host="redis",db=0,socket_connect_timeout=2,socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
    try :
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"
    html = "<h3>Hello {name}!</h3>"\
           "<bHostname : </b> {hostname}<br/>"\
           "<b>visits:</b> {visits}"
    return html.format(name=os.getenv("MNANE", "world"),hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)


创建镜像
docker build -t flaskredis:1.0 .
创建容器
docker run --name flaskredis-1 -d -p 7766:80 flaskredis:1.0

访问可以看到:

看到visits出现问题,这是为什么呢?

是因为redis数据库没有启动,flask web服务不能连接到redis数据库,我们连接的时候用名字连接的,所以要绑定两台容器,可以用link的方法,也可以直接修改文件设置

方法1

进入容器
[root@localhost flask-app-redis]# docker exec -it flaskredis-1  /bin/bash
root@ffb725246415:/app# cat /etc/hosts  ##这里可以发现没有绑定redisIP地址
127.0.0.1localhost

........
172.17.0.6ffb725246415
绑定IP地址,用docker inspect寻找出redis容器的IP地址

root@ffb725246415:/app# cat >>/etc/hosts <<EOF
> 172.17.0.7 redis redis-1
> EOF
#可以看到IP地址已经被写入
root@ffb725246415:/app# cat /etc/hosts
127.0.0.1localhost
......

可以看到已经连接连接成功

方法2

 docker run --name flaskredis-2 -d -p 7767:80 --link redis-1:redis flaskredis:1.0

CMD和ENTRYPOINT的区别:

CMD:

        容器启动的时候,运行的第一个语法

        ['执行的命令','参数',.....]

ENTPYPOINT:

        启动容器执行的命令

        当两个都存在的时候,CMD命令就是给ENTPYPOINT命令传参的

导出和导入镜像

静态:docker save --> docker load

动态:docker export --> docker import

导出
docker save flaskredis:1.0 -o flaskredis-1.0.tar
发送
scp flaskredis-1.0.tar 192.168.2.115:/root
导入
docker load <flaskredis-1.0.tar

4.镜像原理:

参考

第八篇:Docker镜像结构原理_Linux运维开发的技术博客_51CTO博客

镜像是层层累加建起来的,所有镜像层联合起来组成一个统一的文件系统。

一次run命令会增减一层;所以为了减小镜像的层数,尽量减少使用run命令

容器启动时时自下而上

容器运行访问时自上而下

导入镜像的时候可以看到层数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值