Docker容器和镜像 二

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容