Docker容器和镜像 二

Docker Platform

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

  • Application
  • Docker Engine
  • Infrastructure(physical/virtual)

图示:


Docker容器和镜像 二_第1张图片
docker平台-03.png

Docker Engine

  • 后台进程( dockerd )
  • REST API Server
  • CLI接口(docker)

图示:


Docker容器和镜像 二_第2张图片
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
    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 ="[email protected]"
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= [email protected]"
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

你可能感兴趣的:(Docker容器和镜像 二)