您的位置:首页 > 运维架构 > Docker

Docker简要教程

2015-09-05 12:28 691 查看

1. 镜像

1.查看本地镜像:
docker images

2.修改镜像

sudo docker commit -m "备注信息" -a "作者信息"  容器ID  仓库名和Tag信息


3.创建镜像(使用Dockerfile)

Dockerfile包含了基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,使用#来注释。

FROM 指令告诉 Docker 使用哪个镜像作为基础

接着是维护者的信息

RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件

ADD 命令复制本地文件到镜像;

用 EXPOSE 命令来向外部开放端口;

用 CMD 命令来描述容器启动后运行的程序等

构建命令:
docker build -t="tag信息" .


“.”表示当前目录下寻找Dockerfile文件,注意一个镜像不能超过 127 层

tag信息可以包含两部分信息,即:REPOSITORY:Tag。可以通知指定REPOSITORY的名称和Tag信息,中间使用冒号分隔。若不指定,默认为REPOSITORY的名字,Tag默认使用latest.

4.存出和载入镜像

sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
//导出镜像

sudo docker load < ubuntu_14.04.tar
//载入镜像

5.删除镜像

docker rmi 镜像ID或名字:Tag信息


2. 容器

1、启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

新建并启动

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]


示例:
docker run ubuntu:latest /bin/echo "HelloDocker"
//打印HelloDocker

docker run -it ubuntu:latest /bin/bash
//使用交互模式启动一个容器

sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
//以守护模式运行

注意:docker -P(大写)会随机映射可用端口到容器,docker -p(小写) 5000:5000 映射指定端口。 可使用
docker port <container>
查看容器端口映射

启动关闭的容器

docker start 容器名字/容器ID


2.关闭容器

docker stop 容器名字/容器ID


3.进入容器

docker attach 容器名字/容器ID


4.导出/导入容器

导出:
docker export 7691a814370e > ubuntu.tar


导入为镜像:
docker import http://example.com/exampleimage.tgz example/imagerepo
或者
cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0


5.删除镜像

docker rm 容器名字/容器ID


3.docker registry

docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库.

1.安装docker registry

首先拉取registry镜像,
docker pull registry
.官网的速度一般会比较慢,国内有几个docker镜像网站,一个是阿里云(参看http://help.aliyun.com/knowledge_detail.htm?knowledgeId=5974865),一个是dockerpool(地址:http://dockerpool.com/downloads

比如我们使用dockerpool来下载registry镜像, docker pull dl.dockerpool.com:5000/registry. 当我们在执行下载不是官网的镜像,可能会遇到证书错误。此时需要在docker的配置文件添加对应仓库地址的配置。

Ubuntu 系统的配置文件是 /etc/default/docker,Centos 系统的配置文件放在 /etc/sysconfig/docker。 打开配置文件,添加或修改如下配置:

DOCKER_OPTS="--insecure-registry dl.dockerpool.com:5000"
//添加仓库地址,

如果是阿里云,则添加:
--insecure-registry registry.mirrors.aliyuncs.com


2.启动registry,sudo docker run -d -p 5000:5000 registry, 在5000端口启动registry监听服务。

启动参数项有如下:

$ sudo docker run \
-e STORAGE_PATH=/registry \
-p 5000:5000 \
registry


默认情况,Storage_path 为/tmp/registry,我们可以通过-v将其映射到宿主机上。如:sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

3.在私有仓库管理镜像

上传镜像: 首先使用docker tag命令,将镜像正确的命名,命名格式为:
docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
.

比如:
sudo docker tag ba58 127.0.0.1:5000/mysql
然后使用docker push命令推送镜像到仓库。

搜索镜像:
curl http://127.0.0.1:5000/v1/search[/code] 如果看到

{
"num_results": 1,
"query": "",
"results": [
{"description": "",
"name": "library/mysql"
}]
}


类似这样的结果,就表示镜像上传成功

下载镜像:
docker pull 127.0.0.1:5000/mysql


4.数据镜像

可以使用-v来映射宿主机的目录到docker容器中,也可以使用–volumes-from 挂载映射了宿主机的容器来映射,如:
docker run -d --volumes-from dbdata --name db1 training/postgres


5.容器互联

第一种方式:通过暴露端口给宿主机,然后通过宿主机的ip和端口映射来访问其他容器。

第二种方式:使用–link进行容器之间安全互联,如:
docker run --link mysql:db -it ubuntu:latest
//这里将mysql容器映射给新启动的容器,在容器中使用的名字为:db . 在新容器可以通过db这个主机名或者db主机名对应的ip(ping db)进行访问。

6.Dockerfile

FROM : : 基础镜像信息

MAINTAINER : 维护者信息

RUN 或 RUN [“executable”, “param1”, “param2”] : 前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”, “echo hello”]。 每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。

CMD : 支持三种格式

CMD [“executable”,”param1”,”param2”] 使用 exec 执行,推荐方式;

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

CMD [“param1”,”param2”] 提供给 ENTRYPOINT 的默认参数;

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。 如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令.

EXPOSE […] : 告诉docker容器暴露的端口

ENV : 设置环境变量

ADD : 复制文件,可以复制本地、url路径文件以及tar文件(自动解压)

COPY :复制文件,仅支持本地文件

ENTRYPOINT [“executable”, “param1”, “param2”] 或 ENTRYPOINT command param1 param2(shell中执行),ENTRYPOINT只能有一条生效,如果有多条,最后一条生效。配置容器启动后执行的命令,不会被容器启动的命令参数覆盖。

VOLUME [“/data”] : 创建一个可以从本地主机或其他容器挂载的挂载点,也可使用-v来挂载,比如docker run -v /data //docker会自动分配一个宿主机目录与容器中的/data映射,具体映射路径可以使用 docker inspect -f {{.Volumes}} 查看,返回示例:map[/data:/var/lib/docker/vfs/dir/9cc775458c9b1d350bff27e025087788862a4a7dffe6254f89948ac741df7a01],表示宿主机的/var/lib/docker/vfs/dir/9cc775458c9b1d350bff27e025087788862a4a7dffe6254f89948ac741df7a01目录与容器中的/data映射。 -v参数也可以指定映射的目录,比如:
docker run -v /tmp/data:/data <image>
表示映射宿主机的/tmp/data到容器的/data. inspect 的结果为:map[/data:/tmp/data]

_注意:_docker初始化完成才会将宿主机的目录挂载到容器的目录,因此原有的docker容器目录下的文件会被宿主机的目录覆盖(如果宿主机的目录为空,则会清空docker容器的该目录),如果是挂载类似配置文件目录等启动需要的文件时,应该在docker初始化后,通过命令拷贝到docker容器目录。

USER : 指定运行容器时的用户名或 UID

WORKDIR /path/to/workdir : 指定RUN、CMD、ENTRYPOINT命令配置工作目录,可有多个WORKDIR,如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd


则最终的工作目录为:/a/b/c

ONBUILD [INSTRUCTION] : 表示当前创建的镜像做为其他新镜像的基础镜像时,新镜像构造的时候会自动执行ONBUILD的指令。

4.一些命令

删除所有的已停止的容器:
docker rm $(docker ps -f status=exited -q)


关闭所有运行的容器:
docker stop $(docker ps -f status=up -q)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: