使用Dockerfile实现容器内部服务随容器自启动的方法

目录
  • 1 Docker下载python
  • 2 搭建flask服务
    • 2.1 创建flask脚本
    • 2.2 创建gunicorn启动脚本
  • 3 制作镜像
    • 3.1 将mypython容器制作成镜像
    • 3.2 Dockerfile制作
    • 3.3 使用自定义的镜像创建容器
  • 4 在联网的情况下,直接使用Dockerfile制作镜像
    • 4.1 设置基本环境
    • 4.2 创建脚本
    • 4.3 创建Dockerfile文件
    • 4.4 使用镜像

创建搭载flask的python容器,实现容器内服务随容器自启动,需要使用shell脚本Dockerfile中的CMD

1 Docker下载python

# 下载python
sudo docker pull python:3.8.2
# 创建python容器
sudo docker run -itd --name mypython python:3.8.2
# 进入mypython
sudo docker exec -it mypython /bin/bash
# 安装flask和gunicorn
pip install flask
pip install gunicorn

2 搭建flask服务

2.1 创建flask脚本

在宿主机上创建flask脚本文件

touch app.py

app.py的内容如下

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World"

将main.py复制到mypython容器中的/home/myflask目录下

sudo docker cp app.py mypython:/home/myflask

2.2 创建gunicorn启动脚本

在宿主机下创建启动文件

touch start_flask.sh

在start_flask.sh文件中添加

#!/bin/bash
#
# Program:
#       mypython flask
# History
#       2022-06-08 mason
#
# 进入目录
cd /home/myflask

# 执行程序
gunicorn -w 4 -b 0.0.0.0:5000 app:app

将start_flask.sh复制到mypython容器中的/home/myflask目录下

sudo docker cp start_flask.sh mypython:/home/myflask

3 制作镜像

3.1 将mypython容器制作成镜像

# docker commit -m "说明" -a "作者" 容器名 镜像名:版本号
sudo docker commit -m "my python " -a "mason" mypython mypython:v1.0

# 查看镜像列表
sudo docker images

# 返回结果
mypython                             v1.0                           875738200451   9 seconds ago   945MB

3.2 Dockerfile制作

(1)创建mypython-v1.0-dockerfile目录

mkdir mypython-v1.0-dockerfile

(2)在mypython-v1.0-dockerfile创建Dockerfile

# 进入目录
cd mypython-v1.0-dockerfile
# 创建文件
touch Dockerfile

(3)Dockerfile的内容如下

注意:run是在 docker build构建镜像时, 会执行的命令;cmd是在 docker run启动容器时, 会执行的命令

# 设置镜像
FROM mypython:v1.0
# 设置作者
MAINTAINER mason
# 开放5000端口
EXPOSE 5000
# 执行命令
CMD ["sh", "/home/myflask/start_flask.sh"]

(4)执行Dockerfile

sudo docker build -t mypython:v2.0 mypython-v1.0-dockerfile/

3.3 使用自定义的镜像创建容器

# 创建容器
sudo docker run -itd --name mytest -p 5000:5000 mypython:v2.0

# 查看mytest的日志信息
sudo docker logs -f mytest

4 在联网的情况下,直接使用Dockerfile制作镜像

4.1 设置基本环境

# 创建目录
sudo mkdir mypython-1.0

# 进入mypython-1.0
cd mypython-1.0

# 创建myflask目录
sudo mkdir myflask

4.2 创建脚本

进入myflask目录,创建app.py文件,文件内容如下。

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World"

进入myflask目录,创建start_flask.sh文件,文件内容如下。

#!/bin/bash
#
# Program:
#       mypython flask
# History
#       2022-06-08 mason
#
# 进入目录
cd /home/myflask

# 执行程序
gunicorn -w 4 -b 0.0.0.0:5000 app:app

4.3 创建Dockerfile文件

进入mypython-1.0目录,注意不是myflask目录,创建Dockerfile文件,文件内容如下:

# 设置镜像
FROM python:3.8.2
# 作者
MAINTAINER Maon
# 在容器中安装相关的环境
RUN pip install flask
RUN pip install gunicorn
# 设置工作目录
WORKDIR /home
# 复制文件,注意myflask目录要与Dockerfile在同一个目录
# COPY会将myflask目录下的文件,全部拷贝到/home/myflask目录下
COPY myflask /home/myflask
# 开放端口5000
EXPOSE 5000
# 执行命令
CMD ["sh", "/home/myflask/start_flask.sh"]

执行文件

# 进入mypython-1.0目录
cd mypython-1.0

# 执行文件,注意后面的"."
sudo docker build -t mypython:1.0 .

