目标
名词
- CLI - command-line interface,命令行界面
- Rest API -
- 内核空间 -
- 用户空间 -
- Linux Kernel -
常用命令
命令 | 说明 |
---|---|
Image | |
# docker image ls |
列出本地image |
# docker pull ubuntu:14.04 |
从docker hub拉取ubuntu:14.04 |
# docker build -t ccsgao/hello-world . |
通过当前目录下的docker file构建一个image |
# docker history acca11e86101 |
查看image的分层 |
# docker container rm b2bf98 |
删除某个container |
# docker container commit centos ccsgao/centos-vim |
container Build 一个image |
# docker login |
:- |
# docker push |
push an image or a repository to a registry |
# docker run hello-world |
通过image hello-world启动一个container |
# docker run -it centos bin/bash |
交互式运行 |
# docker run -d ccsgao/flask-hello-world |
后台运行 |
# docker run -d -name=demo ccsgao/flask-hello-world |
后台运行,且指定name=demo |
container | :- |
# docker container ls |
列出当前正在运行的container |
# docker container ls -a |
列出所有container,包括已经退出的 |
# docker container ls -aq |
-all quiet,只显示id |
# docker rm #(docker container ls -aq) |
列出所有container,包括已经退出的 |
# docker ps -a |
list containers |
# docker exec -it d616949073b0 /bin/bash |
进入container内部 |
# docker stop 11a767d |
停止某个container |
# docker start 11a767d |
启动某个container |
# docker inspect 11a767d |
检查,return low-level info on dk object |
# docker logs 11a767d |
fetch the logs of a container |
1 Docker架构与底层技术
Docker Platform
- Docker提供了一个开发、打包、运行App的平台
- 把App和顶层infrastructure隔离开
application |
---|
Docker Engine |
infrastructure(physical/virtual) |
Docker Engine
- 后台进程 docker daemon
- Rest API Server
- CLI接口(接口)
Docker Architecture
底层技术支持
2 Docker Image概述
什么是Image
Image的获取
3 使用Docker File DIY 一个BaseImage
- 编写C语言小程序 hello docker
- 编译
- 编写Docker file
- 构建image
- 运行
4 什么是Container
- 体会container是通过image创建的
- 体会container是可读写的
5 构建自己的Docker镜像
- 不提倡直接用container commit 来创建 image
- 提倡使用 docker file 来 build 一个 image
- Image内部使用临时container来commit
6 Dockerfile 语法梳理及最佳实践
参考资料
- Dockerfile reference
- docke-library
尽量使用官方Image作为Base Image
Metadata不可少,Label类似代码的注释
每条Run都会生成新的一层,使用 && \ 合并
Workdir,类似CD;绝对目录更清晰,不易出错
Add&Copy 将本地文件添加到image中
Env,设定环境变量,尽量使用Env增加可维护性
EXPOSE
7 run vs cmd vs entrypoint
shell和exec格式的优劣对比
shell = 就像在终端敲指令,exec = 特定格式,区分命令和参数
entrypoint使用的较多
Dockerfile
FROM centos
ENV name Docker
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["/bin/bash","docker-entrypoint.sh"]
docker-entrypoint.sh
echo "hello $name"
$ docker build -t xxx/entrypoint-sh .
$ docker run xxx/entrypoint-sh
8 镜像发布Docker Hub【Pending】
9 Dockerfile 实战
- 创建Dockerfile
$ vim Dockerfile
FROM python:2.7
LABEL maintainer = "ccsgao<ccsgao@qq.com>"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python","app.py"]
- 准备程序
$vim app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "hello docker"
if __name__ == '__main__'
app.run()
- 构建image并运行
# docker build -t ccsgao/flask-hello-world .
# docker run -d ccsgao/flask-hello-world
10 容器的操作 【合并至常用命令】
11 dockerfile实战2
# yum install -y stress
# stress --help
# stress --vm 1 --verbose #分配1个worker(默认占内存256M),并打印详情
# stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s #官方示例
推荐用法示例
- ENTRYPOINT 执行命令
- CMD 接收命令行参数
# FROM ubuntu
# RUN apt-get update && apt-get install -y stress
# ENTRYPOINT ["/usr/bin/stress"]
# CMD []
- 未解决的问题:
12 容器的资源限制【Pending】
未解决的问题
- 第11章试验失败,docker centos不能联网安装stress
Failed to download metadata for repo 'AppStream'