docker使用入门(二):容器container

docker层次结构可以分为三层,从下往上是:容器(container)、服务(services)、堆栈(stack),其中services定义了容器的行为,stack 定义了services的交互

接下来是尝试如何使用docker在容器中启动一个应用程序

创建容器

  1. 创建一个空的文件夹,其中包含Dockerfile、app.py、requirements.txt三个文件,文件内容分别如下

Dockerfile

# 使用python的运行环境作为parent image
FROM python:2.7-slim # 设置工作路径
WORKDIR /app # 将当前目录的内容复制到相应路径下
COPY . /app # 下载requirements.txt中要求的包
RUN pip install --trusted-host pypi.python.org -r requirements.txt # 暴露容器的80端口
EXPOSE 80 # 定义环境变量
ENV NAME World #当docker开始运行时执行文件
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>" \
"<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__":

构建应用程序

使用以下命令build应用程序

docker build --tag=friendlyhello  .
# or docker build -t=friendlyhello .

使用docker image ls可以查看构建的image

 $  docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest 7ecc82fd960a 53 minutes ago 148MB
python 2.7-slim 5f759d36aead 7 hours ago 137MB
hello-world latest fce289e99eb9 7 months ago 1.84kB

其中TAG默认为latest,可以使用--tag=friendlyhello:v0.0.1.来指定tag

运行应用程序

使用以下语句运行程序

docker run -p 4000:80 friendlyhello

其中-p 4000:80 表示将image的80端口映射到主机的4000端口。

运行http://localhost:4000可以查看程序运行结果

使用-d可以让程序后台运行

$ docker run -d -p 4000:80 friendlyhello
c21b81020e77e9f15df5fafbfdaf2791599c6233b4169615ea9226f243ff68b8 $ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c21b81020e77 friendlyhello "python app.py" About a minute ago Up About a minute 0.0.0.0:4000->80/tcp elegant_raman # 关闭程序
$ docker container stop c21b $ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

共享iamge

登录账户

我们可以将image上传到dockerhub中,从而能够在任何地方运行image。

首先我们需要先注册一个账号,然后输入docker login在本地登录账号

使用镜像加速器

直接访问dockerhub时,访问速度会较慢,这时候可以采用镜像加速器。国内的镜像加速器有

/etc/docker/daemon.json中写入以下内容

{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"
]
}

之后重启服务

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

执行docker info可以查看镜像是否添加成功

$ docker info
...
Registry Mirrors:
https://dockerhub.azk8s.cn/
https://reg-mirror.qiniu.com/
Live Restore Enabled: false

关联仓库

使用username/repository:tag可已将本地image和远程仓库关联到一起,其中tag是可选的,当tag时,仓库会为相应的image打上标签。其完整的指令是

docker tag image username/repository:tag

例如

docker tag friendlyhello   yezh01/getstart:v1.0

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest 7ecc82fd960a 23 hours ago 148MB
yezh01/getstart v1.0 7ecc82fd960a 23 hours ago 148MB
python 2.7-slim 5f759d36aead 30 hours ago 137MB
hello-world latest fce289e99eb9 7 months ago 1.84kB

检查image可以发现其中多了一个yezh01/getstart

上推image

我们需要先将image上传到dockerhub中,才能在不同机器上运行image,上传指令为:

$ docker push yezh01/getstart:v1.0

上传完成后,,我们可以通过在任何机器上通过以下命令运行image

docker run -p 4000:80 username/repository:tag

系统执行以上指令时,首先会在本地找相应的image,若本地不存在则会自动尝试从dockerhub中获取image,因此无论我们可以方便的在不同机器上部署开发docker

相关命令

docker build -t friendlyhello .  # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello # Run "friendlyhello" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode
docker container ls # List all running containers
docker container ls -a # List all containers, even those not running
docker container stop <hash> # Gracefully stop the specified container
docker container kill <hash> # Force shutdown of the specified container
docker container rm <hash> # Remove specified container from this machine
docker container rm $(docker container ls -a -q) # Remove all containers
docker image ls -a # List all images on this machine
docker image rm <image id> # Remove specified image from this machine
docker image rm $(docker image ls -a -q) # Remove all images from this machine
docker login # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag # Tag <image> for upload to registry
docker push username/repository:tag # Upload tagged image to registry
docker run username/repository:tag # Run image from a registry

相关链接

https://docs.docker.com/get-started/part2/

docker (二):容器container的更多相关文章

  1. Docker(二十)-Docker容器CPU、memory资源限制

    背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...

  2. Docker学习笔记之docker volume 容器卷的那些事(二)

    预览目录 更改目录拥有者 Data Container 切换用户 参考文章 0x00 概述 如果你读了docker volume 容器卷的那些事(一),我想应该不会遇到下面这些问题的,毕竟是具有指导意 ...

  3. Docker 容器(container)及资源限制

    Container: 既然container是由image运行起来的,那么是否可以理解为container和image有某种关系?先来看张图: 其实可以理解为container只是基于image之后的 ...

  4. Docker概念学习系列之Docker核心概念之容器container

    不多说,直接上干货! Docker 利用容器来运行应用. 容器是从镜像创建的运行实例. 它可以被启动.开始.停止.删除.每个容器都是相互隔离的.保证安全的平台. 可以把容器看做是一个简易版的 Linu ...

  5. 理解Docker单机容器网络

    在” 理解Docker单机容器网络 “一文中,还有一个Docker容器网络的功能尚未提及,那就是Docker容器的端口映射.即将容器的服务端口P’ 绑定到宿主机的端口P上,最终达到一种效果:外部程序通 ...

  6. Docker 定制容器镜像的2种方法

    一.需求 由于在测试环境中使用了docker官网的centos 镜像,但是该镜像里面默认没有安装ssh服务,在做测试时又需要开启ssh.所以上网也查了查资料.下面详细的纪录下.在centos 容器内安 ...

  7. Docker:容器间互联的应用zabbix监控项目 [十]

    一.docker容器间的互联 1.创建两个容器 [root@luoahong ~]# docker run -d --name luoahong httpd:latest 8f771f043391e7 ...

  8. Docker:容器的四种网络类型 [十三]

    一.None类型 简介:不为容器配置任何网络功能,--net=none 1.创建容器 docker run -it --network none busubox:latest 2.功能测试 [root ...

  9. Java程序运行在Docker等容器环境有哪些新问题

    基本回答 一.  对于Java来说,Docker毕竟是一个较新的环境,其内存.CPU等资源限制是通过ControlGroup实现的.早期的JDK版本并不能识别这些限制,进而会导致一些基础问题. 1.如 ...

随机推荐

  1. js改变this指向

    js中修改this的指向 方法整理 call,apply,bind 以上的三哥方法都是用来改变js中this的指向 call 使用方法:fun.call(thisArg[,arg1[, arg2[, ...

  2. 29-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(Lwip RAW模式,非RTOS版,精简入门)

    https://www.cnblogs.com/yangfengwu/p/11456667.html 由于上一节的源码长时间以后会自动断开,所以再做这一版非RTOS版的,咱直接用lua源码里面别人写的 ...

  3. NVIDIA vGPU License服务器搭建详解

    当配置有vGPU虚拟机发起License授权请求,授权服务器会根据License中所包含的GRID License版本,加载不同的vGPU驱动(普通驱动和专业Quodra卡驱动).目前vPC和vApp ...

  4. nodejs之MongoDB安装[windows平台]

    下载MongoDB,本为下载msi文件安装,下载地址     下载完成之后直接双击文件安装,安装时注意安装路径 创建一个空文件夹,用于存放数据库文件 通过控制台进入安装目录下的bin目录,或者在bin ...

  5. (7)Go切片

    切片 切片(Slice)是一个拥有相同类型元素的可变长度的序列.它是基于数组类型做的一层封装.它非常灵活,支持自动扩容. 切片是一个引用类型,它的内部结构包含地址.长度和容量.切片一般用于快速地操作一 ...

  6. Server concepts 详解

    server status 是由 vm_state和task_state 计算出来的,vm_state是虚机当前的稳定状态(例如Active, Error),task_state是虚机当前的瞬间状态( ...

  7. HearthBuddy投降插件2019-11-01的使用

    在AutoConcede.cs文件中找到如下代码 private List<int> _winList = new List<int> {0, 2, 4, 6, 8}; 现在的 ...

  8. java正则表达式备忘

    最近框架和爬虫上常要处理字符串匹配和替换的场景,备忘. 非贪婪模式 比如要匹配html文本中的连接,例如a href="www.abc.com/xyz/o"需要替换为a href= ...

  9. 【转】使用AllureReport生成测试报告

    Allure简介 Allure是一个report框架,可以基于一些测试框架生成测试报告,比较常用的一般是Junit/Testng框架:Allure 生成的报告样式简洁美观,同时又支持中文:Allure ...

  10. 使用 Spring Cloud Sleuth、Elastic Stack 和 Zipkin 做微服务监控

    关于迁移微服务架构,最常被提及的挑战莫过于监控.每个微服务应独立于其他服务的运行环境,所以他们之间不会共享如数据源.日志文件等资源. 然而,较容易的查看服务的调用历史,并且能够查看多个微服务的请求传播 ...