Docker 学习笔记
Docker 技术风靡一时, 到底它有什么绝代的风华可以倾倒众生呢?
翻阅了几本书和网上的资料, 总算弄懂了个大概, 从安装到使用, 做点笔记.

Docker 发展太快了, 它的安装方式也提升很快
- boot2docker 最老的方式
- docker toolbox 上次我用的方式
- docker for mac 现在用的方式
Docker 需要 64 位的 Linux 系统 , 内核版本在3.10 以上, 默认只能安装在 Linux 上, 在windows 和 mac 上要安装一个虚拟机环境
�首先在我的 mac book 上装一个docker toolbox, 其实就是脱胎于以前的 boot2docker
安装篇
Docket toolbox
- 参考

安装完后可以看一下当前运行的 docker machine
$ docker-machine regenerate-certs default
$ docker-machine restart default
$ eval $(docker-machine env default)
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v1.11.2
要想卸载的话, 可以
- docker-machine rm default
- 从 “Applications” 中删除 Docker Quickstart Terminal and Kitematic
- Remove the docker, docker-compose, and docker-machine
$ rm /usr/local/bin/docker
$ rm /usr/local/bin/docker-compose
$ rm /usr/local/bin/docker-machine
Docker for MAC
- 这是比较新的, 现在推荐的方式, 这里重点介绍一下

- 首先将toolbox的环境变量重置
$ env | grep DOCKER
DOCKER_HOST=tcp://192.168.99.100:2376
DOCKER_MACHINE_NAME=default
DOCKER_TLS_VERIFY=1
DOCKER_CERT_PATH=/Users/.../.docker/machine/machines/default
$ unset DOCKER_TLS_VERIFY
$ unset DOCKER_CERT_PATH
$ unset DOCKER_MACHINE_NAME
$ unset DOCKER_HOST
然后从 https://docs.docker.com/docker-for-mac/ 下载 Docker.dmg 安装即可,
点击 Docker.app 会在导向栏中出现一个docker 图标

快速�验证一下
docker version
docker run hello-world
docker ps -a

上述命令就是让 docker 运行一个镜像, 如果本地没有这个镜像的话, 就从远程下载
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
快速上手
docker 的命令很多, 可以用 docker help command
来获取详细帮助
操作 | 用法 | 例子 | 解释 | |
---|---|---|---|---|
拉取 docker 镜像 | docker pull [options] image_name[:tag] | docker pull ubuntu:latest | ||
运行docker 实例 | docker run [options] image_name [command] [args...] | docker run -i -t --name mydocker ubuntu:latest /bin/bash | -i 使用交互模式,保持输入流打开 -t 分配一个伪终端 --name 为运行的容器指定一个名字 -c 为容器所分配的cpu -m 为容器所分配的 memory -v [host_dir]:[container_dir] 挂载本地目录到容器中 -p [host_port]:[container_port] 映射本地端口到容器中的端口 |
|
获取 docker 镜像 | docker images [options] image_name | docker images | ||
Docker 实例更名 | docker rename <old_container_name> <new_container_name> | docker rename tomcat tomcat7 | ||
Docker 中命令的执行 | docker exec [OPTIONS] CONTAINER COMMAND [ARG...] | docker exec -it tomcat /bin/bash | ||
拷贝文件到 Docker 中 | docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH |
docker cp ./examples/guestbook/target/guestbook.war tomcat:/usr/local/tomcat/webapps |
理论篇
先解释一下相关概念, docker 容器技术架构如下

