Docker系列文 —— 使用Dockerfile简单创建一个docker自定义镜像

使用官方教程自己使用Dockerfile简单创建一个docker自定义镜像,实践并成功上手使用!

创建步骤

  1. 创建一个空目录
[root@kafka02 ~]# mkdir /mydocker 
[root@kafka02 lianxi]# cd /mydocker/
  1. 新建Dockerfile
[root@kafka02 mydocker]# vim Dockerfile
# Use an official Python runtime as a parent image  下载一个python的镜像模板,若事先机器没有装python镜像也没关系,创建环境的时候会自动下载
FROM python

# Set the working directory to /app   WORKDIR 指定工作目录 --> 进入docker容器的时候,所在的目录
WORKDIR /app

# Copy the current directory contents into the container at /app   复制当前目录下的所有的内容到容器里的/app目录下
ADD . /app

# 使用数据卷  --》容器里的路径
# 作用:就是将容器里的某个路径挂载到宿主机的卷上
# 会将容器里的/var/lib/mysql 在docker宿主机创建一个volume.卷的名字是随机产生,卷的路径是/var/lib/docker/volume
VOLUME ["/data_flask"]

# Install any needed packages specified in requirements.txt 安装requirements里的库,只是在制作镜像的时候会运行
# 制作镜像的时候,在临时启动的中间测试的容器里运行,会产生中间的层
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World
ENV AUTHOR xxy

# Run app.py when the container launches  
# 镜像制作好了,真正去启动容器的时候,运行的进程
CMD ["python", "app.py"] 
  1. 新建requirements.txt文件
[root@kafka02 mydocker]# cat requirements.txt 
Flask
Redis
  1. 新建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("字符串") --> 字符串用来Flask对象标识,一般使用__name__
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>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)


if __name__ == "__main__":
	# 运行应用 (flask内置开发环境中运行的服务器)
    app.run(host='0.0.0.0', port=80)
  1. 生成镜像,需要一点时间,因为下载安装很多东西
[root@kafka02 mydocker]# docker build -t sc_firendly_hello .

创建成功

  1. 查看生成的镜像
[root@kafka02 mydocker]# docker images
REPOSITORY          TAG        IMAGE ID       CREATED         SIZE
sc_firendly_hello   latest     b9db5e04025a   6 minutes ago   923MB

使用镜像,启动容器

[root@kafka02 mydocker]# docker run -d -p 5080:80 --name sc-hello-1 sc_firendly_hello 
bc5584e3e91e5b7994e09f7bbd9a3b48bcc130f84bad904957c218ad35539ce0
[root@kafka02 mydocker]# docker ps 
CONTAINER ID   IMAGE               COMMAND                  CREATED         STATUS                                           NAMES
bc5584e3e91e   sc_firendly_hello   "python app.py"          3 minutes ago   Up 3 minutes         ->80/tcp, :::5080->80/tcp   sc-hello-1

此时我们可以去网页访问一下我们容器的web服务
服务器ip:容器映射的端口号
在这里插入图片描述
可以看到访问成功,但是visits这里显示了之前定义的异常捕获的信息,和Redis的连接失败

那我们就去启动redis容器

启动redis容器

  • 先启动一个redis容器
docker run -d -p 6379:6379 --name xie-redis-1 redis
  • 再次启动一个自己制作的镜像的容器,链接到redis容器
[root@kafka02 mydocker]# docker run -d -p 5082:80 --name sc-hello-3  --link xie-redis-1:redis sc_
2c90504e931ddf0ed4acd63751980d79916c39c51753b548a575e858847ecde5
  • 访问容器的web服务 宿主机ip:5082
    在这里插入图片描述
    访问成功!!!刷新网站页面visits的次数也会随之增加,这是app.py写的内容

进入容器内部查看变量

接下来我们可以进入容器内部环境查看一下我们设置的环境变量
这些都是定义在DockerFile里的

[root@kafka02 mydocker]# docker exec -it  sc-hello-3 /bin/bash

root@2c90504e931d:/app# echo $NAME
World

root@2c90504e931d:/app# echo $AUTHOR
xxy

看总的环境变量

root@2c90504e931d:/app# env
REDIS_PORT_6379_TCP=tcp://172.17.0.3:6379
HOSTNAME=2c90504e931d
PYTHON_VERSION=3.9.6
REDIS_ENV_REDIS_VERSION=6.2.5
NAME=World
PWD=/app
HOME=/root
LANG=C.UTF-8
GPG_KEY=E3FF2839C048B25C084DEBE9B26995E310250568
REDIS_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz
REDIS_PORT_6379_TCP_PROTO=tcp
TERM=xterm
SHLVL=1
REDIS_PORT_6379_TCP_PORT=6379
REDIS_NAME=/sc-hello-3/redis
REDIS_PORT_6379_TCP_ADDR=172.17.0.3
PYTHON_PIP_VERSION=21.2.4
REDIS_ENV_GOSU_VERSION=1.12
REDIS_PORT=tcp://172.17.0.3:6379
REDIS_ENV_REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae
PYTHON_GET_PIP_SHA256=fa6f3fb93cce234cd4e8dd2beb54a51ab9c247653b52855a48dd44e6b21ff28b
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/c20b0cfd643cd4a19246ccf204e2997af70f6b21/p
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
AUTHOR=xxy
_=/usr/bin/env

还可以在容器内部查看我们之前写的三个脚本

root@2c90504e931d:/app# ls
Dockerfile  app.py  requirements.txt

安装出现的问题

生成镜像文件时报错
在这里插入图片描述
当时直接报错了,我往脚本里回看的时候发现是app.py脚本有单词打错了字母,导致连接失败,所以有这个错误的首先先去回顾看一下自己三个脚本有没有出现什么拼写错误等等问题。
接下来,我将拼写的错误修改过来之后,重新运行生成镜像文件命令还是报错了,我想应该是重复导入生成的问题,所以重新启动了docker服务,重启之后还真就启动起来了
在这里插入图片描述
但当我查看images时,出现了一堆none文件,还是同样大小的
在这里插入图片描述
这些应该就是那些没有安装成功 安装到一半失败的镜像文件了,大家可以将它们 rmi 掉

教程就到这里结束啦!感谢观看!点个赞再走吧!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值