Docker 技术风靡一时, 到底它有什么绝代的风华可以倾倒众生呢?
翻阅了几本书和网上的资料, 总算弄懂了个大概, 从安装到使用, 做点笔记.
Docker 发展太快了, 它的安装方式也提升很快
- boot2docker 最老的方式
- docker toolbox 上次我用的方式
- docker for mac 我的 macbook 现在用的方式
- docker for windows 我的 thinkpad 现在用的方式
Docker 需要 64 位的 Linux 系统 , 内核版本在3.10 以上, 默认只能安装在 Linux 上, 在windows 和 mac 上要安装一个虚拟机环境
安装篇
Docker for Windows
Docker技术 是通过 Linux 的 Namespaces 对不同的容器实现了隔离, 对windows 的支持并不好, 所谓Docker for windows 也就是利用了虚拟机技术在 windows 中安装了一个 Linux 虚拟机, 通过虚拟机来模拟Linux 上的Docker 容器支持
详细安装步骤参见 https://docs.docker.com/docker-for-windows/install/
安装完可以快速验证一下
docker run -it --name local_ubuntu ubuntu:latest /bin/bash
会自动下载 ubuntu 18.04 并运行 /bin/bash , 可以运行诸多 bash 命令
exit 退出
docker run -idt -P --name local_ubuntu -v /workspace:/workspace ubuntu
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>
删除所有的退出的容器
sudo docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs sudo docker rm
用 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