Docker容器

1:什么是容器

只要容器驾驭为单独运维的四个或一组利用,以及它们的周转态碰到。
而虚拟机则为可知道为跑在地点的使用。

        容器是Docker三层结构中最低层的构造;其上壹层级是服务,服务概念了容器的行事,最后三遍是栈,定义了具有服务的并行。
        1、Stack(堆栈)
        2、Services(服务)
        三、Container(容器)——你正在看的

二:成立容器

始建文件名叫Dockerfile的空目录,将以下四个文本复制到当中。

        1、定义新开采条件
 
      在一向不Docker此前你想写3个app须要在和睦的主机上设置相应的条件、配置景况变量及各个参数,同时还要有限支撑你的机械适合python安装遭遇;发表至生产时还必须在生育完成平等的安顿。
        用Docker之后,大家得以向来通过获取贰个python镜像,然后将代码与镜像放在一齐,当然再加上一些依靠就可以。

 壹.增添文件

    Dockerfile文件

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
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

# Run app.py when the container launches
CMD ["python", "app.py"]

# Set proxy server, replace host:port with values for your servers
ENV http_proxy host:port
ENV https_proxy host:port

 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__":
    app.run(host='0.0.0.0', port=80)

lovebet,        二、Dockerfile
 
      Dockerfile是用来定义容器的一密密麻麻命令集。在容器里对于于能源访问,像网卡(networking
interface)、磁盘等在容器里是虚拟化的,它和宿主机是三个隔开分离状;由此你必须将这么些能源做二个酷炫,同时将你想要的文件”复制到“容器里。那个操作将以命令集的方法保留在dockerfile相关的文书里,同时大家还要保障这几个文件用了一次下3回还足以再选取。

2.创造镜像

查阅文件

#ls
Dockerfile        app.py            requirements.txt

 

在“Dockerfile”文件夹下运转下边发号施令,创立了三个以“friendlyhello”命名的Docker镜像。

#docker build -t friendlyhello .

 

        1、构建Dockerfile
        成立3个空目录,然后在内部新建3个文本Dockfile,如下:      

三.查看新建镜像

新建的镜像在Docker 镜像registry中

#docker images

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

 

  1. # 使用Python官方镜像作为镜像的底蕴
  2. FROM python:2.7-slim
  3. # 设置专门的学业空间为/app
  4. WORKDIR /app
  5. # 把当前目录下的公文拷贝到 容器里的/app里
  6. ADD . /app
  7. # 安装requirements.txt中内定的借助
  8. RUN pip install -r requirements.txt
  9. # 开放80端口
  10. EXPOSE 80
  11. # 设置 NAME 这几个情形变量
  12. ENV NAME World
  13. # 当容器运行时,运营app.py
  14. CMD [“python”, “app.py”]

四.周转应用程序

运维该APP(应用程序),并将伍仟映射到80端口

#docker run -p 4000:80 friendlyhello

 

 并在浏览器中输入http://localhost:4000,注意如果是win7则将localhost修改为IP

 

 
      这么些dockerfile中要求多少个文本还尚未有备无患好,该公文还亟需八个公文,分别是requirements.txt和app.py。别的,假诺你未来的条件急需代理,则必要充实如下命令:

 五.后台运维应用程序

#docker run -d -p 4000:80 friendlyhello

 

# Set proxy server, replace host:port with values for your servers
ENV http_proxy host:port
ENV https_proxy host:port

陆.查看容器

# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED
1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago

 

        因而在和
dockerfile文件一律的目录下,我们创制app.py文件及<font
color=”red”>requirements.txt</font>文件。内容如下,其实pip
install -r
requirements.txt安装了Flask和Redis的开辟库,app.py打字与印刷出NAME这几个碰着变量和socket.gethostname,当redis服务本人并未运行,app.py里做了错误管理会抛出尤其。

 7.结束容器

