Docker 学习笔记
获取镜像$ docker pull ubuntu:12.04
相当于$ docker pull registry.hub.docker.com/ubuntu:12.04
运行 bash$ docker run -t -i ubuntu:12.04 /bin/bash
显示本地已有的镜像$ docker images
利用Dockerfile生成镜像$ docker build -t="user/name:tag" .
*注意一个镜像不能超过 127 层
可以利用 ADD 命令复制本地文件到镜像;用 EXPOSE 命令来向外部开放端口;用 CMD 命令来描述容器启动后运行的程序
# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
修改镜像的标签$ docker tag 5db5f8471261 ouruser/sinatra:devel
从本地文件系统导入
可以使用 openvz(容器虚拟化的先锋技术)的模板来创建
openvz 的模板下载地址为 http://openvz.org/Download/templates/precreated$ cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
上传镜像$ docker push
存出镜像
导出镜像到本地文件$ docker save -o ubuntu_14.04.tar ubuntu:14.04
载入镜像
从导出的本地文件中再导入到本地镜像库$ docker load --input ubuntu_14.04.tar
$ docker load < ubuntu_14.04.tar
移除本地镜像
*注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。$ docker rmi
启动容器$ docker run ubuntu:14.04 /bin/echo 'Hello world'
启动一个 bash 终端,允许用户进行交互$ docker run -t -i ubuntu:14.04 /bin/bash
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开
将一个已经终止的容器启动运行$ docker start CONTAINER_NAME
终止一个运行中的容器docker stop CONTAINER_NAME
让 Docker 容器在后台以守护态(Daemonized)形式运行,添加 -d 参数$ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
查看容器信息$ docker ps
获取容器的输出信息$ docker logs CONTAINER_NAME
重新启动容器$ docker restart
attach 命令$ docker run -idt ubuntu
$ docker attach CONTAINER_NAME
当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了
nsenter 命令
安装最新版本的 util-linux(2.24)版
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24
$ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin
$ docker run -idt ubuntu:14.04
6bd4461bbe6dc37f6e745f26391b00e5fbc5341ddea8a466a7fcbec262c7cee2
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bd4461bbe6d ubuntu:14.04 /bin/bash 19 seconds ago Up 18 seconds sleepy_euclid
$ PID=$(docker-pid 6bd4461bbe6d)
13517
$ nsenter --target 13517 --mount --uts --ipc --net --pid
root@6bd4461bbe6d:/#
自定义docker命令,放到 .bashrc 中:
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
例如 docker-pid 可以获取某个容器的 PID;而 docker-enter 可以进入容器或直接在容器内执行命令。
$ echo $(docker-pid 6bd4461bbe6d)
$ docker-enter 6bd4461bbe6dls
导出和导入容器$ docker export 6bd4461bbe6d > ubuntu.tar
导入容器快照
从容器快照文件中再导入为镜像$ cat ubuntu.tar | sudo docker import - test/buntu:v1.0
也可以通过指定 URL 或者某个目录来导入$ docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器$ docker rm CONTAINER_NAME
如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器
查找官方仓库中的镜像$ docker search
-s N 参数可以指定仅显示评价为 N 星以上的镜像
将镜像推送到 Docker Hub$ docker push