Docker实战学习笔记(附源码)
2014 年 8 月 3 日
出品|MS08067实验室(www.ms08067.com)
目前35000+人已关注加入我们
本文作者: 大方子
(Ms08067实验室核心成员)
大方子
微信(欢迎骚扰交流):
目录
- 守护方式启动容器
-
容器交互
开始、停止、重启、查看容器输出、查看当前的容器 - 容器中执行命令
- 命名空间
- 容器标识
- 检查容器元数据
- 容器的连接
- 容器的环境变量
- 只读文件系统
- 持久化容器
- 使用init和supervisor进程维持容器的运行状态
- 清理容器
- Docker Hub的使用
- Docker 镜像
- 持久化存储和卷间状态共享
- Docker的网络
- closed容器
- Bridged容器
- 自定义DNS解析
- 开放对容器的访问
- 跨容器通信
- Joined容器
- Open容器
- 跨容器依赖
- 容器链接
- Docker Compose
- docker-compose 命令
- 在镜像中打包软件
- 从容器构建镜像
- 审查文件系统的改动
- 可配置的镜像属性
- 镜像体积和层数限制
- 导出和导入压缩文件系统
- 构建自动化和高级镜像设置
- 指令解析
- 软件分发
帮助
# 显示Docker工具的基本用法
docker help
# 显示指定命令的使用方法
docker help cp
守护方式启动动容器
# 以守护的方式运行(后台运行)
# ‐‐detach 或 ‐d
docker run ‐‐detach ‐‐name web nginx:latest
容器交互
# ‐‐interactive 或‐i 保持标准输入流
# ‐‐tty 或 ‐t 为容器分配一个虚拟终端
# 输入exit退出shell,容器也会停止工作
# 若使用了‐‐tty。可以【Ctrl】+【P】+【Q】在退出shell的情况下容器不会停止工作
docker run ‐‐interactive ‐‐tty ‐‐link web:web ‐‐name web_test busybox:latest /bin/sh
开始、停止、重启、查看容器输出、查看当前的容器
docker start [容器名称|容器ID]
docker stop [容器名称|容器ID]
docker restart [容器名称|容器ID]
# 加上‐f 可以只需跟踪日志的变化
docker logs [容器名称|容器ID]
docker ps
# 创建但不启动容器
docker create nginx
容器中执行命令
# 运行指定命令
docker exec [容器名称|容器ID] 命令
# 创建时运行命令
docker run ‐d ‐‐name namespaceA busybox:latest /bin/bash ‐c "sleep 30000"
命名空间
# 与物理机共享PID命名空间 ‐‐pid host
docker run ‐‐pid host busybox:latest ps
容器标识
# ‐‐cidfile 把容器ID写入物理机的文件中
# 如果CID文件存在,Docker不会创建新的容器
docker create ‐‐cidfile /tmp/web.cid nginx
# 显示完整的容器ID
docker ps ‐‐no‐trunc
检查容器元数据
# 查看容器是否运行 运行为True 停止为False
docker inspect ‐‐format "{{.State.Running}}" web
容器的连接
# ‐‐link 容器名:别名
docker run ‐it ‐‐name agent ‐‐link web:insideweb
容器的环境变量
# 传递环境变量
# ‐‐env 或 ‐e
docker run ‐d ‐‐name wpdb ‐e MYSQL_ROOT_PASSWORD=ch2demo mysql:5
docker run ‐‐env MY_ENVIRONMENT‐VAR="this is a test" busybox:latest env
只读文件系统
# 不运行更改容器所包含的文件,防止被攻击者破坏
docker run ‐d ‐‐name wp ‐‐read‐only wordpress:4
# 若想向只读文件系统写入内容,可以挂载存储卷
docker run ‐d ‐‐name wp3 ‐v /run/lock/apache2 ‐v /run/apache2 ‐‐read‐only wordpress:4
持久化容器
# ‐‐restart
# 总共有三个参数 no,on‐failure,always
# no为默认值,表示容器退出时,docker不自动重启容器
# on‐failure表示,若容器的退出状态非0,则docker自动重启容器,还可以指定重启次数,若超过指定次数未
能启动容器则放弃
# ‐‐restart=on‐failure:3 [容器名]
# always表示,只要容器退出,则docker将自动重启容器
docker run ‐d ‐‐name backoff‐detector ‐‐restart always busybox date
使用init和supervisor进程维持容器的运行状态
# 查看容器运行着哪些进程
# 显示主机为每一个容器中的进程所分配的PID
# 利用top获取的进程PID,与在容器中运行的top获取的PID不同
docker top lamp‐test
docker exec lamp‐test ps
清理容器
# 列出计算机上的所有容器
docker ps ‐a
# 删除容器
docker rm wp
# 删除前需要先停止容器
docker stop wp
# rm 可以增加‐f 来直接停止并清理容器
# 与docker stop不同的是,‐f是发出SIG_KILL信号,而stop发出的是SIG_HUP信号
# SIG_HUP停止前会让用户有准备时间,而SIG_KILL没有准备时间直接退出docker rm ‐f wp
# 容器退出时自动进行删除 ‐‐rm
docker run ‐‐rm ‐‐name auto‐exit‐test busybox:latest echo hello world
Docker Hub的使用
# docker账号登录
docker login
# docker账号注销
docker logout
# 镜像的搜索
docker search nginx
Docker 镜像
# Docker镜像的删除
docker rmi nginx
# 从替代注册服务器中下载镜像
docker pull quay.io/dockerinaction/ch3_hello_registry:latest
# 把镜像导出为文件
docker save ‐o myfile.tar busybox:latest
# 从文件中带入镜像
docker load ‐i myfile.tar
# Dockerfile安装镜像
# 从当前目录的Dockerfile中创建镜像,并且标签为ch3_dockerfile
docker build ‐t ch3_dockerfile .
# 从ch3_dockerfile中的Dockerfile创建镜像
docker build ‐t diach3/dockerfile:latest ch3_dockerfile
# 给ubuntu:15.10新增另外一个标签runoob/ubuntu:v3
docker tag ubuntu:15.10 runoob/ubuntu:v3
持久化存储和卷间状态共享
# ‐v 挂载存储卷
# ‐v 只有一个参数,把容器里面的/root/data 挂载到主机的/var/lib/docker/volumes的一个随机目录
# 可以通过docker inspect ‐f "{{json .Mounts}}" 容器名 查看
docker run ‐dit ‐v /root/data ‐‐name test busybox
# 把主机目录挂载到容器中去
# 把主机的/root/docker‐practice/data目录挂载到容器的/root/data中去
docker run ‐dit ‐v /root/docker‐practice/data:/root/data ‐‐name test busybox
# 挂载另一个容器的存储卷# ‐‐volumes‐from
# 这样test1容器的就会挂载test的存储卷,就是说test的存储卷发生变化test1里的/root/data也会发生变化
# 使用这个参数需要注意3点 1. 无法更改源存储卷的挂载点 2. 无法更改源存储卷的权限定义 3.多个来源存储卷时,挂载点不能冲突,冲突则只选择后一个存储卷
docker run ‐dit ‐‐volumes‐from test ‐‐name test1 busybox
# 容器只能对挂载卷进行读操作
# 增加:ro
docker run ‐dit ‐v /root/docker‐practice/data:/root/data:ro ‐‐name test busybox
# docker rm 清除容器的加上‐v
# 否则卷的计数器不会-1(计数器为0时会删除这个卷)
# 当所有的引起该卷的容器删除但是计数器不为0,docker是不会删除这个卷,那么这个卷就成了孤立卷
docker rm ‐v test1
# 从镜像中获取可用数据,可以在创建一个容器并挂载一个目录,把数据拷贝到挂载的目录中去
# 然后通过docker inspect找到对应的目录。当然也可以通过‐v 宿主机目录:容器目录 的参数形式方便操作
docker run ‐‐name dpvc ‐v /config dockerinaction/ch4_packed /bin/sh ‐c 'cp /packed*/config/'
Docker的网络
closed容器
# 增加‐‐net none 参数来创建closed容器
docker run ‐‐rm ‐‐net none alpine:latest ip addr
Bridged容器
# docker默认创建的就是Bridged容器
# 你可以省略‐‐net选项 或者 增加 ‐‐net bridge
docker run ‐‐rm ‐‐net bridge alpine:latest ip addr
自定义DNS解析
# 通过‐‐hostname选择,给容器设置一个主机名,使其在docker网络中能够通过主机名找到
docker run ‐‐rm ‐‐hostname barker alpine:latest nslookup barker# 通过‐‐dns为容器设置DNS服务器
# ‐‐dns[]可以为容器田间多个DNS服务器
docker run ‐‐rm ‐‐dns 8.8.8.8 alpine:latest nslookup docker.com
# 添加DNS查找域
# 当该选项被设置时,在查询时,任何不包括已经顶级域名(比如.com或者.net)的主机名都会自动加上改后
缀名
# 以下这个命令回去解析registry.hub.docker.com的IP地址
# 这个选项也可以在Docker后台进程启动时进行设置
docker run ‐‐rm ‐‐dns‐search docker.com busybox:latest nslookup registry.hub
# 自定义主机名到IP地址的映射关系
# test会被解析到10.10.10.225
# 该选项不能够再启动Docker后台进程时设置默认值
docker run ‐‐rm ‐‐add‐host test:10.10.10.255 alpine:latest nslookup test
# 这个选项可以被设置多次增加多个映射关系
docker run ‐‐rm ‐‐add‐host docker.com:127.0.0.1 ‐‐add‐host test:10.10.10.2 alpine:latest
cat /etc/hosts
开放对容器的访问
# 通过‐p参数让主机网络栈上的端口和容器端口之间建立映射关系
# 这种格式会将容器端口绑定到所有主机接口的一个动态端口上
docker run ‐p 333...
# 这种格式会将一个具体的容器端口绑定到每一个主机接口的某一个具体的接口上
# ‐p 宿主机端口:容器端口
docker run ‐p 333:3333
# 这种格式会将容器绑定到拥有指定IP地址的主机接口的动态端口上
docker run ‐p 192.168.0.32::2222 ....
# 这种格式会将容器端口绑定到拥有指定IP地址的注解接口的一个具体的端口上
docker run ‐p 192.168.0.32:1111:1111 ....
# ‐P 或者 ‐‐publish‐all
# 能够将容器开放的端口都暴露出去
docker run ‐d ‐‐name woolery ‐P dockerinaction/ch5_expose
# 设置容器想要开放的端口,这个选项能够被设置多次,一个端口设置一次
docker run ‐d ‐‐name philbin ‐‐expose 8000 ‐P dockerinaction/ch5_expose
# 可以通过以下命令来查看容器端口的开放情况
docker port philbin
跨容器通信
# 容器可以跟Docker虚拟网络接口上的其他容器进行通讯
# 若要阻止容器之间的通讯,除非被显示允许,所有流量都不能跨容器通讯
docker ‐d ‐icc=false
Joined容器
# 让多个容器共享一个网络栈
# ‐‐net container:[要加入的目标容器]
docker run ‐it ‐‐net container:brady alpine:latest
Open容器
# open容器对主机网络有完全的访问权限
docker run ‐‐rm ‐‐net host alpine:latest ip addr
跨容器依赖
容器链接
# 将容器与另一个容器相链接
# 目标容器必须正则允许
# 链接是单向的,静态的,无传递性的网络依赖
# 通过‐‐link链接imporantData容器并给这个容器取了db这个别名
# 以后这个这个容器访问db就是访问imporantData容器
docker run ‐d ‐‐name importantWebapp ‐‐link imporantData:db dockerinaction/ch5_web
start.sh ‐db tcp://db:3306
Docker Compose
docker-compose 命令
# 启动容器 ‐d 则会后台运行
docker‐compose up
# 查看容器状态
docker‐compose ps
# 停止容器
docker‐compose stop
# 停止容器中指定的服务docker‐compose stop 服务名
# 删除容器,若省略‐v可能会使容器卷成为孤立
docker‐compose ‐vfs rm
# 查看容器日志,后面可加服务名查看指定服务,不加查看全部
docker‐compose logs [服务名]
# 服务源码发生变化时,重建服务。后面也可以跟服务名重建指定服务名
docker‐compose build [服务名]
在镜像中打包软件
从容器构建镜像
# 把现有容器打包成镜像
# ‐a 为新镜像指定作者的信息
# ‐m 设置关于提交的信息
docker commit [容器名] [镜像名]
docker commit ‐m "Set CMD git" ‐a 'dfz@qq.com' cmd‐git ubuntu‐git
# 配置容器的入口点
# 容器运行后默认执行ls命令
docker run ‐‐name cmd‐git ‐‐entrypoint "ls" ubuntu‐git
# ubuntu‐ls镜像为添加了ls命令为入口点的镜像
# 容器运行后执行 把/作为参数 运行“ls /”
docker run ‐‐name cmd‐git1 ubuntu‐ls /
# 为镜像配置标签
# myuser/myfristrepo:mytag的镜像就会有myuser/mod_ubuntu的新标签
docker commit mod_ubuntu myuser/myfristrepo:mytag
docker tag myuser/myfristrepo:mytag myuser/mod_ubuntu
审查文件系统的改动
# A表示添加,C表示修改,D表示删除
docker diff [容器名]
可配置的镜像属性
# 配置容器的环境变量
docker run ‐‐name rich‐image‐example ‐e ENV_EXAMPLE1=Rich busybox:latest
镜像体积和层数限制
# 镜像的文件操作,类似于PS的层一样,是一层一层往上加的(联合文件系统)
# 一般文件系统的层数为42层
# 可以用过histort来查看镜像的 层 历史
# 可以通过导出再导入镜像来进行压缩,但是回丢失改动的历史信息
docker history ubuntu‐git
导出和导入压缩文件系统
# 通过docker export ‐‐output(‐o)可以对容器进行导出
docker export ‐‐output mod_ubuntu.tar mod_ubuntu
# 显示归档的内容
tar ‐tf mod_ubuntu.tar
# 将压缩格式的镜像进行导入
docker import mod_ubuntu.tar
构建自动化和高级镜像设置
指令解析
# 源镜像
FROM ubuntu:latest
# 作者信息
MAINTAINER "nzjdsds@qq.com"
# 运行的命令
Run apt‐get update && apt‐get install ‐y git
# 容器入口
ENTRYPOINT ["git"]
# 容器环境变量
ENV APPROOT="/app"
# 容器工作目录
WORKDIR $APPROOT
# 对外暴露的3333端口
EXPOSE 3333
# COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远
程服务器读取资源并复制到镜像中
COPY ["来源目录","目的目录"]
# 挂载目录,但无法指定主机上对应的目录
VOLUME ["/var/log"]
# 不要忘记最后面的. 不加‐f指定文件名 则默认使用Dockerfile
# 在构建中,镜像的相同内容在之前配置会,则build时会使用缓存
# 增加‐‐no‐cache来不适用缓存
docker build ‐‐tag ubuntu‐git:auto .
软件分发
# 需要先使用docker login进行登录
# 镜像要命名成/
docker commit test/test
docker push/test
公众号回复“Docker命令”,打包下载所有命令,方便使用!
扫描下方二维码加入星球学习
加入后会邀请你进入内部微信群,内部微信群永久有效!
目前35000+人已关注加入我们