
Docker镜像
- 文件和meta data的集合(root filesystem);
- 分层:每层可以添加改边删除文件,成为一个新的image;
- 不同的image可以共享相同的layer;
- image本身是read-only的。
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容器
- 通过Image创建(Copy)
- 在Image layer之上建立一个Container layer(可读写)
- 类比面向对象:类和实例
- Image负责App的存储和分发,Container负责运行App
- 默认运行完即退出,可指定交互式运行
基本操作
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
- 让容器以应用程序或者服务的形式运行
- 不会被忽略,必须执行
- 建议以一个Shell脚本作为ENTRYPOINT
CMD
- 设置容器启动后默认执行的命令和参数
- 如果docker run指定了其它命令则CMD会被忽略
- 如果定义了多个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”选项
网友评论