1. 安装

ubuntu 14.04 or later

sudo apt-get update
sudo apt-get install -y docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

or通过官方源安装最新版本

2. 获取镜像

从网络上获取镜像,如果TAG未指定,则默认为latest标签。

docker pull NAME[:TAG]
docker run -it ubuntu /bin/bash 进入容器

3. 查看本机镜像信息

docker images

通过docker tag命令添加新的标签。
使用docker inspect命令获取镜像详细信息。

4. 搜索镜像

docker search TERM

5. 删除镜像

docker rmi IMAGE [IMAGE...]

IMAGE可以为标签或者ID。
当某个镜像有多标签时,通过标签删除时只是删除了指定的标签,docker依然存在。

6. 创建镜像

三种方法:基于已有镜像的容器创建、基于本地模板导入、基于DockerFile创建。

基于已有镜像的容器创建

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

-a 作者信息
-m 提交消息
-p 提交时暂停容器运行

基于本地模板导入

暂无

基于DockerFile

DockerFile 分为四部分:基础镜像信息,维护者信息,镜像操作指令、镜像启动时执行指令

FROM ubuntu

MAINTAINER docker_user docker_user@eamil.com

RUN echo 'hello docker'
RUN apt-get update
RUN apt-get install -y nginx

CMD /usr/sbin/nginx

指令:

  • FROM
    FROM <image>FROM <image>:<tag>

  • MAINTAINER
    MAINTAINER <name>

  • RUN
    RUN COMMANDRUN ["executable", "param1", "param2"]
    前者为/bin/sh -c,后者使用exec执行,例如["/bin/bash", "-c", "echo hello"]

  • CMD
    指定启动容器时的命令,三种格式

  • CMD ["executable", "param1", "param2"],推荐方式

  • CMD COMMAND param1 param2,在/bin/sh执行

  • CMD ["param1", "param2"],提供给ENTRYPOINT的默认参数

  • EXPOSE
    暴露container的端口给主机。
    EXPOSE <port> [<port>...]

  • ENV
    指定一个环境变量,格式:ENV <key> <value>

  • ADD
    复制指定的<src>到容器中的<dest><src>可以是Dockerfile所在目录的一个相对路径,也可以是URL,也可以是一个tar文件。
    ADD <src> <dest>

  • COPY
    COPY <src> <dest>,复制本地的src到容器中dest。

  • ENTRYPOINT
    配置容器启动后执行的命令,不可被docker run提供的参数覆盖。每个dockerfile只能有一个ENTRYPOINT,如果指定多个,只有最后一个生效。
    ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1, param2

  • VOLUME
    VOLUME ["/data"]

  • USER
    USER daemon
    指定运行容器的用户名或UID,后续的RUN使用指定的用户。

  • WORKDIR
    WORKDIR /path/to/workdir
    为后续的RUN,CMD,ENTRYPOINT指令配置工作目录。
    可以使用多个WORKDIR指令,如果后续的是相对路径,则会基于之前命令指定的路径。

  • ONBUILD
    ONBUILD [INSTRUCTION]
    配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。

7. 数据管理

数据卷、数据卷容器

数据卷

挂载主机目录作为数据卷

docker run -v HOST-PATH:CONTAINER-PATH[:PERMISSION]
docker run -v /tmp:/mnt/tmp:ro
ro表示read only,不加的情况默认为rw

挂载主机文件作为数据卷

docker run -v ~/.bash_history:.bash_history

数据卷容器

数据卷容器就是一个普通的容器

# 创建一个数据卷容器dbdata
docker run -it -v /dbdata --name dbdata ubuntu
# 创建db1和db2两个容器,并从dbdata容器挂载数据卷
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu

8. 网络基础配置

端口映射实现访问容器

# -P参数随机映射一个49000~49900的端口至容器内部开放的网络端口
docker run -P 
# 用docker port查看端口映射情况。
# -p指定映射端口,一个指定端口上只能绑定一个容器
docker run -p ip:hostPort:containerPort
# 将容器内的5000端口映射到主机的9000端口
docker run -p 9000:5000
# 映射到指定地址的任意端口,主机会自动分配端口对应到container中的端口
docker run -p 127.0.0.1::5000
# 可以使用udp选项标记udp端口
docker run -p 127.0.0.1:5000:5000/udp

容器互联实现容器间通信

# 创建一个新的数据库容器
docker run --name db training/postgres
# 创建新的web容器,并连接到db容器
docker run -d -P --name web --link db:db training/webapp
# --link的格式为--link name:alias,name是要连接容器的名称,alias是这个连接的别名