docker的常用命令 ]# yum -y install docker #安装docker ]# systemctl start docker #启动docker ]# docker search centos #网上搜索images ]# docker pull docker.io/centos #网上下载镜像 ]# docker images #列出本地镜像 、 ]# docker run -i -t centos /bin/bash #运行一个镜像 ]# docker ps -a #列出本机上所有的容器

需要root权限,不足的时候,报错

1. 容器的基本操作

启动容器(run命令)

实例: docker run --name web -p 9003:80 -p 9023:22 -d -v /src/webapp:/opt/webapp -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine

说明: -p (小写的)使用格式 ip:hostPort:containerPort
将本地的 9003 端口 映射到容器的端口 80x,查看用 docker port <容器名或ID> -v 将加载主机的/src/webapp目录到容器的/opt/webapp -d, --detach=false Detachedmode: run command in the background -i, --interactive=false Keep STDINopen even if not attached -t, --tty=false Allocate apseudo-TTY

]# docker run -d -i --name web -v /src/webapp:/opt/webapp docker.io/centos /bin/bash 2cf377fa8d0219678b95036ee1a28d2634c49ca30ff62f2896ad8e6ab5c0a37d ]# docker exec -i -t web /bin/bash

一个容器连接到另一个容器

docker run -it --name sonar -d --link mmysql:db tpires/sonar-server

sonar容器连接到mmysql容器,并将mmysql容器重命名为db。 这样,sonar容器就可以使用db的相关的环境变量了。

这样在 容器sonar 内 查看 /etc/hosts文件的时候,发现增加一条记录,映射主机名到一条IP地址。 这样在容器sona内,就可以直接解析db了。

进入容器(exec attach命令)

使用docker attach 使用SSH,不建议使用 使用nsenter 使用exec,使用较多

]# docker exec -it containerID /bin/bash

]# docker exec -it myTest /bin/sh

]# docker attach --sig-proxy=false containerID

删除所有容器(rm命令)

docker rm $(docker ps -a -q)

这个命令分两步, docker ps -a -q,以安静模式列出所有的容器,也就是只列出随机唯一名字(numericID) docker rm ,依次(循环)删除列表中的容器,删除正在运行的,会报错。 docker rm -f<容器名orID> ,强制删除

docker stop <容器名orID> docker start <容器名orID> docker restart <容器名orID> docker kill <容器名orID> docker ps -a #查看所有容器

还有三个与暂停相关的命令pause,unpause,wait

文件系统相关

docker diff <容器名or ID> 查看容器内文件的改变 docker cp 在容器和主机之间复制文件

统计相关

docker top <容器名or ID>显示容器内进程信息 docker stats <容器名or ID>显示容器内统计信息 docker port <容器名or ID> 显示容器与主机端口映射信息 docker inspect <容器名or ID>显示容器底层细节

其他

docker logs -f <容器名or ID> 查看运行日志 docker logs <容器名or ID> #获取容器的输出信息 docker rename <容器名> <新名字> 改名

容器的导入导出

docker export -o <文件名> <容器名orID> 导出文件到tar包 docker import 导入成为镜像 #docker export mos > testrun.tar #cat testrun.tar |docker import - test/cenosme

[root@localhost ~]# docker run -d -i --name mos docker.io/centos /bin/bash 41aa9eb50a97fb2c4ac6c29ca4a9d77cb673787ab5a3e13e6d3f82014b0e9b0b [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos latest ff426288ea90 5 days ago 207.2 MB [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 41aa9eb50a97 docker.io/centos "/bin/bash" 12 seconds ago Up 11 seconds mos [root@localhost ~]# docker export mos > testrun.tar [root@localhost ~]# ls anaconda-ks.cfg install_salt.sh testrun.tar zookeeper-3.3.6.tar.gz [root@localhost ~]# cat testrun.tar |docker import - test/cenosme sha256:2d6416e6c649f14728b1d3e9a1b73ad1181b80f7359c9fbacdd39b6263b390f2 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/cenosme latest 2d6416e6c649 7 seconds ago 207.2 MB docker.io/centos latest ff426288ea90 5 days ago 207.2 MB [root@localhost ~]#

