Docker 体验及总结(2) - 镜像和容器

2018-08-22  本文已影响6人  千反田爱瑠爱好者
https://www.docker.com/

Docker镜像

docker version
docker images

创建

通过Dockerfile创建

more Dockerfile
    FROM ...
    LABEL ...
    RUN ...
    EXPOSE ...
    ENTRYPOINT [...]

docker build -t ywh/redis:latest .

实例:

yum install glibc-static gcc

mkdir hello-world
vim hello.c
    #include<stdio.h>
    int main()
    {
       printf("hello docker\n");
    }
gcc -static hello.c -o hello

vim Dockerfile
    FROM scratch        
    LABEL version="1.0" 
    ADD hello /         
    WORKDIR /           
    ENV cmd "/hello"    
    CMD ["${cmd}"]      

docker build -t dockerhub_id/hello-world .
docker image ls
docker history docker_id

docker run dockerhub_id/hello-world

从Registry拉取(Docker Hub)

docker pull [username/]ubuntu:14.04

从Container打包(不推荐)

docker commit container_name image_name

发布

Docker Hub:https://hub.docker.com/

直接发布

docker login
docker push ywh/hello-world:latest      # 默认发布到Docker Hub

发布Dockerfile

与GitHub仓库关联,把Dockerfile提交到仓库,由Docker Hub服务器建立Image

搭建私有Docker Hub

Server:

docker run -d -p 5000:5000 --restart always --name registry registry:2
curl localhost:5000/v2/_catalog

Client:

vim /etc/docker/daemion.json
    {"insecure-registries": ["localhost:5000"]}
vim /lib/systemd/system/docker.service
    EnvironmentFile=-/etc/docker/daemion.json
service docker restart
docker build -t localhsot:5000/hello-world .

docker push localhsot:5000/hello-world
docker pull localhsot:5000/hello-world

Docker容器

基本操作

docker run centos
docker container ls -a
docker rm xxx
docker rm $(docker container ls -f "status=exited" -q)     # 批量清理container

docker run -it image_id /bin/bash    # 以shell方式进入docker操作
docker run --name centos-demo -it centos

docker start xxx
docker ps           # 查看运行中的Container
docker exec -it container_id /bin/bash       # 对Container执行命令

docker inspect      # 查看Container详细信息
docker commit       # 把Container重新打包成Image

Dockerfile

RUN:执行命令并创建新的Image Layer

ENTRYPOINT

CMD

Shell格式

RUN apt-get install -y vim
CMD echo "hello docker"
ENV name Docker
ENTRYPOINT echo "hello $name"

Exec格式

RUN ["apt-get", "install", "-y", "vim"]
CMD [ "/bin/echo", "hello docker"]
ENV name Docker
ENTRYPOINT ["/bin/bash", "-c", "/bin/echo hello $name"]

Dockerfile

FROM scratch        # 镜像名称(无依赖)
LABEL version="1.0" # 镜像注释(meta data)
ADD hello /         # 添加文件到镜像中(压缩包会自动解压,也可以使用COPY,更推荐使用ADD)
WORKDIR /           # 指定工作目录(使用绝对路径)
ENV cmd "/hello"    # 添加环境变量(增加程序可维护性)
CMD ["${cmd}"]      # 启动时执行的命令
EXPOSE 5000         # 对外暴露5000端口

部署Container

docker run -it ubuntu 
    apt-get update && apt-get install -y stress
    stress --vm 1 --vm-bytes 5000000M --verbose

vim Dockerfile
    FROM ubuntu
    RUN apt-get update && apt-get install -y stress
    ENTRYPOINT ["/usr/bin/stress"]
    CMD []                      # 作为ENTRYPOINT的参数、在docker run时传入

docker build -t dockerhub_id/stress .
docker run -it dockerhub_id/stress --vm 1

实例:部署一个Flask Web应用

app.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "hello docker"
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)

Dockerfile

FROM python:2.7
LABEL maintainer="ywh<yipwinghong0401@gmail.com>"
RUN pip install flask
COPY app.py /app/    # 注意复制文件到目录最后要加上“/”
WORKDIR /app
EXPOSE 5000
CMD ["python", "app.py"]

部署

docker build -t ywh/flask-hello-world
docker image ls
docker run ywh/falsk-hello-world    # 后台运行加上“-d”选项
上一篇 下一篇

猜你喜欢

热点阅读