docker
相当于在进程上,披着一个马甲,其实就是在一个单独的linux系统上
解决了什么?
- 操作系统不一样
- 各种平台组件的一致性 比如 开发环境的python3 线上环境的python3
- 环境配置问题,运行一个crm,可能要解决很多依赖关系,才能运行
- 解决pip的依赖包,linux的PATH环境变量等等
有没有办法将本地的开发代码,和环境全部切换带服务器上呢?
- vmware 虚拟机的克隆
占资源、启动慢 - docker容器技术
将你的应用程序,和代码,全部打包在一个系统镜像中内,(docker image)
可以保存环境的一致性
docker的三大概念
- 容器 container
- 镜像 image 系统镜像
- 仓库 存放镜像的地方
docker的安装方式
- yum源安装, 必须指定yum源, yum源大致分为 contos官网, 阿里云这样的第三方源, docker官方源(一般生产环境使用docker官网的)
- 获取docker 社区版 CE 企业版EE
- 选择阿里云的安装
yum install docker-server docker -y
- 启动docker服务端
systemctl start docker # 启动docker
systemctl stop docker # 停止docker
linux 登录 dockerhub
docker login
# 输入账号
# 输入密码
docker 的生命周期
命令函数
docker 加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
# 运行完会返回信息
# docker version >= 1.12
# {"registry-mirrors": ["http://95822026.m.daocloud.io"],}
# Success.
# You need to restart docker to take effect: sudo systemctl restart docker
# 修改配置文件
vim /etc/docker/daemon.json
{"registry-mirrors": ["http://95822026.m.daocloud.io"]} # 去掉结尾的 “,”逗号
- 增加 镜像
# 获得一个 docker镜像, 获取一个ubuntu镜像
# 获取一个hello-word 镜像, 默认去docker hub 搜索docker镜像
docker search hello-world # 搜索
dicker pull hello-world # 下载镜像
- 运行 下载的docker 镜像实例
docker run hello-world
exit # 退出交互模式
docker run -it ubuntu /bin/bash # -i交互式的运行镜像 -t开启一个终端terminal 使用镜像的 /bin/bash 命令
docker run --name docker容器的自定义进程名字 -d centos /bin/sh -c "while true;do echo 买了佛冷;sleep 1;done"
# 容器内的端口映射
docker run -d -p 8080:5000 training/webapp python app.py
# -d 后台运行
# -P 大写的P 随机的端口映射 宿主机端口:容器内的端口 可不用跟 8080:5000
# -p 小写的p 指定端口映射 宿主机的8080 : 5000 5000 是docker容器代码内开启的端口号
# training/webapp 镜像的名字
# python app.py 容器要执行的命令
- 修改
docker exec -it 容器id /bin/bash # 进入容器
# 修改镜像的名字
docker tag 镜像id 指定镜像名字
- 查询
# 查询 当前机器拥有的镜像文件
docker image ls # 列出镜像文件
docker images # 列出镜像文件 命令也就升级了
# 运行过的镜像 会产生一个docker 镜像的 ps 进程
docker ps 查看正在运行的镜像
docker ps -a 查看所有运行过的镜像
docker logs 容器的id 打印日志
docker logs 容器的id -f 不间断的打印日志
- 删除
# 删除容器id
docker rm 容器id #(docker ps -a)
docker rm `docker ps -aq` # `` 反引号是 取得命令结果,保存下来
# 删除镜像
docker rmi 镜像is # (docker images) 显示 镜像的id
docker rmi `docker images -aq` # 删除所有的镜像
``
+ 构建docker镜像
启动一个centos 镜像
docker run -it centos /bin/bash
安装 wget
yum install wget
配置 阿里云 源
https://opsx.alibaba.com/mirror
安装 vim
yum install vim
退出
exit
提交这个容器记录, 生成一个新的镜像源文件
docker commit 容器id 镜像名 你的dockerhub/自定义的名字
推送镜像到 dockerhub
docker push dockerId/镜像名称
导出镜像, 成为一个压缩文件, 可以给发家发送过去
docker save 镜像id > /opt/centos-vim-alimirror.tar.gz
导入镜像
docker load < /opt/centos-vim-alimirror.tar.gz
### dockerfile指定镜像
+ Dockerdile 就是我们制定的每一层添加配置
```# 你的项目依赖设么操作系统 你就指定什么操作系统
FROM scratch # 制作base image 镜像基础 尽量官方的 image 作为 base image
FROM centos # 使用 base image
FROM ubuntu:14.04 # 带有 tag的base image
# LABEL标签 告诉别人这个dockerfile是谁写的
LABEL version="1.0" # 容器元信息,帮助信息 Metadata 类似以代码注释
LABEL maintainer="xxx@126.com"
# 对于复杂的RUN命令 避免无用的分层,多条命令用反斜线, 合成一行命令
RUN yum update && yum install -y vim \
Pyhton-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME"
WORKDIR /root # 切换工作目录
WORKDIR /test
WORKDIR demo
RUN pwd
# ADD 可以将本地代码 添加到docker容器空间
# ADD 还可以解压缩文件
ADD and COPY
ADD ./hello.py /opt/myCode/ 将本地的 hello.py文件 添加到 docker的 /opt/myCode/目录下面
ADD test.tar.gz / 添加并解压到根目录
# COPY 就是将宿主机的文件,拷贝到容器空间内,且没有解压缩效果
COPY hello /opt/test/
# 远程添加文件 使用 curl 或者 wget
# ENV 环境变量, 尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 # 设置一个mysql常亮
RUN yum install -y mysql-server="${MYSQL_VERSION}"
构建自己的 flask dockerfile
假如我们要在 /opt/flasksite 目录下创建
# coding:utf8
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "hello world"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
- 准备Dockerfile文件
FROM centos # 指定centos 的base image
COPY CentOS-Base.repo /etc/yum.repos.d/ # 更换yum源码
COPY epel.repo /etc/yum.repos.d/
RUN yum clean all # 清空 yum 缓存命令
RUN yum install python-setuptools -y # 安装python的依赖工具
RUN easy_install flask # 安装python2 的flask
COPY app.py /opt/ # 把本地的 appy 拷贝
WORKDIR /opt/
EXPOSE 8000 # 暴露容器的 8000端口对外访问
CMD ["python","app.py"] # 执行这个命令
- 构建docker镜像
docker build .
# 查看构建的 docker 镜像
docker images
docker tag 镜像id 镜像名字
启动 这个容器
docker run -d --name flask -p 8000:8000 镜像名字
docker 私有仓库
- 下载一个私有的docker 镜像
# 1.下载私有仓库镜像
docker pull registry
# 2. 修改配置文件 让他支持 非https 协议的方式去推送文件
vim /etc/docker/daemon.json
"insecure-registries":["192.168.156.128:5000"]
# 3. 修改docker的service配置文件 让他加载/ect/docker/daemon.json
vim /lib/systemed/system/docker.service
# 在[Service]代码块中添加
EnvironmentFile=-/etc/docker/daemon.json
# 4.重启docker的服务
systemctl daemon-reload
systemctl restart docker
# 5.启动一个私有的镜像仓库容器实例
docker run --privileged=true \
-d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
# -v 参数 文件映射 宿主机文件夹目录
# 设置私有仓库镜像文件
docker tag docker.io/hello-world 192.168.156.128:5000/hello-world # 创建一个私有主机地址的docker镜像文件
# 6.推送 镜像 到私有仓库
docker push 192.168.156.128:5000/hello-world
# The push refers to a repository [192.168.156.128:5000/hello-world]
# af0b15c8625b: Pushed
# latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524
# 7.浏览器查看
192.168.156.128:5000/v2/_catalog
{"repositories":["hello-world"]}