Docker实践:创建并运行一个自定义的Docker Image
1 目标:
创建一个自定义的Image,在该Image中,包含一个自己的Python程序,通过docker运行该Image 容器,并执行我们自己的Python程序,通过添加数据卷,在本机能够查看Python的执行结果.
2 创建Dockerfile
创建自定义Image,需要定义一个Dockerfile.
2.1 Dockerfile语法规则
8 使用Dockerfile创建镜像
dockerfile:文本格式的配置文件
可以使用dockerfile创建自定义的镜像
8.1 基本结构
四部分
基础镜像信息:FROM centos 基于的基础镜像
维护者信息:MAINTAINER docker_user docker_user@email.com
镜像操作指令
Run echo "test"
apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "test"
Run指令:
将对镜像执行跟随的命令
没运行一条Run命令,镜像添加新的一层并天骄
容器启动时执行指令
CMD /usr/sbin/nginx
8.2 指令
一般格式
INSTRUCTION arguments
FROM
MAINTAINER
RUN
指令
1 FROM
2 MAINTAINER
3 RUN
格式
RUN <command>:在shell终端中运行命令
RUN ["executable", "param1", "param2"]:exec执行
\:换行
4 CMD
格式
CMD ["executable", "param1", "param2"]:exec执行
CMD command param1 param2:bin/sh执行
CMD ["param1", "param2"]:ENTRYPOINT的默认参数
每个Dockfile只能有一条CMD命令
5 EXPOSE
格式
EXPOSE <port> [<port>...]
功能
告诉docker服务端容器暴露的端口号,供互联系统使用
EXPOSE 22 80 8443
在启动容器时, 需要通过-P或-p分配
6 ENV
格式
ENV <key> <value>
功能
指定环境变量
会被后续RUN指令使用
在容器运行时保持
ENV PG_MAJOR 9.3
7 ADD
格式
ADD <src> <dest>
功能
将复制指定的<src>到容器中的<dest>
<src>
可以是Dockerfile所在目录的一个相对路径(文件或目录)
可以是一个URL
可以是一个tar文件
自动解压为目录
8 COPY
格式
COPY <src> <dest>
功能
复制本地主机<src>为容器中的<dest>
目标路径不存在时, 推荐使用COPY
9 ENTRYPOINT
格式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2:shell中执行
功能
配置容器启动后执行的命令
不可被docker run 提供的参数覆盖
每个Dockerfile中只能有一个ENTRYPOINT
指定多个时,只有最后一个有效
10 VOLUME
格式
VOLUM ["/data"]
功能
创建一个可以从本地主机或其他容器挂载的挂在店
一般用来存放数据库和需要保持的数据等
11 USER
格式
USER daemon
功能
指定运行容器时的用户名或UID
12 WORKDIR
格式
WORKDIR /path/to/workdir
功能
为后续的RUN,CMD, ENTRYPOINT指令配置工作目录
可以使用多个WORKDIR指令
如果参数是相对路径,则会基于之前命令指定的路径
13 ONBUILD
格式
ONBUILD [INSTRUCTION]
功能
配置当前所创建的镜像作为其他新创建镜像的基础镜像时, 所执行的操作指令
8.3 创建镜像
格式
docker build [选项] 路径
将该路径下所有内容发送给Docker服务端
将读取指定路径下(包括子目录)的Dockerfile
服务端创建镜像
建议Dockerfile的目录为空目录
.dockerignore:忽略路径下的目录和文件
-t:指定标签信息
2.2 Dockerfile案例
下面是我创建的一个Dockerfile, 文件名称就是Dockerfile:
# centos: 该处表明,这个Dockerfile的基础镜像为centos:lastest
# 如果你是在离线的环境下,要确保centos:lastest已经pull到本地,这样build的时候就不需要网络了.
#将Image pull到本地,应该用Docker的代理.我尝试过下载离线的Image,没有成功
FROM centos:latest
#此处是创建者信息
MAINTAINER User <email@email.com>
#将本机当前目录下的文件拷贝到容器的/home/pythonapp下
# 注: 使用当前目录不是很好,因为当前目录包含Dockerfile,会将这个文件也拷贝进去.
# 我的当前目录下包含的文件有: Compare.py, Compare.txt
# Compare.py会根据Compare.txt的内容,生成新的文件,并拷贝到output的dst.txt文件中
COPY . /home/pythonapp
#在离线的情况下,该句会导致build Image失败
# centos的image中预装了python
#RUN yum install -y python2.7
CMD ["bash"]
3 Build Dockerfile
3.1 Build
在Dockerfile的目录下,运行下面的语句,创建新的Image
[root@localhost python]# sudo docker build -t matthewx:python-matthew /home/jenkins/Dockerfile/python
3.2 查看Image
[root@localhost python]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
matthewx python-matth 3ccb7748fa38 6 seconds ago 192.5 MB
4运行容器
4.1 运行新构建的Image
[root@localhost python]# docker run -idt --name python_app_test -v /home/jenkins/Dockerfile/python/output:/home/pythonapp/output 3ccb7748fa38
其中/home/jenkins/Dockerfile/python/output为本机目录, /home/pythonapp/output为Docker容器中的目录.该语句创建一个数据卷.
4.2 查看容器
[root@localhost python]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a8ae7fae406 3ccb7748fa38 "bash" 13 seconds ago Up 12 seconds python_app_test
4.3 进入容器
[root@localhost python]#docker attach python_app_test
# 进入容器:
[root@localhost python]# docker attach python_app_test
[root@9a8ae7fae406 /]# cd /home/
[root@9a8ae7fae406 home]# ls
pythonapp
[root@9a8ae7fae406 home]# cd pythonapp/
[root@9a8ae7fae406 pythonapp]# ls
Compare.py Compare.txt Dockerfile dst.txt output
[root@9a8ae7fae406 pythonapp]# python Compare.py
# 退出容器
[root@9a8ae7fae406 pythonapp]# exit
Exit
4.4 查看数据卷
# 在本机目录创建了output文件夹
[root@localhost python]# ls
Compare.py Compare.txt Dockerfile dst.txt output
[root@localhost python]# cd output/
# dst.txt为新建的文件夹
[root@localhost output]# ls
dst.txt
Docker实践:创建并运行一个自定义的Docker Image的更多相关文章
- Laravel 从入门到精通 创建并运行一个新的 Laravel 项目
创建一个新的 Laravel 项目 正如官方文档所言,有两种方式可以创建一个新的 Laravel 项目,这两种创建方式都是从命令行执行的:第一种是通过全局的 Laravel 安装器,另一种是通过 Co ...
- 使用PyCharm创建并运行一个Python项目
(1)首先,在欢迎界面点击“Create New Project”: (2)在“New Project“左侧面板点击”Pure Python“,右侧Location选择自己要创建项目的路径(一般情况, ...
- Python中subprocess 模块 创建并运行一个进程
python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex ...
- DokcerFile的添加及如何生成一个自定义镜像mycentos(四)
最近在学习Docker,用commit去生成一个镜像,但是生成后的镜像非常臃肿,所以去学习了一下DockerFile. 前提条件: 已在虚拟机中成功安装Docker 简单的理解可以如下图所示: Doc ...
- centos7下安装docker(8.1运行容器)
从今天开始学习docker container 1.docker run 之前我们在学习制作镜像以及制作私有仓库的时候已经用到docker run -it以及docker run -d来临时运行一个容 ...
- Docker源码分析(二):Docker Client创建与命令执行
1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引擎,给全球开发者提供了一种新颖.便捷的软件集成测试与部署之道.在团队开发软件时,Docker可以提供可复用的运行环境.灵活的资源配置. ...
- docker快速创建轻量级的可移植的容器(一)
系列其他内容 docker快速创建轻量级的可移植的容器✓ docker&flask快速构建服务接口 docker&uwsgi高性能WSGI服务器生产部署必备 docker&gu ...
- 以Docker容器的形式运行GVM-11
OpenVAS(Open Vulnerability Assessment System)是在nessus基础上发展起来的一个开源的漏洞扫描程序,其核心部件是一套漏洞测试程序,可以检测远程系统和应用程 ...
- 如何创建并运行java线程
本文转载地址: http://ifeve.com/creating-and-starting-java-threads/ Java线程类也是一个object类,它的实例都继承自j ...
- Java并发编程(二)-- 创建、运行线程
Java线程 Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. Java可以用如下方式创建一个线程: Tread thread = new Thread ...
随机推荐
- 10.Kubernetes核心技术Service
Kubernetes核心技术Service 前言 前面我们了解到 Deployment 只是保证了支撑服务的微服务Pod的数量,但是没有解决如何访问这些服务的问题.一个Pod只是一个运行服务的实例,随 ...
- Metal 开发教程(一)
原文链接: https://developer.apple.com/documentation/metalkit/mtkview?language=objc MTKView 用于创建,配置,显示met ...
- 没有MAC电脑,如何申请苹果开发证书、上架APP Store?
[引言] 使用uni-app进行跨平台APP开发时,苹果ios平台最终还是要通过APP Store渠道发布,调试时uni-app基座也必须使用开发者证书签名后才能安装.对于使用MAC电脑的开发者,倒也 ...
- MySQL 主从复制之多线程复制
目录 一.MySQL 多线程复制的背景 二.MySQL 5.5 主从复制 1.原理 2.部署主从复制 2.1.主节点安装配置MySQL 5.5 2.2.从节点安装配置MySQL 5.5 3.检查主从库 ...
- WSL2 使用 code . 命令打开文件夹时,出现 "Unable to establish SSL connection. ERROR: Failed to download..."
1. 背景 在 wsl2 里开发一个小项目,之前一直使用功能正常. 今天按以往的流程(打开 wsl2(ubuntu) 终端,进入到指定文件夹目录下,输入 code . 命令,在 vscode 中打开该 ...
- OneForAll - 功能强大的子域收集工具
OneForAll,是 shmilylty 在 Github 上开源的子域收集工具,目前版本为 v0.4.3. 收集能力强大,利用证书透明度收集子域.常规检查收集子域.利用网上爬虫档案收集子域.利用D ...
- 第十四届蓝桥杯省赛C++B组--接龙序列
接龙序列 我们称序列中\(a_i\)的首位数字恰好是\(a_{i-1}\)的末尾数字,这样的序列叫做接龙序列,比如12 23 35 57,所有长度为1的整数序列都是接龙序列,现在给定一个长度为\(n\ ...
- 基于surging的木舟平台如何分布式接入设备
一.概述 上篇文章介绍了木舟通过基于木舟平台浅谈surging 的热点KEY的解决方法,那么此篇文章将介绍基于surging的木舟平台如何分布式接入设备. 木舟 (Kayak) 是什么? 木舟(Kay ...
- BigDecimal数据处理方法总结
前言 BigDecimal是Java编程语言中位于java.math包中的一个类,主要用于进行高精度的十进制数计算.它提供了对任意精度的十进制数进行精确计算的能力,适用于需要保持精度和执行准确计算 ...
- IDEA如何使用快捷键进行驼峰命名转换
idea菜单栏-file-settings-plugins-在marketplace搜索"CamelCase"-点击安装 安装后重新打开idea,选中内容,使用快捷键:shit+a ...