#docker container stop 1fa4ab2cf395

 

        requirements.py文件内容:

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 = “cannot connect to Redis, counter disabled” 

    html = “Hello {name}!Hostname: {hostname} Visits: {visits}”
     return html.format(name=os.getenv(“NAME”, “world”),
hostname=socket.gethostname(), visits=visits)
     if __name__ == “__main__”:
         app.run(host=’0.0.0.0′, port=80) 

    大家不须要实际做正视安装,只要发生错定,dockerfile会旨导安装进程。是否很有益于?!

3、创设利用

 
      我们曾经打算好创设第二个利用必须的文本能源。请保管你依旧在dockerfile全体的目录下,在这些目录下,能够看看四个公文:

$ ls
Dockerfile app.py requirements.txt

        1、现在大家运转二个docker命令,创设三个镜像并经过 -t
给镜像起个白璧微瑕的名字

docker build -t friendlyhello .

        贰、大家能够通过docker images查看成立好的镜像地方。

lovebet 1

        叁、运转应用

docker run -p 4000:80 friendlyhello 

        5000:80 是端口重映射,通过docker run
-p对外揭露的端口,80是镜像本身设置的端口。

lovebet 2

lovebet 3

  陆、分享镜像

        能够将镜像上传到3个镜像仓库集结中(类似于github),贰个帐号能够创制四个货仓。
docker CLI暗许就在选择docker的集体注意核心旅社。
        网络有多数docker旅舍,cloud.docker.com是三个无偿且私下认可的酒店,假若大家用来生产,
能够创设筑协会调的docker货仓。
        1) 登6docker货仓宗旨 (
可先通过cloud.docker.com/https://hub.docker.com/登记二个docker饭店帐号)

$ docker login

        2)给镜像打上标签
        货仓关联到当地镜像的暗记一般那样命名,username/repository:tag,
这么些标签是可选的,可是我们推荐使用标签,tag的体制能够给镜像扩张版本号。提议将酒馆名和镜像名起的有一些意义,类似
get-started:park贰:表明将镜像放在get-started那么些库房下,其镜像名称叫park二。语法如下

        docker tag [原镜像名] [标签名],

        举例:

        docker tag friendlyhello nianxl/hellworld:friendlyhello

三)查看镜像标签

Run docker image
ls
 

lovebet 4

四)宣布镜像

docker push username/repository:tag

例:

docker push nianxl/hellworld:friendlyhello

        若是宣布成功,则登录 Docker
Hub
能够见到新发布的镜像,你还足以通过她将镜像下载到本地运维。

伍) 从dockerhub里下载镜像并运转

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

        若是本地有镜像,则先从本地搜索镜像不然会从旅舍里找镜像。在拉取时若是不钦点tag则会拉取最新版本的镜像文件。

lovebet 5

1.登录Docker

 
登6到本地计算机上共用的Docker注册表。若是未有账号,能够登入到https://cloud.docker.com/中注册

#docker login

 

参考

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

https://blog.dubby.cn/detail.html?id=8735

2.标志镜像

形如docker tag image username/repository:tag,意思是用户john将镜像“ friendlyhello”上传至“get-started”存储库,标记为“part2”。

#docker tag friendlyhello john/get-started:part2

 

3. 查看镜像

# docker images

 

4.发布镜像

形如“docker push username/repository:tag”,镜像壹旦上传将会被公开

#docker push john/get-started:part2

 

5.抽取镜像

输入形如“docker run -p 5000:80  username/repository:tag”如下命令

#docker run -p 4000:80 john/get-started:part2

重临如下:

Unable to find image ‘john/get-started:part2’ locally
part2: Pulling from john/get-started
10a267c67f42: Already exists
f68a39a6a5e4: Already exists
9beaffc0cf19: Already exists
3c1fe835fb6b: Already exists
4c9f1fa8fcb8: Already exists
ee7d8f576a14: Already exists
fbccdcced46e: Already exists
Digest:
sha256:0601c866aab2adcc6498200efd0f754037e909e5fd42069adeff72d1e2439068
Status: Downloaded newer image for john/get-started:part2
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

 

四:附录:

假若想明白越来越多容器相关命令可试着运转下列命令

docker build -t friendlyname .              # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyname          # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyname       # 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

 

相关文章