Docker 学习笔记

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

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 图标

Paste_Image.png

快速验证一下

docker version
docker run hello-world
docker ps -a
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 <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 了

Paste_Image.png

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

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,489评论 0 120
  • 原文地址:LoveDev Docker相对于传统意义上的虚拟机最大的区别就在于传统虚拟机是虚拟出一套硬件后,再在上...
    KevinLive阅读 3,746评论 3 7
  • 古人云:“学道须是铁汉,着手心头便判,直取无上菩提,一切是非莫管。” 就像老子《道德经》所云:“为学日增,为道日损...
    覚明阅读 607评论 4 13
  • 把接口java文件的后缀名改成aidl# 远程服务 本地服务:指的是服务和启动服务的activity在同一个进程中...
    大话程序阅读 442评论 0 2
  • 2017即将过去,2018即将到来,回望过去,展望未来: 2017,认识了一帮新朋,也丢失了一些旧友,有失落,但不...
    六月孺子牛阅读 327评论 5 7