Docker入门 - 2.基础知识 & 常用指令

参考官方文档

介绍

是时候使用Docker的方法来构建app了。我们从container —— app的底层构建开始。在这一层的上方是服务,他定义了一个产品中的containers的行为,这个会在后面介绍。最顶层是stack,他定义了服务的所有交互。

  • Stack
  • Services
  • Container (you are here)

开发环境

一般情况下,如果想搭建一套开发环境,首先需要安装一大堆的依赖,很多人相比都经历过这样的痛苦,例如一个Python应用,你必须先安装Python的运行环境。
使用Docker,您可以将可移植的Python运行时作为镜像(image)获取,无需安装。构建时可以在应用程序代码旁边包含基本Python镜像,这样可以确保您的应用程序,其依赖项和运行时都一起运行。
这些可移植镜像统称为Dockerfile。

Dockerfile

Dockerfile定义了你的container内部环境。
对网络接口和磁盘驱动器等资源的访问需要在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将内部端口映射到外部,并具体说明要“复制”哪些文件到那个环境。但是,在执行此操作之后,您可以预期这个Dockerfile定义的应用程序在其运行的任何位置都会完全相同。

创建Dockerfile

新建一个文件夹,新建一个文件命名为Dockerfile,复制以下内容

# 使用官方 Python runtime 作为父镜像(image)  
FROM python:2.7-slim

# 设置工作区 /app
WORKDIR /app

# 把当前路径下的所有文件拷贝到容器中的 /app
ADD . /app

# 安装所有requirements.txt中定义的依赖
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# 向容器外暴露80端口
EXPOSE 80

# 定义环境变量
ENV NAME World

# container启动时执行 app.py
CMD ["python", "app.py"]

创建App

这个稍微有一点python基础的都可以看懂,没有基础的也能看明白大致意思
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 = "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)

构建App

目前我们的文件夹下应该有以下三个文件

$ ls
Dockerfile      app.py          requirements.txt

执行build操作,这会创建一个Docker image,我们使用 -t 让他有一个有好的名字

docker build -t friendlyhello .

查看你的构建结果

$ docker image ls

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

运行App

将本机端口4000映射到容器的已发布端口80 -p:

docker run -p 4000:80 friendlyhello  

// 后台模式
docker run -d -p 4000:80 friendlyhello

访问 http://localhost:4000即可查看结果。

使用后台模式启动时,会返回一个应用程序的长容器ID。

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

停止这个进程

docker container stop 1fa4ab2cf395  

共享image

Docker提供了想github一样的平台,用于多人共享。
如果您没有Docker帐户,请在hub.docker.com上注册一个帐户 。记下您的用户名。
登录本地计算机上的Docker公共注册表。

$ docker login

将本地映像与注册表上的存储库相关联的表示法是 username/repository:tag。标签是可选的,但建议使用。

现在,把它们放在一起来标记图像。docker tag image使用您的用户名,存储库和标记名称运行,以便将图像上载到所需的目标位置。该命令的语法是:

docker tag image username/repository:tag

例如:

docker tag friendlyhello nowheretorun/get-started:master

运行docker image ls以查看新标记的图像。

$ docker image ls
REPOSITORY                    TAG                 IMAGE ID               CREATED             SIZE
friendlyhello                        latest                71d87c79fd0e        4 hours ago         132MB
nowheretorun/get-started   master              71d87c79fd0e        4 hours ago         132MB
hello-world                          latest                4ab4c602aa5e        4 days ago          1.84kB
python                                2.7-slim             c9cde4658340        7 days ago          120MB

发布

docker push username/repository:tag

这样之后,就可以直接拉取并执行一个远程仓库的镜像
如果映像在计算机上不可用,则Docker会从存储库中提取映像。

常用命令

进入容器(有四种方式,先只记最方便的一种)

docker ps // 查看 CONTAINER ID
docker exec -it 69f6eecda047 /bin/bash// 根据ID 进入容器

停止服务

docker container stop 69f6eecda047 // CONTAINER ID

你可能感兴趣的:(Docker入门 - 2.基础知识 & 常用指令)