# 执行过程如下
Sending build context to Docker daemon  4.608kB
Step 1/8 : FROM python:3.8.2
 ---> 4f7cd4269fa9
Step 2/8 : MAINTAINER Maon
 ---> Running in 01bd71948685
Removing intermediate container 01bd71948685
 ---> ddae7ce9a68d
Step 3/8 : RUN pip install flask
 ---> Running in 58f3fcfe573c
Collecting flask
  Downloading Flask-2.1.2-py3-none-any.whl (95 kB)
Collecting Jinja2>=3.0
  Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
Collecting importlib-metadata>=3.6.0; python_version < "3.10"
  Downloading importlib_metadata-4.11.4-py3-none-any.whl (18 kB)
Collecting click>=8.0
  Downloading click-8.1.3-py3-none-any.whl (96 kB)
Collecting itsdangerous>=2.0
  Downloading itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting Werkzeug>=2.0
  Downloading Werkzeug-2.1.2-py3-none-any.whl (224 kB)
Collecting MarkupSafe>=2.0
  Downloading MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25 kB)
Collecting zipp>=0.5
  Downloading zipp-3.8.0-py3-none-any.whl (5.4 kB)
Installing collected packages: MarkupSafe, Jinja2, zipp, importlib-metadata, click, itsdangerous, Werkzeug, flask
Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.1.2 click-8.1.3 flask-2.1.2 importlib-metadata-4.11.4 itsdangerous-2.1.2 zipp-3.8.0
WARNING: You are using pip version 20.1; however, version 22.1.2 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Removing intermediate container 58f3fcfe573c
 ---> a22c9de6e3d5
Step 4/8 : RUN pip install gunicorn
 ---> Running in 5b635d18e39b
Collecting gunicorn
  Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB)
Requirement already satisfied: setuptools>=3.0 in /usr/local/lib/python3.8/site-packages (from gunicorn) (46.1.3)
Installing collected packages: gunicorn
Successfully installed gunicorn-20.1.0
WARNING: You are using pip version 20.1; however, version 22.1.2 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Removing intermediate container 5b635d18e39b
 ---> 8afabe6c3a62
Step 5/8 : WORKDIR /home
 ---> Running in 45040c10af7c
Removing intermediate container 45040c10af7c
 ---> 15ef04626c92
Step 6/8 : COPY myflask /home
 ---> b6736b08b1e3
Step 7/8 : EXPOSE 5000
 ---> Running in 0835fe7f5809
Removing intermediate container 0835fe7f5809
 ---> ebd8bd33c8dc
Step 8/8 : CMD ["sh", "/home/myflask/start_flask.sh"]
 ---> Running in e1f867903175
Removing intermediate container e1f867903175
 ---> 8c1b7d276dbb
Successfully built 8c1b7d276dbb
Successfully tagged mypython:1.0

4.4 使用镜像

# 创建容器
sudo docker run -itd --name mytest1.0 -p 5000:5000 mypython:1.0
# 查看日志
sudo docker logs -f mytest1.0

容器自动重启后,查看结果

