Docker
Docker 是一个开源的应用容器引擎, docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了。
docker与虚拟机的区别
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
docker的应用场景
web应用的自动化打包和发布
自动化测试和持续集成、发布
在服务型环境中部署和调整数据库或其他应用
docker容器的优势
1.更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。
2.更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。
3.一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。
4.更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
docker三大概念
docker镜像
Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器。
image的分层存储
因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。
docker容器(container)
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
docker仓库(repository)
仓库是集中存放镜像文件的场所。分为公开仓库(Public)和私有仓库(Private)两种形式。
使用Docker
安装docker
yum install docker-server docker -y
检查docker版本
docker version
启动docker
systemctl start docker
docker镜像加速器
https://www.daocloud.io/mirror#accelerator-doc
在 /etc/docker/daemon.json文件写入如下配置
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
重启docker
systemctl restart docker
docker命令
搜索镜像
docker search name
下载镜像
docker pull name
查看本地所有的镜像
docker image ls
运行镜像,生成容器
docker run 镜像id
删除镜像
# 必须清除所有的容器记录依赖
docker rmi 镜像id
#批量删除镜像记录
docker rmi `docker images -aq`
运行容器 ,进入容器空间
docker run -it centos /bin/bash
#-i 是交互式的操作
#-t 是开启一个终端
删除容器记录
# 必须是挂掉的记录才能删除
docker rm 容器id
#批量删除容器记录
docker rm `docker ps -aq`
更新容器镜像
docker commit 容器id 新的镜像名
查看正在运行的容器
docker ps
查看所有运行过的容器
docker ps -a
导出本地docker镜像
docker save 容器id > 镜像压缩文件
导入docker镜像文件
docker load < 镜像压缩文件
修改docker镜像名字
docker tag 镜像id 新的镜像名
后台运行容器
docker run -d --name hello centos /bin/sh -c "while true;do echo hello; sleep 1;done"
# --name 容器名字
# -d 后台运行
# /bin/sh Linux的shell解释器
# -c 指定一段shell脚本
运行一个web程序,在容器中对外进行端口暴露
docker run -d -p 8090:5000 training/webapp python app.py
# -d 后台运行
# -p 指定端口映射 宿主机/容器
# -P 随机端口映射,.宿主机会随机生成一个端口
查看docker的端口转发情况
查看docker的端口转发情况
暂停正在运行的容器
docker stop 容器id
再次运行容器
docker start 容器id
查看容器内所有的日志
docker logs -f 容器id
# -f 实时刷新
进入一个运行中的容器
docker exec -it 容器id /bin/bash
dockerfile
镜像是容器的基础,每次执行docker run的时候都会指定镜像作为容器运行的基础。当docker hub的镜像无法满足我们的需求时,就得自定制这些镜像。镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
dockerfile命令
FROM centos
# 指定docker镜像操作系统
LABEL version=“1.0”
# 容器元信息,帮助信息,Metadata,类似于代码注释
RUN echo a
# RUN指令是一个完成指令,运行指定指令
WORKDIR /root
# 切换工作目录,尽量使用绝对路径,如果路径不存在会自动创建目录
ADD newfile.tar.gz /tmp/
# 把本地文件添加到镜像中的指定目录,并解压
COPY newfile.tar.gz /tmp/
# 把本地文件添加到镜像中的指定目录
ENV MYSQL_VERSION 5.6
# 类似创建变量,增加可维护性
# RUN yum install -y mysql-server=“${MYSQL_VERSION}”
自定义flask的Dockerfile示例
flask代码:
#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
return "hello word"
if __name__=="__main__":
app.run(host='0.0.0.0',port=8080)
编写Dockerfile,名字是固定的
FROM python #指定以python为基础镜像,它提供了python3
RUN pip3 install flask # 在容器内安装flask
ADD s24flask.py /tmp/ #添加代码到容器中
WORKDIR /tmp/ #切换工作目录
CMD ["python","s24flask.py"]#通过CMD指令,让容器运行命令 是 python s24flask.py
执行构建命令
docker build .
# 自动检测当前目录下的Dockerfile并构建成镜像
执行镜像文件,生成容器示例
docker run -d -p 9999:8080 5e7
docker hub仓库
公有镜像发布
登陆docker hub
docker login
推送镜像到dockerhub
# 注意要保证镜像的tag是账户名,如果镜像名字不对,需要改一下tag
docker push test/centps-cmd-exec:latest
下载镜像
docker pull test/centos-entrypoint-exec
私有镜像仓库
下载registry镜像并且启动私有仓库容器
私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到本地的/opt/data/registry下
端口映射容器中的5000端口到宿主机的5000端口
docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
推送镜像到私有镜像仓库
私有仓库,默认只支持http方式的推送,不支持https加密的推送,需要修改配置文件支持http形式的推送
1.修改docker的配置文件,添加如下配置
{
"insecure-registries":["ip地址:5000"]
}
2.修改docker的加载配置文件
vim /lib/systemd/system/docker.service
[Service]
Type=notify
NotifyAccess=main
#添加如下一行配置
EnvironmentFile=-/etc/docker/daemon.json
3.重启docker
systemctl daemon-reload
systemctl restart docker
4.重新运行私有仓库的镜像
docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
#--privileged=true 以特权运行docker仓库
5.推送镜像
需要修改镜像名称
ip地址:5000/原镜像名称
推送镜像
docker push ip地址:5000/原镜像名称
6.下载镜像
docker pull ip地址:5000/原镜像名称