Docker machine
Docker Machine 是一个工具 , 让你安装 Docker 引擎在你的虚拟主机上, 并可以用 docker-machine 命令进行管理.
使用 docker-machine , 可以 start, inspect, stop, and restart 一个被管理的 host, 升级 docker client and daemon, 并配置 Docker client 与你的主机交互
- 启动 machine
$ docker-machine stop default
- �停止 machine
$ docker-machine start default
- 察看 docker machine 默认地址
$ docker-machine ip default
192.168.99.100
Docker image
先试着运行一下 HelloWorld
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
这样会启动一个匿名的 docker 容器, 基于的镜像是 hello-world, 本地如果没有这个 image, 会到 github 上拉取
docker container 基于 image 启动, 镜像 Image 是由文件系统叠加起来的, 最底层是bootfs
当一个容器启动后, 它将会被移到内存中, 随即会 unmount bootfs
第二层是rootfs, 它可以是多种操作系统, unbuntu or centos, rootfs是只读状态的
docker 利用 union mount 技术会在 rootfs 上加载更多的只读文件系统, 各层文件系统叠加到一起, 最终的文件系统看起来象一个文件系统, 最终的文件系统叠加到一起, 最终的文件系统会包含所有的底层的文件和目录, 这样的文件系统就是 image
当容器启动时, 初始的读写层是空的, 当文件系统发生变化时, 该文件会从只读层复制读写层 (copy on write)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 693bce725149 9 days ago 967 B
centos latest 904d6c400333 2 weeks ago 196.8 MB
nginx latest 0d409d33b27e 2 weeks ago 182.8 MB
busybox latest 47bcc53f74dc 3 months ago 1.113 MB
- 列出 image
docker image
- 拉取 image
docker pull jenkins
- 启动 image (pull if it does not exist in local)
docker run -t -i --name my_jenkins jenkins /bin/bash
- 查找image
docker search jenkins
- 创建 image
docker commit <container_id> <new_image_name>
- 删除 image
docker rmi <image_name>
用 Dockerfile 构建image
-
create project folder
mkdir guestbook
cd guestbook
touch Dockerfile -
Create Dockerfile 创建 Dockerfile
FROM centos:6.7
MAINTAINER Walter Fan "walter.fan@gmail.com"
RUN yum update
RUN yum install -y nginx
RUN echo "<html><body>Hello World</body></html>" > /usr/share/nginx/html/index.html
EXPOSE 80
- Build dockerfile 根据 Dockerfile 来创建镜像
docker build -t="walterfan/hfkb:v1" .
Docker Hub
docker hub 类似于 maven 仓库, 持有各种 docker image
在 https://hub.docker.com 上创建 docker hub 帐号, 然后就可以上传自己的 Image 了

Docker Container
镜像是静态的文件系统, 容器是动态的运行实例
- 创建容器
# -i open standard input
# -t open pseudo tty
# -d dameon 在后台运行
docker create -it centos
- 查看 container 信息
docker inspect <container_name>
- 查看 container 运行情况
docker ps -a
- 运行 container
- --name 指定container 名字
- -i 开启 stdin
- -t 分配一个伪 tty 终端
docker run -it centos:latest /bin/bash
- 停止 container
docker stop <container_id>
- 进入 container
docker attach <container_id>
- 执行 container 中的命令
docker exec -it <container_id> /bin/bash
- 重新启动 docker 容器
docker start <container_id>
- 附着到 docker 容器
docker attache <container_id>
- 启动和停止守护式容器
docker run --name <container_id> -d centos
docker stop wf_container
-
-d 守护方式 daemon 在后台运行 docker container
-
查看容器内部运行的进程
docker top <container_id>
docker ps <container_id>
- 查看容器内部信息
docker inspect <container_id>
- 在容器内部运行进程
docker exec -d <container_id> touch /opt/rh/readme.md
- 与容器创建一个base会话
docker exec -t -i <container_id> /bin/bash
删除一个容器
docker rm <container_id>
- 删除 container
# -f 强制终止并删除
# -l 删除容器的连接
# -v 删除所挂载的数据卷
docker rm <container_id>
- 导出 container
docker export <container_id> > xxx.tar
- �导入 container
cat xxx.tar|docker import - <container_name>/centos:v1.0
Docker data volume
- 运行 container, image=centos, name=ccp, 映射本地目录到/opt/webex
docker run -idt -P --name ccp -v /Users/walter/Documents/workspace:/opt/workspace centos
docker exec -it <container_id> /bin/bash
yum install -y gcc-c++
yum install -y make
yum install -y automake
Tips
运行 docker centos 容器
docker run -idt -P --name ccp -v /Users/walter/Documents/workspace:/opt/workspace centos
docker attache ccp
在 shell 环境中可以安装所需软件
$ yum install vim
如果 exit 退出则停止了 docker container, 可以用 docker start cpp 再启动起来
运行 docker busybox 容器 并执行 ‘echo’ command.
$ docker run busybox echo hello world
运行 docker nginx 容器, 映射容器内部端口80到外部 host 端口8000
$ docker run -d -p 8000:80 nginx
参考资料
- 第一本Docker书
- Docker技术入门与实战
- https://docs.docker.com