Docker Platform
Docker提供了一个开发,打包,运行app的平台;把app和底层 infrastructure 隔离开发
Application
Docker Engine
Infrastructure(physical/virtual)
图示:
docker平台-03.png
Docker Engine
后台进程( dockerd )
REST API Server
CLI接口(docker)
图示:
docker engine-03.png
Docker 结构
底层技术支持(利用Linux)
Namespaces:做隔离 pid,net,ipc,mnt,uts
Control groups:做资源限制
Union file systems: Container和Image的分层
Image
文件和Meta data的集合(root filesystem)
分层的,并且每一层都可以添加改变,删除文件,成为一个新的 image
不同的image可以共享相同的 layer
image本身是 read-only的
Image获取方式
dockerfile获取:从文件获取
pull from registry:从仓库获取
官方地址:https://hub.docker.com/从docker hub拉取 image
sudo docker pull ubuntu:18.04
制作一个 Base Image
添加用户docker 可以不用输入sudo命令
sudo groupadd docker sudo gpasswd -a root docker sudo service docker restart#还不行的话,重新连接 xshell
docker命令相关
#查看 dockerdocker version#查看docker imagedocker image -a ls#拉取官方 hello-worlddocker pull hello-world#查看 docker imagedocker image ls#启动docker run hello-world
制作 docker base image
mkdir demo-image cd demo-image#创建代码文件vi hello.c #include<stdio.h> int main(){ printf("hello demo docker\n") }#安装编译工具yum install gcc glibc-static#编译执行文件gcc -static hello.c -o hello#创建 dockerfile文件vi dockerfile FROM scratch ADD hello / CMD "/hello" #当前目录查找 dockerfile文件 构造docker build -t rao-docker-hello .#查看 imagedocker image ls#根据id查看构造过程docker history id#运行docker 容器docker run rao-docker-hell0#结果输出为 hello demo docker 即成功
认识 Container
#列出本地正在运行的容器docker container ls#列出所有的容器,包括正在运行和退出的docker container ls -a#查看 dockerfile信息more hello-world/dockerfile#交互式运行容器docker run -it centos# 列出所有的 imagedocker images#移除imagedocker image rm id#查看容器docker ps -a#列出所有容器 iddocker container ls -aq#移除容器docker rm id
构建 Docker image
#移除docker imagedocker image rm id#基于一个contaienr创建一个 imagedocker container commit container_name new_image_name#构建镜像docker image build#查看层数docker history id
注意:不推荐使用contaienr创建image,推荐使用 dockerfile来创建 image,可以让外部的人了解你的创建过程
示例文件:
FROM centos RUN yun install -y vim
#基于当前的目录 dockerfile构造 imagedocker build -t newImageName .
注意:因为image时只可读的,所以在构建的过程中,临时创建了一个临时的 container,来构造最终的 image
#查看dockerfilemore dockefile
Docker File介绍
FROM 最开始的语法,在那个base image之上制作 image,尽量使用官方的 image
FROM scratch #制作 base imageFROM centos #使用base imageFROM ubuntu:18.04
LABEL 版本,描述等信息,类似注释信息
LABEL maintainer ="rao@gmail.com"LABEL version ="1.0"LABEL description =" 描述信息"
RUN 运行相关的命令,运行一个都会生成相应临时的 contaienr,建议合并多个命令为一个
RUN yum updage && yum install -y vim\ python-dev #反斜杠换行
WORKDIR 设置当前的工作目录,没有的话会自动创建test目录,用WORKDIR,不要使用 RUN cd,尽量使用绝对目录
WORKDIR /root
ADD and COPY 把本地的文件添加到 docker image里面,大部分情况下,copy优于add,add除了copy还有额外的功能(解压),添加远程文件/目录 请使用 curl 或者 wget
ADD hello / ADD test.tar.gz / #添加到根目录并解压WORKDIR /root ADD hello test/ #/root/test/helloWORKDIR /root COPY hello test/
ENV 设置常量,尽量使用env,增加可维护性
ENV MYSQL_VERSION 5.6 #设置常量RUN apt-get install -y mysql-server ="${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* #引用常量
docker file 的两种写法
两种格式
shell格式
RUN apt-get install -y vim CMD echo "hello docker"ENTRYPOINT echo "hello docker"
exec格式
RUN ["apt-get", "install", "-y", "vim"] CMD ["/bin/echo", "hello docker"] ENTRYPOINT ["/bin/echo", "hello docker"] #变量替换可能出现问题#修改如下ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]
RUN 和 CMD 和 ENTRYPOINT
CMD
设置容器启动后默认执行的命令和参数
如果docker run 制定了其它的命令,cmd命令将被忽略
如果定义了多个 cmd,只有最后一个会执行
ENTRYPOINT 设置容器启动时运行的命令
让容器以应用程序或者服务的形式运行
不会被忽略,一定会执行
示例:
COPY docker-test.sh /usr/local/bin/ ENTRYPOINT ["deocker-test.sh"] EXPOSE 27017 CMD["mongod"]
RUN 执行命令并创建新的 Image Layer
镜像的发布
#登录,输入用户名,密码docker login# push image 到 docker hubdocker push imageName:latest#登录 docker hub 查看# 拉取 imagedocker pull imageName
搭建自己的registry docker hub
文档地址:https://hub.docker.com/_/registry/
docker run -d -p 5000:5000 --restart always --name registry registry:2#验证访问某个端口telnet ip:port# /etc/docker 创建 daemon.json 文件,因为在提交的时候,会有安全警告。 { "insecure-registries":["ip:port"] }#编辑 docker 启动文件 /lib/systemd/system/docker.service,添加内容 EnvirementFile = /etc/docker/daemon.json#重启docker服务sudo service docker restart#push到私有仓库 docker hub#如果让查看自己的docker hub docker提供了api的方式,查看,地址: https://docs.docker.com/registry/spec/api/#listing-repositories
Docker部署flask-demo
app.py 程序 demo
from flask import Flask app = Flask(__name__)@app.route('/')def hello(): return "hello docker"if __name__=='__main__' app.run()
创建docker file
FROM python2.7LABEL "maintainer= rao@demo.com"RUN pip install flask COPY app.py /app/ WORKDIR /app EXPOSE 5000CMD ["python", "app.py"]
构造 image 并运行
#构造 docker imagedocker build -t rao-flask-demo .#创建 container, -d后台方式运行docker run -d rao-flask-demo#查看docker ps#进入运行中的容器docker exec -it containerId /bin/bash#退出容器exit#打印运行中容器中ip地址docker exec -it containerId ip a#停止容器docker stop containerId#启动容器docker start containerId#清理退出的容器docker rm $(docker ps -aq)#指定名字启动containerdocker run -d --name=rao imageName#显示container详细的信息docker inspect containerId#查看日志docker logs containerId
创建容器的时,配置参数示例,以 stress为例
docker run -it ubuntu# 压力测试工具apt-get update && apt-get install -y stress stress --vm 1 --vm-bytes 500M --verbose
在创建容器的时候输入参数示例,dockerfile写法
FORM ubuntu RUN apt-get update && apt-get install -y stress ENTRYPOINT ["/usr/bin/stress"]CMD []
运行
docker run ImageName --vm 1 --verbose --vm-bytes 500M #(stress相关的参数)
配置资源限制
#内存大小,cpu权重(所有容器的百分比)docker run --memory=200M --cpu-shares=2 imageName
作者:andpy
链接:https://www.jianshu.com/p/5a52121e18a3