一些零散的Docker基础整理

Published: 2016-02-08

Tags: Docker

本文总阅读量
  1. 加速Docker镜像下载速度

  2. Docker Hub基于Github的自动构建

  3. 快速构建55の上网环境

  4. CMD与ENTRYPOINT


1. 加速Docker镜像下载速度

国内下载Docker Hub的镜像很慢,有时直接无法下载成功,所以,有必要进行加速,daocloud.io它们家提供免费的镜像加速服务,还是蛮良心的,他们的加速服务有两个版本,一个是2.0,一个是1.0,2.0是从他们那里下载经过定制的Docker程序,安装主机监控程序,如果只是想加速下载,用1.0版本就好,简单粗暴的修改下配置文件的设置就可以

Ubuntu的Docker配置文件地址为:/etc/default/docker,字段:DOCKER_OPTS

Centos/Fedora的配置文件地址为:/etc/sysconfig/docker,字段:OPTIONS

追加--registry-mirror=http://xxxxxxxx.m.daocloud.io到如上的字段中。

重启docker,配置文件就生效了。不过经过几天的学习,我觉得刚接触Docker想学习还是使用国外VPS方便,方便控制变量,排除不必要的错误

一个不错的学习Docker的在线文档:Docker —— 从入门到实践

2. Docker Hub基于Github的自动构建

这个东西还是蛮方便的,维护一个Dockerfile,然后每次更新,Docker Hub都会自己构建镜像。

1,首先在Github上创建一个项目,将Dockerfile放置在根目录下

2,注册并登陆Docker Hub,又上角 “Create - Create Automated Build”,关联Github账号

3,选择刚刚创建的Github仓库就可以了,提交后不是时实构建的,会有一定的排队时间,等一会再一刷新就可以看到构建完成

3. 快速构建上网环境

这里以Fedora为例,炒鸡简单

dnf install docker
docker run -d -p 1984:1984 oddrationale/docker-shadowsocks -s 0.0.0.0 -p 1984 -k $SSPASSWORD -m aes-256-cfb

OK! 这个部署的太方便了...-d是告诉docker在后台运行这个实例,-p是绑定容器内服务的端口到物理机的端口,oddrationale/docker-shadowsocks是一个已经构建好的Docker 55镜像,了解更多请看文末参考,接下来后边的各种参数都是传递给容器内部的,下文有解释,把$PASSWORD换成你想使用的密码,-p 后的1984就是远程VPS开启的监听的端口号

4. CMD与ENTRYPOINT

上边oddrationale提供Docker 55的Github地址为:https://github.com/oddrationale/docker-shadowsocks

Dockerfile文件内容:

# shadowsocks
#
# VERSION 0.0.3

FROM ubuntu:14.04.3
MAINTAINER Dariel Dato-on <oddrationale@gmail.com>

RUN apt-get update && \
    apt-get install -y python-pip
RUN pip install shadowsocks==2.8.2

# Configure container to run as an executable
ENTRYPOINT ["/usr/local/bin/ssserver"]

很简单的一个Dockerfile,FROM指定基于的镜像,MAINTAINER指明作者信息,RUN在创建镜像的时候执行,通过pip安装55,安装55后将在/usr/local/bin目录下会有一个ssserver程序,这就是服务端

Dockerfile中有两个命令是在运行实例的时候运行命令的

如果Dockerfile存在ENTRYPOINT命令,那么在docker run的时候,镜像后边的内容都会被当作是参数,如上边的-s 0.0.0.0 -p 1984 -k $SSPASSWORD -m aes-256-cfb都是传递给ssserver的

CMD与ENTRYPOINT都只能在Dockerfile中出现一次,不同的是CMD会被docker run的时候指定的参数给覆盖,而ENTRYPOINT则不会被覆盖

CMD与ENTRYPOINT的参数

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

如上的第一个是单独使用CMD时的推荐写法,第二个是与ENTRYPOINT一起使用时为ENTRYPOINT提供参数的写法,第三个会被翻译成这样/bin/sh command param1 param2,一不留神就会出错,如果要使用sh来执行,那么可以这样写CMD ["/bin/sh", "-c", "command", "param1", "param2"]

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

同样,ENTRYPOINT的第一种写法是建议的写法,第二种和CMD的同理

CMD与ENTRYPOINT协同工作

这两个可以一起工作的很好,举个栗子

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

使用不带参数的命令运行

docker run -it --rm --name test

那么top的参数就为-b -c,如果使用如下指定参数的方式运行

docker run -it --rm --name test -H

那么top的参数为-b -H,这是因为ENTRYPOINT不会被覆盖,CMD会被覆盖。也就是说,在写Dockerfile的时候,不变的参数写在ENTRYPOINT的参数列表,默认但可通过运行时改变的参数可以写在CMD后边,如果一定要运行时指定的参数,那么就不需要写了。

参考: