docker

官网

文档

阿里云镜像

注册docker账号

由于虚拟机存在资源占用多、冗余步骤多、启动慢等缺点

Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案

docker的用途

  • 提供一次性的环境 - 比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境
  • 提供弹性的云服务 - 因为 Docker 容器可以随开随关,很适合动态扩容和缩容
  • 组建微服务架构 - 通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构

安装

下载

docker versiondocker info 验证安装是否完成

Docker需要用户具有sudo权限,为了避免每次命令都输入sudo,可以把用户加入Docker用户组(官方文档

sudo usermod -aG docker $USER

linux可使用如下命令安装docker


# curl -sSL https://get.docker.com/ | sh
# 下载安装docker
curl -sSL https://get.daocloud.io/docker | sh

# vim /lib/systemd/system/docker.service
# 修改文件,允许使用TCP连接Docker
ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2375

# 重启docker
systemctl restart docker

镜像加速器

阿里云镜像


vim /etc/docker/daemon.json

{"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]}

image文件

Docker把应用程序及其依赖,打包在image文件里面,只有通过这个文件,才能生成docker容器

我们可以把image理解成一个类,把容器理解成一个对象,一个类可以实例化多个对象

同理image也可以继承另一个image

image文件是一个二进制文件,image文件是通用的,一台机器的image文件拷贝到另一台机器,照样可以使用

为了方便共享,image文件制作完成后,可以上传到网上的仓库。Docker的官方仓库Docker Hub是最重要

不过访问国外仓库会比较慢,一般我们使用阿里云镜像

# 列出本机的所有 image 文件
docker image ls

# 删除 image 文件
docker image rm [imageName]

hello world

按照惯例,我们要先向世界问好

# 拉取hello-world image,跟git pull类似
docker image pull library/hello-world

# 由于Docker官方提供的image文件,都放在library组里面,所以它的是默认组,可以省略
docker image pull hello-world

# 抓取成功后,可以通过ls来查看
docker image ls

# 根据image实例化一个容器
# 该命令具有自动抓取image文件的功能。如果发现本地没有指定的image文件,就会从仓库自动抓取
docker container run hello-world

# 有些容器不会自动终止,因为提供的是服务,比如:Ubuntu的image就可以在命令行体验Ubuntu系统
docker container run -it ubuntu bash

# 对于不会自动终止的容器,我们可以使用如下命令手动终止
docker container kill [containID]

容器文件

image文件生成的容器实例,本身也是一个文件,称为容器文件

关闭容器并不会删除容器文件,只是容器停止运行而已

# 列出本机正在运行的容器
docker container ls

# 列出本机所有容器,包括终止运行的容器
docker container ls --all

# 终止运行的容器文件,依然会占据硬盘空间,可以使用将其删除
docker container rm [containerID]

Dockerfile文件

Dockerfile是一个配置文件,类似于composer.json

我们可以借助Dockerfile生成自己的image文件

.dockerignore文件,类似于.gitignore文件

制作自己的image文件

使用python的flask框架写一个hello world的web程序

项目目录中有编写4个文件,分别是 app.py requirements.txt Dockerfile .dockerignore

app.py - python案例代码


from flask import Flask
import socket
import os

app = Flask(__name__)

@app.route('/')
def hello():
    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>"           
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())

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

requirements.txt - 需要安装的Python模块

Flask

Dockerfile - docker配置文件


# 使用官方提供的Python开发镜像作为基础镜像,标签(版本)为2.7,不设置默认为latest
FROM python:2.7-slim

# FROM指定了python:2.7-slim这个官方维护的基础镜像,从而免去了安装Python等语言环境的操作
# 否则,这一段我们就得这么写了
# FROM ubuntu:latest
# RUN apt-get update -yRUN apt-get install -y python-pip python-dev build-essential

# 将工作目录切换为/app
WORKDIR /app

# 将当前目录下的所有内容(除.dockerignore排除的)复制到image文件的/app下
COPY . /app

# 使用pip命令安装这个应用所需要的依赖,安装后所有的依赖,都将打包进入image文件
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# 允许外界访问容器的3000端口
EXPOSE 3000

# 设置环境变量
ENV NAME World

# 设置容器进程为:python app.py,即:这个Python应用的启动命令
CMD ["python", "app.py"]

.dockerignore - docker忽略文件

.git

创建image文件


# -t指定image文件的名字,标签(tag)为1.0.0,不填默认latest,后面的.是Dockerfile文件所在的路径
docker image build -t txf-demo:1.0.0 .

RUN和CMD的区别

  • RUN命令在image文件的构建阶段执行,执行结果都会打包进入image文件,CMD命令则是在容器启动后执行
  • 一个Dockerfile可以包含多个RUN命令,但是只能有一个CMD命令
  • 指定了CMD命令以后,docker container run命令就不能附加命令了(比如/bin/bash),否则它会覆盖CMD命令

根据自己的image文件生成容器文件并运行


# -p:将容器的3000端口映射到本机的8000端口
# -it:容器的Shell映射到当前的Shell,然后你在本机窗口输入的命令,就会传入容器
# image文件的名字和版本,不指定默认latest
docker container run -p 8000:3000 -it txf-demo:1.0.0

打开浏览器访问:http://127.0.0.1:8000,会显示如下内容


Hello World!

Hostname: 9bd7acgd76ad

发布image文件

hub.docker.comcloud.docker.com 注册一个账户

然后在docker客户端工具上登录,或使用 docker login 命令


# 为本地的image标注用户名和版本
docker image tag [imageName] [username]/[repository]:[tag]

# 比如
docker image tag txf-demo:1.0.0 txf19870527/txf-demo:1.0.0

# 也可以不标注用户名,重新构建一下image文件
docker image build -t [username]/[repository]:[tag] .

# 发布image文件,类似于将你的代码推送到git仓库
docker image push [username]/[repository]:[tag]

results matching ""

    No results matching ""