Docker 镜像和容器

Centos

1
2
3
4
5
# 如果出现: See 'docker run --help'
# 原因是 docker 没有启动
sudo service docker start
# or
sudo docker version

创建一个基础的 Docker image

  • 创建文件夹,以及安装编译库
1
2
3
4
# install 编译 c 程序的 gcc ...
sudo yum install gcc glibc-static
mkdir hello-world
cd hello-world && vim hello.c
1
2
3
4
5
6
// hello.c
#include<stdio.h>
int main()
{
printf("hello docker\n");
}
1
2
# build
gcc -static hello.c -o hello
  • 简单的 Dockerfile
1
2
3
4
# vim Dockerfile
FROM scratch
ADD hello /
CMD ["/hello"]
1
2
3
4
5
# docker build
docker build -t cvno/hello-world .
docker run cvno/hello-world
# 看 image 层
docker history d8**
1
2
3
4
5
# 列出 docker 所有的 container
docker container ls -aq
docker rm $(docker container ls -sq)
# 删除状态为退出的 container
docker rm $(docker container ls -f "status=exited" -q)

构建一个 Docker 镜像

根据已有的image创建一个新的image,不提倡,创建image的过程不透明

1
2
3
4
5
6
docker run -it centos
yum install -y vim && exit
docker container ls -a
# 构建成为一个新的 image
# docker commit <container name> <account id>/<new image name>
docker commit upbeat_minsky cvno/centos-vim

Dockerfile 语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM
LABEL maintainer=""
LABEL version=""
LABEL description=""
RUN yum install -y vim \
rm -rf /var/lib/apt/lists/* # 清理了 cache
WORKDIR # 同 linux cd
ADD # *.tar.gz 会自动解压
COPY
ENV
VOLUME
EXPOSE
CMD # 多个会被覆盖掉
ENTRYPOINT # 它一定会执行
# shell exec 两种语法
1
2
3
4
5
WORKDIR /root   # 没有会自动创建
ADD hello test/ # /root/test/hello
ENV MYSQL_VERSION 5.6 # 设置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}"\
&& rm -rf /var/lib/apt/lists/* # 引用常量
  • CMD/ENTRYPOINT
1
2
3
4
FROM centos
ENV name Docker
# exec
ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]

Docker debug

1
docker run -it <build 镜像的临时 container> /bin/bash

Example

1
2
3
4
5
6
7
# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello()
return "hello docker"
1
2
3
4
5
6
7
FROM python:2.7
LABEL maintainer="example@example.com"
RUN pip install flask
COPY app.py /app/app
WORKDIR /app
EXPOSE 5000
CMD ["python", "app.py"]
1
2
# build
docker build -t demo/flask-hello-docker

exec

1
2
3
4
5
6
# 进入容器
docker exec -it <container id> /bin/bash
docker exec -it <container id> python
docker rm $(docker ps -aq) # 删除所有的 container
# 查看容器的详细信息
docker inspect

Docker Hub

通过Docker Hub来自动构建镜像,推荐使用这种方式

上传image

  • 登录Docker帐号docker login
  • docker push cvno/hello-world:latest

私有 registry

内部或者个人使用

服务器需要安装,并且5000这个端口可以进行通信

1
2
3
4
5
6
docker run -d -p 5000:5000 --restart always --name registry registry:2
# 测试通信
sudo yum install -y telnet # clenit
sudo yum install -t telnet-server # server
# 是否安装 telnet
rpm -qa telnet-server
1
2
3
4
5
6
7
8
9
10
# 客户机
sudo ls /etc/dcoker # 修改 docker 配置文件
sudo vi /etc/docker/daemon.json
# {"insecure-registeries":["11.11.11.11:5000"]}
sudo vi /lib/systemd/system/docker.service
# ExecStart=/usr/bin/dockerd
# EnvironmentFile=-/etc/docker/daemon.json # add
sudo systemctl daemon-reload / sudo service docker restart
# push
docker push 35.196.188.123:5000/hello-world
1
2
3
# 服务端验证是否成功 push
# docker registry api
ip:5000/v2/_catalog

stress

一个压力测试的dockerimagebuild一个命令行的程序

1
apt-get install stress
1
2
3
4
FROM ubuntu
RUN apt-get update && apt-get install stress
ENTRYPOINT ["/usr/bin/stress"]
CMD []

资源限制

1
2
3
4
5
6
7
docker run --memory=200M cvno/ubuntu-stress --vm 1
# 详细的 debug 信息
docker run --memory=200M cvno/ubuntu-stress --vm 1 --verbose
docker run --memory=200M cvno/ubuntu-stress --vm 1 --verbose --vm-bytes500M
# cpu
docker run --cpu-shares=10 --name=test1 cvno/ubuntu-stress --cpu 1
docker run --cpu-shares=5 --name=test2 cvno/ubuntu-stress --cpu 1