到此这篇关于使用Dockerfile实现容器内部服务随容器自启动的文章就介绍到这了,更多相关Dockerfile服务自启动内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Dockerfile部署nodejs服务的方法步骤

    初始化Dockerfile 假设我们的项目名为express,在express项目中创建编辑Dockerfile文件: $ vim Dockerfile FROM node:latest RUN mkdir -p /home/www/express WORKDIR /home/www/express COPY . /home/www/express RUN npm install EXPOSE 3000 ENTRYPOINT ["npm", "run"] CMD [

  • 详解使用Dockerfile创建带Apache服务的CentOS Docker镜像

    使用Dockerfile创建带Apache服务的CentOS Docker镜像 在宿主机上准备的文件清单: Dockerfile #启动ssh和apache服务的角本 run.sh 以上文件都放到/root/apache_centos目录下 mkdir -p /root/apache_centos cd /root/apache_centos 基础镜像:以镜像centos为基础的开放SSH服务的镜像 [root@localhost apache_centos]# docker images RE

  • Docker容器上用DockerFile部署多个tomcat服务的步骤

    1. [admin@JD ~]$ cd opt #进入根目录下的opt 里 2. [admin@JD opt]$ mkdir web #创建Web 文件夹 3. [admin@JD web]$ cd web/ #进入web文件夹 4. [admin@JD web]$ touch Dockerfile #创建一个Dockerfile文件夹 名字不能错必须是这个名字否者检测不到 5. 利用三方工具将 tomcat 和 jdk的 上传到Web文件夹 6. [admin@JD web]$ vim Doc

  • Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    本文实例为大家分享了Dockerfile创建支持ssh服务自启动的容器镜像,供大家参考,具体内容如下 1. 首先创建一个Dockerfile文件,文件内容如下 # 选择一个已有的os镜像作为基础 FROM centos:centos6 # 镜像的作者 MAINTAINER Fanbin Kong "kongxx@hotmail.com" # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no RUN yum install -y openssh

  • Docker-利用dockerfile来搭建tomcat服务的方法

    在前面的例子中,我们从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其中,然后让docker读取并分析.执行,那么重复构建.更新将变得很方便,所以Dockerfile就此诞生了. 常用参数: FROM命令.用法,FROM <image>:<tag>.FROM命令告诉docker我们构建的镜像是以哪个(发行版)镜像为基础的 RUN命令.用法RUN <co

  • 使用Dockerfile实现容器内部服务随容器自启动的方法

    目录 1 Docker下载python 2 搭建flask服务 2.1 创建flask脚本 2.2 创建gunicorn启动脚本 3 制作镜像 3.1 将mypython容器制作成镜像 3.2 Dockerfile制作 3.3 使用自定义的镜像创建容器 4 在联网的情况下,直接使用Dockerfile制作镜像 4.1 设置基本环境 4.2 创建脚本 4.3 创建Dockerfile文件 4.4 使用镜像 创建搭载flask的python容器,实现容器内服务随容器自启动,需要使用shell脚本和D

  • SpringCloud容器化服务发现及注册实现方法解析

    springclould项目容器化过程中, 可能是采用部分部分容器化,逐步迁移到容器环境, 这时候我们就会面临一个问题: 外部服务如何调用k8s内部服务. Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,consumer 通过 Eureka 发现其他节点/服务. 应用场景 Eureka , gateway , app01, app02 处于k8s集群外部 app03

  • Node.js服务Docker容器化应用实践小结

    本篇不会讲解 Docker 命令的使用.安装等,因为在之前一篇文章一文零基础教你学会 Docker 入门到实践中也已经讲解的很详细了,不清楚的可以点击链接回头在重新看下,本篇重点是介绍 Node.js 项目如何进行 Docker 容器化及一些实践优化,还有一些常见的问题,当然如果还有其它使用上的问题也欢迎大家在评论区进行留言补充. 作者简介:五月君,Nodejs Developer,热爱技术.喜欢分享的 90 后青年,公众号「Nodejs技术栈」,Github 开源项目 www.nodejs.r

  • Docker如何安全地进入到容器内部

    目录 前言 1. 容器运行 自动重启的容器 自定义名称的容器 开启端口的容器 与宿主机共享目录的容器 2. 进入容器 2.1 容器的三种状态 2.2 docker attach与docker exec 前言 镜像是构建容器的蓝图,Docker 以镜像为模板,构建出容器. 容器在镜像的基础上被构建,也在镜像的基础上运行,容器依赖于镜像. 本文将对 容器的运行 及相关内容进行详细讲解. 1. 容器运行 在 Docker 官方网站可以查询与 Docker 相关的资料以及帮助手册,但是内容都是英文的,可

  • 详解Docker创建支持ssh服务的容器和镜像

    1. 这里使用的centos作为容器,所以首先下载centos的images # sudo docker pull centos 2. 下载后运行一个centos的容器,这里使用centos6作为我测试的容器 # sudo docker run --name=centos-ssh -i -t centos:centos6 /bin/bash  3. 安装openssh-server服务软件包 # yum install openssh-server 4. 编辑sshd的配置文件/etc/ssh/

  • 如何在docker容器内部安装kibana分词器

    步骤: 1.在虚拟机目录下新建docker-compose.yml文件,然后进入yml文件编辑 vi docker-compose.yml 2.在yml文件中添加如下代码: version: "3.1" services: elasticsearch: image: daocloud.io/library/elasticsearch:6.5.4 restart: always container_name: elasticsearch ports: - 9200:9200 #将分词器映

  • 在宿主机上执行docker容器内部的shell或程序方式

    为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的"printer"可执行程序,该程序输出为打印"123". C:\Users\Administrator>docker exec -it centos-1 /bin/bash -c "cd usr && ./printer" 12

  • 详解docker 容器不自动退出结束运行的方法

    本文主要简单介绍 docker 容器与前置进程的关系,以及如何编写 Dockerfile/docker-compose.yml 优雅的让容器可以常驻运行. docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动结束的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了. 比如 docker hello-world # 一闪而过 输出一堆东西 docker run --name hello-world hello-w

随机推荐