Docker技术入门与实战
- 第二章、核心概念与安装配置
- 第三章、使用docker镜像
- 第四章、操作docker容器
- 第五章、访问docker仓库
- 第六章、docker数据管理
- 第七章、端口映射与容器互联
- 第八章、使用dockerfile创建镜像
- 第九章、操作系统
- 第十章、为镜像添加ssh服务
- 第十一章、web应用与服务
- 第十二章、数据库应用
- 第十三章、分布式处理与大数据平台
- 第十四章、编程开发
- 第十五章、容器与云服务
- 第十六章、容器实战思考
- 第十七章、核心实现技术
- 第十八章、配置私有仓库
- 第十九章、安全防护与配置
- 第二十章、高级网络功能
- 第二十一章、libnetwork插件化网络功能
- 第二十二章、Etcd——高可用的键值数据库
- 第二十三章、Docker三剑客之Machine
- 第二十四章、Docker三剑客之compose
- 第二十五章、Docker三剑客之Swarm
- 第二十六章、Mesos——优秀的集群资源调度平台
- 第二十七章、Kubernetes——生产级容器集群平台
- 第二十八章、其他相关项目
第二章、核心概念与安装配置
迪庆一个nginx容器并运行 :
docker run -d -p 80:80 --name webserver nginx
docker ps
kitematic工具 管理本地镜像
第三章、使用docker镜像
获取镜像: docker pull ubuntu
下载非官方镜像仓库: docker pull hub.c.163.com/public/ubuntu
使用代理,可以在docker服务启动配置中增加: --registry-mirror-proxy_URL
来指定代理服务器地址
列出镜像: docker images
使用tag增加镜像标签: docker tag ubuntu:latest myubuntu:latest
查看镜像详细信息: docker inspect ubuntu
查找镜像: docker search xxx
删除镜像: docker rm xxx
使用一段时间后系统红可能会遗留一些临时的经想问就爱你以及一些没有被使用的镜像,这是可以使用docker prune xxx
命令来进行清理
创建镜像的方法主要有3种: 基于已有镜像的容器创建、基于本地模板导入、基于dockerfile创建
1、基于已有容器创建
该方法主要使用 docker commit
命令
主要选项包括:
- -a 作者信息
- -c 提交的时候执行的dockerfile命令
- -m 提交信息
- -p 提交时暂停容器运行
示例:
docker run -it ubuntu /bin/bash
touch test
exit
#记住容器ID
此时容器的ID已经发生了变化可以使用docker commit 命令提交为一个新的镜像。
docker commit -m 'msg' -a 'docker author' xxxID test:1.0
docker images
2、基于本地模板导入
用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import 命令
要直接导入一个镜像,可以使用openvz提供的模板来创建,或者用其他已导出的镜像模板来创建。
例如下载ubuntu的模板压缩包之后使用以下命令导入即可
cat ubuntu.tar.gz | docker import - ubuntu:18.04
docker images
查看已经存在新的镜像了
3、基于dockerfile创建
基于dockerfile创建时最常见的方式,dockerfile是一个文本文件,利用给定指定的指令描述基于某个父镜像创建新镜像的过程。
示例:基于debian镜像安装python环境构成一个新的python:3镜像
FORM debian:stretch-slim
LABEL version="1.0" maintainer="docker user <docker_user@github>"
RUN apt-get update &&\
apt-get install -y python3 && \
apt-get clean &&
rm -rf /var/lib/apt/lists/*
创建镜像的过程可以使用docker build 命令 编译 成功后本地将多出一个python:3镜像
docker build -t python:3
3.6、存入和载入镜像
主要介绍save
和load
子命令
1、存入镜像
如果要导出镜像到本地文件可以使用docker save 命令 该命令支持-o -output -string参数 导出镜像到指定的文件中。
docker images
docker save -o ubuntu.tar ubuntu:18.04
之后 用户就可以通过复制 ubuntu.tar文件将搞镜像分享给他人
2、载入镜像
可以使用 docker load -i ubunut.tar
或者 docker load < ubuntu.tar
docker images 查看导入的镜像
3.7、上传镜像
本章介绍docker push子命令 可以使用 docker push xx 命令上传到镜像仓库 默认上传到 docker Hub仓库 需要登录
docker tag test:latest user/test:latest
docker push user/test:latest
第四章、操作docker容器
4.1 创建容器
1、新建容器: docker create -it ubuntu:latest
2、启动容器:
docker start ID
docker ps
3、新建并启动容器
启动一个bash,允许用户进行交互
docker run -it ubuntu /bin/bash
docker run ubuntu /bin/bash "hello world"
-t 选项让docker分配一个伪终端
-i 则让容器的标准输入保持打开
4、守护态运行
docker run -d ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"
5、查看容器输出
通过docker logs 命令
- -details:打印详细信息
- -f,-follow : 持续保持输出
- -since string :输出从某个时间开始的日志
- -tail string : 输出最近的若干日志
- -t,-timestamps :显示时间错信息
- -until string : 输出某个时间之前的日志
4.2 停止容器
1、暂停容器 docker pause test
2、终止容器 docker stop test
3、重启容器: docker restart test
4.3 进入容器
在使用 -d
参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作,这个时候如果需要进入容器进行操作 推荐使用 attach
或 exec
命令
docker attach ID
4.4、删除容器
可以使用docker rm命令来删除处于终止或退出状态的容器
主要支持的选项包括:
- -f 是否强制终止并删除一个运行中的容器
- -l 删除容器的连接 单保留容器
- -v 删除若能勾起挂载的数据卷
例如:
docker ps -a
docker rm xxx
4.5、导入和导出容器
某些时候 需要将容器从一个系统迁移到另外一个系统 此时可以使用docker的导入导出功能,这也是docker自身提供的一个重要的特性
1、导出容器
导出容器是指 导出一个已经创建的容器到一个文件 不管此时这个容器是否处于运行状态 可以使用 docker export 命令
其中 可以通过 -o 选项来指定导出的tar文件名 也可以直接通过重定向来实现
docker ps -a
docker export -o test_for_run.tar ce5
docker export e81 > test_for_stop.tar
之后 将导出的tar文件传输到其他机器上 然后在通过导入命令 导入到系统中实现容器的迁移。
2、导入容器
docker import 命令
docker import test_for_stop.tar - test/ubuntu:v1.0
之前介绍的docker load 命令到导入一个镜像文件 与docker import命令十分类似
实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像看 ,也可以使用docker import 命令来导入一个容器快照到本地镜像库 这两者区别在于: 容器快照文件将丢弃所有历史几率和元数据信息 即金宝村容器当时的快照状态,而镜像存储文件将保存完整几率 体积更大 ,此外 从容器快照文件导入时可以重新制定标签等元数据信息。
4.6、查看容器
主要介绍docker 容器的inspect、top、states 子命令
1、查看容器详情可以使用 docker inspect 命令
具体信息会以json返回 包括容器ID 创建时间 路径 状态 镜像 配置等
2、查看容器内进程:
docker top xxx
3、查看统计信息
docker states
选项包括
- -a 输出所有容器统计信息 默认运行
- -format 格式化输出
- -no-stream 不持续输出
- -no-trunc 不阶段输出内容
4.7、其他容器命令
本节主要介绍docker容器的cp、diff、port、update子命令
1、复制文件 docker xxx cp data test:/tmp/
2、查看变更 docker container diff test
3、 查看端口映射 docker container port test
4、更新配置
docker [container] update container
例如 docker update --cpu-quota 1000000 test
限制总配额为1秒 容器test 所占用时间为10%
第五章、访问docker仓库
5.3、搭建本地私有仓库
1、使用registry镜像创建私有仓库
安装docker 后 可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境
dockerrun -d -p 5000:5000 registry:2
这将自动下载一个兵启动一个registry容器 创建本地的私有仓库服务
默认情况下 仓库会被创建在容器的/var/lib/registry
目录下 可以通过-v参数来将镜像文件存放在本地的指定路径
2、管理私有仓库
使用 docker tag命令将这个镜像标记为 IP/test
docker tag ubuntu 10.0.0.0:5000/test
docker images
使用docker images 上传标记的镜像
docker push 10.0.0.0/test
使用curl 查看仓库 10.0.0.0的镜像
curl http://10.0.0.0/v2/search
这里 可以任意一台能访问10.0.0.0地址的机器去下载这个镜像了。
较新的docker版本对安全性较高 会要求SSL TLS证书 内部使用的仓库可以关闭对安全的检查:
修改docker daemon 的启动参数DOCKER_OPTS = "--insecure-registry 10.0.0.0"
重启服务 sudo service docker restart
第六章、docker数据管理
在生产环境中使用docker 旺旺要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然设计荣提起的数据管理操作。
容器中管理数据主要有两种方式:
- 数据卷 :容器内数据直接映射到本地主机环境
- 数据卷容器: 使用特定容器维护数据卷
6.1、数据卷
数据卷是一个可供容器使用的特殊目录 他将主机操作系统目录直接映射进容器 类似linux中的mount行为。
数据卷可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用 容器间传递数据将变得高效与方便
- 对数据卷内数据的修改会立马生效 无论是容器操作还是本地操作
- 对数据卷的更新不会影响镜像
- 卷会一直存在,直到没有容器使用
1、创建数据卷
docker volume create -d local test
此时 查看 /var/lib/docker/volumes
路径下 会发现所创建的数据卷位置
除了 create 子命令外 docker volume还支持inspect、ls、prune、rm等命令
2、绑定数据卷
在用docker run命令时 可以使用 -mount 选项来舒勇数据卷 ,支持3中类型
- volume:普通数据卷 映射到主机目录
- bind : 绑定数据卷 映射到主机指定目录下
- tmpfs: 临时数据卷 值存在于内存中
docker run -d -p --name web --mount type=bind,source=/webapp,destination=/opt/ webapp training/webapp python app.py
docker挂载数据卷的默认权限是读写 用户可以通过ro指定为只读
6.2、数据卷容器
首先创建一个数据卷容器 data 并在其中创建一个数据卷挂载到 /dbdata:
docker run -it -v /dbdata --name dbdata ubunut
然后在其他容器中使用 --volume-form
来挂载dbdata容器中的数据卷,例如创建 db1 和db2两个容器 Bing cong dbdata容器挂载数据卷:
docker run -it --volume-form dbdata --name db1 ubunut
docker run -it --volume-form dbdata --name db2 ubunut
此时db1 和db2 都挂载同一个数据卷到相同的 /dbdata目录 ,三个容器任何一方在该目录下的写入 其他容器都可以看到。
如果删除了挂载的容器 ,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rn -v 命令还指定同时删除关联的容器。
6.3、利用数据卷容器来迁移数据
1、备份 使用命令来备份dbdata数据卷容器内的数据卷:
docker run --volume-form dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
该命令解释: 首先利用ubuntu镜像创建了一个容器worker。使用 –volumes-form dbdata 参数来让worker容器挂载dbdata容器数据卷;使用 -v $(pwd) :/backup参数来挂载本地的当前目录到worker容器的/backup目录
2、恢复
首先创建 一个带有数据卷的容器 dbdata2:
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另外一个新的容器 挂载dbdata2的容器 并使用untar解压备份文件到所挂载的容器中:
docker run --volume-form dbdata2 -v$(pwd):/backup busybox tar xvf
第七章、端口映射与容器互联
7.1、端口映射实现容器访问
1.从外部访问容器应用
当容器中运行一些网路哟应用,要让外部访问这些应用时,可以通过 -P或-p参数来指定端口 大写P标记或随机映射一个49000-49900的端口
docker run -d -P training/webapp python app.py
docker ps -l
docker logs -f nostalgic_morse
2.映射所有接口地址
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
可以使用多个-p指定多个端口映射
3.映射到指定地址的指定端口
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
4.映射到指定地址的任意端口docker run -d -p 127.0.0.1::5000 training/webapp python app.py
5.查看映射端口配置
docker port nostalgic_morse 5000
7.2、互联机制实现便捷互访
容器的互联 是让多个容器的应用进行快速交互的方式,他会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
1.自定义容器命名
连接系统依据容器的名称来指定,因此需要自定义一个好记的容器命名。
使用 –name 标记可以为容器自定义命名:
docker run -d -P --name web training/webapp python app.py
验证命名:
docker ps -l
查看容器名字:
docker inspect -f "{{.Name}}" xxxx
注意 在执行 docker run的时候如果添加 –rm 标记 则容器在中终止后悔立即删除 不能和-d同时使用
2.容器互联
使用 –link 参数可以让容器之间安全地进行交互
创建一个新的数据库容器
docker run -d --name db training/postgres
然后创建一个新的web容器并将它连接到db容器
docker run -d -P --name web --link db:db training/webapp python app.py
此时db容器和web容器简历互联关系
–link 参数格式为 –link name:alias 其中name是要连接的容器的名称 alias是别名
使用env查看容器的环境变量:
docker run --rm --name web2 --link db:db training/webapp env
第八章、使用dockerfile创建镜像
第九章、操作系统
第十章、为镜像添加ssh服务
第十一章、web应用与服务
第十二章、数据库应用
第十三章、分布式处理与大数据平台
第十四章、编程开发
第十五章、容器与云服务
第十六章、容器实战思考
第十七章、核心实现技术
第十八章、配置私有仓库
第十九章、安全防护与配置
第二十章、高级网络功能
第二十一章、libnetwork插件化网络功能
第二十二章、Etcd——高可用的键值数据库
第二十三章、Docker三剑客之Machine
第二十四章、Docker三剑客之compose
第二十五章、Docker三剑客之Swarm
第二十六章、Mesos——优秀的集群资源调度平台
第二十七章、Kubernetes——生产级容器集群平台
第二十八章、其他相关项目
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 anaf@163.com