很久之前就说要学Docker,但是一直断断续续的学了一点,这个暑假终于腾出点时间把Docker过一下。主要是阅读 《Docker-从入门到实践》这本书,然后看了一下希云的视频,留此文章用于备忘。
Docker简述
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker 的基础是Linux 容器 (LXC) 等技术。
Docker 和传统虚拟化方式的不同之处:容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
Docker 容器的启动可以在秒级实现,容器除了运行其中应用外, 基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
Docker 核心概念
image-镜像。Docker镜像就是一个只读的模板,模板中包含一些固定的配置文件。镜像是只读的,容器在启动的时候创建一层可写层 作为最上层。
container-容器。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
repository-仓库。仓库是集中存放镜像文件的场所。每个仓库中又包含了多个镜像,每个镜像有不同的标签。
以上这些概念和git有着异曲同工之处,你可以将image看着是一个 os 的release,这样就很好理解Docker的相关概念了。
ubuntu安装Docker (参考官方文档-我是在zeal中参考的)
sudo apt-get install apt-transport-https ca-certificates
安装 apt-transport-https 包以支持 https 协议的源sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
添加源的 gpg 密 钥lsb_release -c
获取当前操作系统的代号sudo vim /etc/apt/sources.list.d/docker.list
然后填入deb https://apt.dockerproject.org/repo ubuntu-trusty main
sudo apt-get update
更新源sudo apt-get install -y linux-image-extra-$(uname -r)
为了让 Docker 使用 aufs 存储,推荐安装 linux-image-extra 软件包sudo apt-get install apparmor
apparmor 是Linux内核的一个安全模块,新版本的Ubuntu已经被整合到内核sudo apt-get install -y docker-engine
安装Docker至此Docker就安装完毕。
Docker 镜像操作
获取镜像
* 使用默认注册服务器(registry)sudo docker pull ubuntu:14.04
从远程获取镜像,等价于sudo docker pull registry.hub.docker.com/ubuntu:14.04
* 使用其他的注册服务器sudo docker pull dl.dockerpool.com: 5000/ubuntu:14.04
* 使用Dockerfile构建镜像:sudo docker build -t kangqf/centos:7.1 .
-t是指定 tag
* 通过文件导入镜像:sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
运行镜像
* 交互式运行镜像sudo docker run -t -i ubuntu:14.04 /bin/bash
-i是指以交互式运行,-t 是指分配一个伪TTY
* 守护态运行镜像sudo docker run -d -p 8080:80 --name website kangqf/php-fpm:5.4
-d 是指以守护态运行 -p 表示端口映射(还有 -P随意端口映射)
* 传入环境变量运行sudo docker run -d -p 80:80 -e WORDPRESS_DB_HOST=172.17.0.2 -e WORDPRESS_DB_USER=admin -e WORDPRESS_DB_PASSWORD=111111 --name wordpress kangqf/wordpress:4.3
列出本地镜像
sudo docker images
提交镜像修改
sudo docker commit -m "fix systemd conflict" ed008584c431 kanngqf/php-fpm:5.4.1
-a 可以指定更新的用户信息 -m 用来指定提交的说明信息上传镜像
sudo docker push ouruser/sinatra
本地存出镜像
sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
本地载入镜像
sudo docker load --input ubuntu_14.04.tar
或是
sudo docker load < ubuntu_14.04.tar
这将导入镜像以及其相 关的元数据信息(包括标签等)移除本地镜像
sudo docker rmi training/sinatra
移除镜像之前确定该镜像没有被容器使用,如果有先移除该容器移除所有未打标签的镜像
sudo docker rmi $(docker images -q -f "dangling=true")
是sudo docker rmi $(docker images --quiet --filter "dangling=true")
的缩写。Docker 容器操作
启动容器
sudo docker run ubuntu: 14.04 /bin/echo 'Hello world'
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开,-d 后台运行。启动已经终止的容器
docker start
可以使用docker ps -a
来查看已经终止的容器或是正在运行的容器。获取容器的输出信息
docker logs
。终止容器
docker stop
重启容器
docker restart
进入容器
docker attach website
但是使用 attach 命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。导出本地某个容器快照
docker export 7691a814370e > ubuntu.tar
导入容器快照
cat ubuntu.tar | sudo docker import - test/ubuntu: v1.0
load 和 import的区别是 import的快照会丢失所有的历史记录和源数据信息。删除容器
docker rm
来删除一个处于终止状态的容器。docker rm $( docker ps -a -q)
清除所有处于终止态的容器。Docker 仓库
仓库( Repository)是存放镜像的地方。注册服务器( Registry)是管理仓库的具体服务器。例如对于仓库地址dl. dockerpool.com/ubuntu 来说,dl.dockerpool.com 是注册服务器地址,ubuntu 是仓库名。
Docker Hub 是Docker官方维护的一个公共仓库。
docker login
用来注册登录,docker search
来查找官方的镜像,docker pull
来下载镜像,docker push
将镜像推送到Docker Hub。仓库自动创建(Automated Builds)。自动创建允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub或BitBucket)上的项目,一旦项目发生新的提交,则自动执行创建。
私有仓库。docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。registry 支持 通过config_sample.yml来配置各种相关的选项,包括数据的存储方式等内容。
遇到的问题
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
在 docker images docker build 等命令时加上 sudo
Error: fakesystemd conflicts with systemd-219-19.el7_2.11.x86_64
加上 --skip-broken
run 之后马上退出
检查entrypoint中的文件是否有可执行权限或者以交互式运行container然后查看调试信息
几个技巧
删除 none 的image
1 | sudo docker ps -a | grep "Exited" | awk '{print $1 }'|xargs sudo docker stop |
删除image的流程
1 | sudo docker stop cid |