继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Docker容器和镜像 二

蓝山帝景
关注TA
已关注
手记 439
粉丝 46
获赞 150

Docker Platform

Docker提供了一个开发,打包,运行app的平台;把app和底层 infrastructure 隔离开发

  • Application

  • Docker Engine

  • Infrastructure(physical/virtual)

图示:


webp

docker平台-03.png

Docker Engine

  • 后台进程( dockerd )

  • REST API Server

  • CLI接口(docker)

图示:


webp

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


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP