当前位置: 首页 > news >正文

干货分享:Docker 容器应用示例

导言:

之前在文章《云原生核心技术之:容器 | Docker》中梳理了容器技术产生的背景、Docker技术简介。其实 Docker 技术的实际应用也很简单,今天这篇文章便用一个 python 环境 “hello world!” 服务来进行示例。相应的,迁移到生产环境的Python、C++、Java、Go 等环境应用也大致如此。


1、创建一个简单的 “Hello world” python 应用

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!\n'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

2、为镜像创建 Dockerfile

# 使用官方提供的 Python3 开发镜像作为基础镜像
FROM python:3

# 将工作目录切换至 /usr/src/app
WORKDIR /usr/src/app

# 使用 pip3 命令安装这个应用所需要的依赖
RUN pip3 install  --trusted-host pypi.python.org  Flask

# 将当前目录下的所有文件复制到 /usr/src/app
COPY . .

# 允许外界访问容器的80端口
EXPOSE 80

# 设置此应用的启动命令为python3 ./helloworld.py
CMD [ "python3", "./helloworld.py" ]

3、构建容器镜像

# docker build -t helloworld . 

基于当前目录(注意命令结尾的点)构建一个叫 helloworld 的镜像, Docker 会在目录中 寻找 Dockerfile, 然后基于其中的指令构建镜像。

查看本地的镜像

# docker images | grep helloworld 

REPOSITORY  TAG     IMAGE ID      CREATED       SIZE
helloworld  latest  094719b43011  4 hours ago   928MB

4、运行容器镜像

# docker run --name helloworld-container -p 3000:80 -d helloworld

基于 helloworld 镜像创建一个叫 helloworld-container 的新容器。这个容器与命令行分离 (-d标志),意味着在后台运行。本机上的3000端口会被映射到容器内的80端口(-p 3000:80)

测试

# curl localhost:3000/
Hello World!

列出运行中的容器

# docker ps 
# docker ps -a  查看所有容器,包括停止的

获取更多容器信息

# docker inspect helloworld-container

在容器内部运行 shell

# docker exec -it helloworld-container bash
root@9cbc6114f488:/usr/src/app# 

在运行中的 helloworld-container 容器内部运行bash

  • -i,确保标准输入流保待开放。需要在 shell 中输入命令。
  • -t,分配一个伪终端(TTY) 。

在容器中列出进程
在容器内部运行 shell

root@9cbc6114f488:/usr/src/app# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.6 107116 24212 ?        Ss   12:06   0:00 python3 ./helloworld.py
root         9  0.0  0.0   5976  2076 pts/0    Ss   12:22   0:00 bash
root        16  0.0  0.0   8576  1628 pts/0    R+   12:27   0:00 ps aux

5、停止和删除容器

停止容器

# docker stop helloworld-container

删除容器

# docker rm helloworld-container

6、向镜像仓库推送镜像

为了在任何机器上都可以使用,把镜像推送到一个外部的镜像仓库(可以选择 Docker Hub http://hub.docker.com)作为公共的镜像中心。

在推送之前, 需要重新根据 Docker Hub 的规则标注镜像。 Docker Hub 允许向以自己的 Docker Hub ID 开头的镜像仓库推送镜像。 可以在 http://hub.docker.com 上注 册 Docker Hub ID。

# docker tag helloworld:latest yaocoder/helloworld

向 Docker Hub 推送镜像

# docker push yaocoder/helloworld

dockerhub.png

7、在其他机器上运行镜像

docker run -p 3000:80 yaocoder/helloworld

 

Dockerfile命令

一、编写Dockerfile的常用命令简介

命令描述
FROM基于哪个镜像来实现
MAINTAINER镜像创建者
ENV声明环境变量
RUN执行命令
ADD添加宿主机文件到容器里,有需要解压的文件会自动解压
COPY添加宿主机文件到容器里
WORKDIR工作目录
EXPOSE容器内应用可使用的端口
CMD容器启动时执行的命令,如果执行 docker run <启动命令> CMD 会被覆盖
ENTRYPOINT与 CMD 功能基本等同,但执行 docker run <启动命令> 不会覆盖,如果需要覆盖可以增加参数 -entrypoint
VOLUME数据卷,将宿主机的目录映射到容器中的目录

链接:《命令详细介绍》


附:

希望大家关注我更新维护的 GitHub 开源项目,
https://github.com/yaocoder/Architect-CTO-growth
包括技术实践及手册撰写:涵盖DevOps,云原生技术,大数据,人工智能,高并发&高性能&高可用服务等,一起学习成长!如果对你有用,也请星标一下O(∩_∩)O

相关文章:

  • 闭包的定义,原理,应用场景,优点,缺点
  • js控制台输出佛祖保佑图形图案/彩色图形图案实例代码
  • 黑客进行攻击中最重要的环节“信息收集”
  • Vue(6)
  • JSON 数据类型转换工具
  • CSP-J 2019 入门级 第一轮 第17题
  • 小程序map组件一——使用腾讯地图个性化地图组件、腾讯云可视化大屏展示
  • 【项目实战】高并发内存池
  • go语言|数据结构:二叉树可视化(svg树形图改进版)
  • JVM - 垃圾回收方式性能研究
  • flink笔记2(Flink 快速上手)
  • k8s部署服务+日志收集+监控系统+CICD自动化
  • Docker Compose
  • 【大厂面试重点(程序环境和预处理以及C语言不能函数重载但C++却可以的原理分析)】
  • 【Google】“共码未来“—2022谷歌开发者大会参会记录
  • 03Go 类型总结
  • create-react-app做的留言板
  • Electron入门介绍
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Lucene解析 - 基本概念
  • PAT A1120
  • react 代码优化(一) ——事件处理
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • STAR法则
  • windows下如何用phpstorm同步测试服务器
  • 阿里研究院入选中国企业智库系统影响力榜
  • 如何在GitHub上创建个人博客
  • 使用API自动生成工具优化前端工作流
  • 数组大概知多少
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 终端用户监控:真实用户监控还是模拟监控?
  • MPAndroidChart 教程:Y轴 YAxis
  • Semaphore
  • UI设计初学者应该如何入门?
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 进程与线程(三)——进程/线程间通信
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • !!Dom4j 学习笔记
  • ###STL(标准模板库)
  • #git 撤消对文件的更改
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十) 初识 Docker file
  • (十八)三元表达式和列表解析
  • (一)认识微服务
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 物件導向與老子思想 (OO)
  • (转)scrum常见工具列表