2.镜像操作

删除所有镜像

docker rmi $(docker images -q) docker images -q 只列出了镜像的ID docker rmi 用于删除镜像

docker rmi $(docker images | grep none | awk '{print $3}' | sort -r) docker images | grep none | awk '{print$3}' | sort -r只列出untaggedimages,也就是镜像名字为<None>的,取出ID,降序排列

docker search <keywords> docker history <镜像名> docker commit <容器名or ID> <新镜像名> #保存对容器的修改 docker build <标签> <Docker-file路径>

构建镜像

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

  1. docker commit <容器名or ID> <新镜像名>

  2. cat ubuntu-xxx.tar.gz | docker import -ubuntu:14.04 ubuntu-xxx.tar.gz 是一个操作系统模板文件

  3. docker build -t <镜像名> <Dockerfile路径>

如Dockerfile在当前路径:docker build -t xx/gitlab .

镜像迁移

当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。

机器1:

docker save busybox > /home/save.tar

使用scp将save.tar拷到 机器2上,然后:

docker load < /home/save.tar

推拉镜像

一、安装Registry:

很简单,只需要运行一个Registry容器即可(包括下载镜像和启动容器、服务)

docker run -d -p 5000:5000 -v /data/registry:/var/lib/registry --name registry --restart=always registry

二、使用Registry

去除默认是需要https证书支持的.

修改/etc/docker/daemon.json文件

#vi /etc/docker/daemon.json { "insecure-registries":["192.168.1.100:5000"] } #systemctl daemon-reload #systemctl restart docker 注:<ip>:Registry的机器ip地址,在安装registry的节点和客户端需要访问私有Registry的节点都需要执行此步操作。 三、通过 docker tag重命名镜像,使之与registry匹配

docker tag inits/nginx1.8 192.168.1.100:5000/nginx1.8:latest 四、上传镜像到Registry

docker push 192.168.1.100:5000/nginx1.8:latest 五、查看Registry中所有镜像信息

curl http://192.168.1.100:5000/v2/_catalog 返回: {"repositories":["centos6.8","jenkins1.638","nginx","redis3.0","source2.0.3","zkdubbo"]}

六、其他Docker服务器下载镜像 需要先设置 #vi /etc/docker/daemon.json { "insecure-registries":["192.168.1.100:5000"] } #systemctl daemon-reload #systemctl restart docker

docker pull 192.168.1.100:5000/nginx1.8:latest

七、启动镜像

docker run -it <ip>:5000/nginx1.8:latest /bin/bash

Dockerfile 命令

Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。

ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

# Usage: ADD [source directory or URL] [destination directory] ADD /my_app_folder /my_app_folder CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

# Usage 1: CMD application "argument", "argument", .. CMD "echo" "Hello docker!" ENTRYPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

# Usage: ENTRYPOINT application "argument", "argument", .. # Remember: arguments are optional. They can be provided by CMD # or during the creation of a container. ENTRYPOINT echo # Usage example with CMD: # Arguments set with CMD can be overridden during run CMD "Hello docker!" ENTRYPOINT echo ENV

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

# Usage: ENV key value ENV SERVER_WORKS 4

EXPOSE

EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

# Usage: EXPOSE [port] EXPOSE 8080 FROM

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

# Usage: FROM [image name] FROM ubuntu MAINTAINER

我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

# Usage: MAINTAINER [name] MAINTAINER authors_name RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

# Usage: RUN [command] RUN aptitude install -y riak USER

USER命令用于设置运行容器的UID。

# Usage: USER [UID] USER 751 VOLUME

VOLUME命令用于让你的容器访问宿主机上的目录。

# Usage: VOLUME ["/dir_1", "/dir_2" ..] VOLUME ["/my_files"] WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

# Usage: WORKDIR /path WORKDIR ~/ 如何使用Dockerfiles

使用Dockerfiles和手工使用Docker Daemon运行命令一样简单。脚本运行后输出为新的镜像ID。

# Build an image using the Dockerfile at current location # Example: sudo docker build -t [name] .