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命令相关
#查看 docker
docker version
#查看docker image
docker image -a ls
#拉取官方 hello-world
docker pull hello-world
#查看 docker image
docker 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 .
#查看 image
docker 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
# 列出所有的 image
docker images
#移除image
docker image rm id
#查看容器
docker ps -a
#列出所有容器 id
docker container ls -aq
#移除容器
docker rm id
构建 Docker image
#移除docker image
docker image rm id
#基于一个contaienr创建一个 image
docker 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构造 image
docker build -t newImageName .
注意:因为image时只可读的,所以在构建的过程中,临时创建了一个临时的 container,来构造最终的 image
#查看dockerfile
more dockefile
Docker File介绍
FROM 最开始的语法,在那个base image之上制作 image,尽量使用官方的 image
FROM scratch #制作 base image
FROM centos #使用base image
FROM 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/hello
WORKDIR /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 hub
docker push imageName:latest
#登录 docker hub 查看
# 拉取 image
docker 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.7
LABEL "maintainer= rao@demo.com"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python", "app.py"]
构造 image 并运行
#构造 docker image
docker 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)
#指定名字启动container
docker 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
网友评论