Docker 学习笔记

Docker 技术风靡一时, 到底它有什么绝代的风华可以倾倒众生呢?

翻阅了几本书和网上的资料, 总算弄懂了个大概, 从安装到使用, 做点笔记.

Docker 学习笔记_第1张图片

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

Docker 学习笔记_第2张图片
Paste_Image.png
  • 首先将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 学习笔记_第3张图片
Paste_Image.png

快速验证一下

docker version
docker run hello-world
docker ps -a
Docker 学习笔记_第4张图片
Paste_Image.png

上述命令就是让 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 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 学习笔记_第5张图片

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  
  • 删除 image
docker rmi 

删除所有的退出的容器

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 "[email protected]"    
RUN yum update
RUN yum install -y nginx
RUN echo "Hello World" > /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 学习笔记_第6张图片
Paste_Image.png

Docker Container

镜像是静态的文件系统, 容器是动态的运行实例

  • 创建容器
# -i open standard input
# -t open pseudo tty
# -d dameon 在后台运行
docker create -it centos
  • 查看 container 信息
docker inspect 
  • 查看 container 运行情况
docker ps -a
  • 运行 container
    • --name 指定container 名字
    • -i 开启 stdin
    • -t 分配一个伪 tty 终端
docker run -it centos:latest /bin/bash
  • 停止 container
docker stop 
  • 进入 container
docker attach 
  • 执行 container 中的命令
docker exec -it  /bin/bash
  • 重新启动 docker 容器
 docker start  
  • 附着到 docker 容器
 docker attache  
  • 启动和停止守护式容器
docker run --name   -d centos 
docker stop wf_container
  • -d 守护方式 daemon 在后台运行 docker container

  • 查看容器内部运行的进程

docker top  
docker ps  
  • 查看容器内部信息
 docker inspect  
  • 在容器内部运行进程
 docker exec -d   touch /opt/rh/readme.md
  • 与容器创建一个base会话
docker exec -t -i   /bin/bash     

删除一个容器

docker rm  
  • 删除 container
# -f 强制终止并删除
# -l 删除容器的连接
# -v 删除所挂载的数据卷
docker rm  

  • 导出 container
docker export  > xxx.tar
  • �导入 container
cat xxx.tar|docker import - /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  /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

你可能感兴趣的:(Docker 学习笔记)