我与Docker的第一次

虽然目前还在国企工作,但我一直自诩为一名程序员,作为一名程序员,就应该时刻接触新知识,不断提高自己。说这话其实是有点装逼的,哈哈,因为docker都已经发展好几年了,我竟然才接触。其实我之所以想开始用docker,是因为我今年新买了阿里云服务器,在我部署自己的Web应用的时候,遇到了不少的麻烦,虽然我已经写了fabfile用来部署,在终究会因为系统的差异等等各种原因,导致部署的时候也遇到了不少的错误。而docker会为我解决这些问题。

一、Docker简介

在官网中,对Docker进行了如下的定义:

Docker is an open-source engine to easily create lightweight, portable, self-sufficient containers from any application. The same container that a developer builds and tests on a laptop can run at scale, in production, on VMs, bare metal, OpenStack clusters, or any major infrastructure provider.

Common use cases for Docker include:

Automating the packaging and deployment of web applications.
Automated testing and continuous integration/deployment.
Deploying and scaling databases and backend services in a service-oriented environment.
Building custom PaaS environments, either from scratch or as an extension of off-the-shelf platforms like OpenShift or Cloud Foundry.

docker的目标是Build,Ship and Run Any App,Anywhere”,docker就像一个黑盒子,他封装了一个空间,你可以做所有你在普通机器上能做的事。最重要的事,docker是一个可移植的容器,你可以将封装好的容器发布到任何的Linux机器上。

简单来说,就是一次封装,到处运行。

在正式使用docker之前还是要了解一下docker的几个重要概念:

1、docker镜像

Docker镜像类似于虚拟机镜像,是一个只读模板,并且包含了文件系统。一个镜像可以只包含一个操作系统环境(比如SUSE镜像),也可以安装了用户程序及其运行环境(比如eBackup镜像)。镜像其实就是一个文件,任何用户程序都可以成为镜像的一部分。

镜像=操作系统+软件运行环境+用户程序

2、容器( Container)

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。

3、仓库

仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载使用。

二、Docker安装

Docker的安装完全按照官网说明来即可: Docker安装

docker共有两种类型可供下载,比较适合咱开发者的就是CE版本。

三、Docker使用

docker最重要的就是镜像了,创建一个docker容器的前提是必须有一个基础的docker镜像,镜像可以从docker官网中提供的或者自己提交的镜像列表中下载。

比如:

docker run hello-world

该命令创建并启动了一个容器,docker会先从本地搜索镜像,若没有会搜索官网上提供的镜像hello-world。

除了上面的方法,我们可以编写Dockerfile,来获得镜像,并执行相应的命令。下面是一个例子:

# Use an official Ubuntu 
FROM ubuntu:16.04

# Set the working directory to /app
WORKDIR /app

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


RUN apt-get install python-dev python-pip
# Install any needed packages specified in requirements.txt
RUN pip install Flask

# Make port 80 available to the world outside this container
EXPOSE 80 8080 8000

# Define environment variable
ENV NAME World

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

ps:这里遇到了一个问题,当我用14.04版本的Ubuntu的时候,再后面执行安装命令的时候,总是不能够正常执行,一直返回100的错误代码,后来改成了16.04就好了。14.04应该是稳定版本啊,为啥呢?

当前目录结构:

Dockerfile app.py

app.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'hello world'

if __name__ == "__main__":
    app.run(host='0.0.0.0')

写好了Dockerfile之后,就应该进行编译,生成新的镜像,当然首先要确保自己在当前工作目录:

docker  build -t flaskapp .       #后面的点儿表示当前目录。

执行命令后,会生成一个镜像,可通过 docker images 查看。

创建好了镜像之后,就是要创建容器并启动它了:

docker run -p 80:5000 -d flaskapp

d选项是让docker容器在后台运行。更多功能可通过docker run --help查看。

docker run命令创建并启动了一个容器,可以通过docker ps命令查看正在运行的容器。

    docker ps命令:

    -a  显示所有已经创建的容器
    -l  显示最近创建的容器

   如果不加任何选项,则显示正在运行的容器。

此时我们可以通过localhost即可访问web应用了。

至此一个docker容器就构造完了,并成功运行Web应用。

我们在如果想要在其他的地方部署,就要把自己的镜像传到docker仓库中,首先你要在官网创建一个账号。 创建好之后:

1、登录

docker login

会提示输入用户名和密码。

2、打标签

给自己的镜像打标签:

docker tag flaskappo hbnnforever/flaskapp:first

如果不打标签,就默认是latest。

3、上传镜像

docker push hbnnforever/flaskapp:first

此时,已经上传好了镜像,如果想要在其他地方用:

docker run -p 80:5000 hbnnforever/flaskapp:first

是不是很简单,惊不惊喜意不意外?

基础命令记录:

如果想进入正在运行的容器,可通过几种方式:

1、使用docker exec进入Docker容器

我认为这是最好的一种方法,使用方式:

    docker exec -it contain_id  /bin/bash      contain_id是具体的容器id

2、attach

docker attach  contain_id

我反正是用着不是特别顺畅。

docker run可以创建并启动命令,相当于身兼数职,就有点像git里面的checkout,没有我可以创建。但如果想启动已经存在的容器,可以使用docker start ,停止是stop。

上面介绍了Docker的定义,基本使用方法等等。这是我接触Docker的第一步,未来学习之路还有很长,我要坚持下去。接下来我会把我在阿里云服务器上的Web应用利用docker部署一下。

--------EOF---------
微信分享/微信扫码阅读