我与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部署一下。
微信分享/微信扫码阅读