给自己写的docker文档
Docker学习笔记
docker的基本组成
镜像(image)
- docker镜像类似一个模板,可以通过这个模板来创建容器服务。
- 如: node镜像 ===》 run ===》 node001容器(用来提供服务)
- 通过这个node镜像可以创建多个容器,最终服务会运行在容器中。
容器(container)
- docker利用容器技术,独立运行一个或一组应用,通过镜像创建
- 包含 启动、停止、删除等基本命令
- 可以把容器理解为一个简易的 linux系统
仓库(repository)
- 存放镜像的地方
- 仓库可分为 公共仓库 和 私有仓库
- 比如 Docker Hub 、 阿里云、腾讯云等等…
docker 安装
默认是在linux上演示,以我的阿里云1G2核服务器,CentOS8为例。
查看系统内核:
- 我的内核版本为 4.18.0
1 |
|
查看系统配置: (注意docker在centos上需要在版本7以上!)
- cat /etc/os-release
1 |
|
安装步骤:
官网文档:“Install Docker Engine on CentOS”
1. 如果有旧版docker,需要先卸载旧的
1 |
|
2. 下载docker需要的安装包
1 |
|
3. 设置镜像仓库
1 |
|
4. 更新yum软件包索引
1 |
|
5. 安装docker相关设置
注: docker-ce 是社区版 docker-ee是企业版
1 |
|
6. 启动 docker
1 |
|
下载 hello-world 测试一下
1 |
|
注:没有安装的话,会自动去dockerHub上面找并拉取最新版本
7. 查看 hello-world 的镜像
1 |
|
1 |
|
卸载docker
文档链接: uninstall-docker-engine
配置国内加速
镜像加速源
镜像加速器 | 镜像加速器地址 |
---|---|
Docker 中国官方镜像 | https://registry.docker-cn.com |
DaoCloud 镜像站 | http://f1361db2.m.daocloud.io |
Azure 中国镜像 | https://dockerhub.azk8s.cn |
科大镜像站 | https://docker.mirrors.ustc.edu.cn |
阿里云 | https:// |
七牛云 | https://reg-mirror.qiniu.com |
网易云 | https://hub-mirror.c.163.com |
腾讯云 | https://mirror.ccs.tencentyun.com |
docker 基本命令
帮助命令
1 |
|
官方文档命令指南:docker command line
个人还是很喜欢用命令行来帮助自己快速熟知具体命令,主要是因为是快且方便(因为文档是在国外)
镜像基本命令
docker images 查看本地主机上的镜像
1 |
|
1. 搜索镜像
1 |
|
比如:docker search node
1 |
|
或者去 docker Hub上去找:docker Hub 官网
2. 下载镜像
1 |
|
举例: 下载node
1 |
|
注: docker pull node === docker pull docker.io/library/node:latest
下载某个具体版本 注意:该版本必须是在dockerHub上存在的版本才行。
1 |
|
3. 删除镜像
1 |
|
骚操作:
1 |
|
容器基本命令
有了镜像才可以创建容器
1. 创建容器并启动
docker run –help 发现有太多参数了,举出常用的几个。
1 |
|
测试一下: 比如下载个centos镜像并创建容器并进入容器中
1 |
|
1 |
|
2. 列出所有容器
常用参数
1 |
|
3. 退出容器
在容器内如何退出?
- exit 退出并停止运行 (若不是用run命令进入的容器则只会退出)
- control + p control + q 只退出
4. 启动和停止容器操作
1 |
|
5. 删除容器
1 |
|
其他常用命令
1. 后台启动容器
1 |
|
注意有坑:
- 当你启动 centos时, 用 docker ps 查看发现并没有容器启动 (原因是因为docker发现该容器没有服务,docker自动将其停止了)
- 所以当 容器使用后台运行时,需要有一个前台进程
2. 查看日志
1 |
|
3. 查看容器中进程信息
docker top 容器id
1 |
|
1 |
|
4. 查看镜像源数据
docker inspect 容器id
1 |
|
5. 进入当前正在运行的容器
通常容器都是使用后台方式运行的,如需要进入容器,修改一些配置可以以下几种方式
方式一:docker exec -it 容器id
方式二:docker attach 容器id
区别:
- docker exec 进入容器后会开启一个新的终端,可以在里面操(常用)
- docker attach 进入容器正在执行的终端,不会启动新的进程
6. 从容器中拷贝文件到本地
1 |
|
1 |
|
docker 镜像
commit 镜像
由于从官方下载的一些镜像,有些不满足我们的需求,我们需要在该镜像上添加一些常用功能。这时我们就可以提交一个镜像,以后使用我们提交的这个镜像使得效率大大提高,要不然每次都需要在官方默认的镜像中添加我们常用的功能就很麻烦
1 |
|
实战测试tomcat
步骤:
- 启动一个默认的tomcat
- 发现这个默认的tomcat 是没有webapps应用,这是镜像的原因,官方的镜像默认 webapps 下是没有文件的
- 拷贝基本的文件到webapps目录
- 最后我们将操作过的容器通过commit提交为一个镜像,之后我们就使用提交过的镜像即可
数据卷 (volumes)
使用数据集实现容器的持久化和同步操作(容器间也可以实现数据共享)
Use volumes | Docker Documentation
常用命令
1 |
|
使用数据卷
方式一: 直接使用命令来挂载 -v (和 -p 一样, -v 主机目录:容器内目录)
数据同步:
1 |
|
当容器已经和本地映射后,当关掉容器后,即使在本地目录修改文件内容,再次启动容器时,依旧会同步
数据持久化: 即使把容器给删掉了,本地的文件依旧会有
具名挂载和匿名挂载
匿名挂载
1 |
|
具名挂载
1 |
|
总结
所有的docker容器内的数据卷,没有指定目的情况下都是默认在 /var/lib/docker/volumes/[匿名随机名/具名名字]/_data"
下的
我们通过具名可以方便的找到我们的卷,大多数情况使用的是具名挂载
1 |
|
拓展
1 |
|
如下面俩条命令
1 |
|
区别在与 ro
和 rw
顾名思义:
-
ro
即read only
只读 -
rw
即read write
可读写
数据卷容器
先略过
Dockerfile
dockerfile 用来构建 docker镜像的构建文件 命令参数脚本
构建步骤:
- 编写 dockerfile 文件
- docker build 构建为一个镜像
- docker run 运行镜像
- docker push 发布镜像 (Docker Hub 、 阿里云镜像仓库等等)
Dockerfile 构建过程
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 从上到下顺序执行
-
#
表示注释 - 每一个指令都创建提交一个新的镜像层,并提交
Dockerfile 常用命令
1 |
|
测试:
创建一个简单的centos加强版, 默认镜像里是没有 vim ifconfig 等命令的
1 |
|
CMD 和 ENTRYPOINT 的区别
CMD # 制定这个容器启动的时候运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试 CMD
1 |
|
测试 ENTRYPOINT
1 |
|
Docker 网络
1 |
|
lo: 本机回环地址
eth0: 服务器内网地址
docker0: docker内地址
docker 是如何处理容器网络访问的?
1 |
|
思考: 宿主机(linux)是否可以 ping 同 docker容器内部的ip
1 |
|
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要装了 docker,就会有一个网卡:docker0
docker网络是用的 桥接模式, 使用技术是 veth-pair 技术
再次测试 ip addr
1 |
|
结论
发现: 83: veth1597a88@if82 竟然和 内部容器ip地址:82: eth0@if83 是有联系的,
每产生一个容器,就会生产一对,
这其实就是 veth-pair 技术 ,即 一对的虚拟设备即可,它们都是成对出现的,一端连接着协议,一端彼此相连
正因为这个特性, veth-pair 充当一个桥梁,连接各种虚拟网络设备
容器互联
1 |
|
网络模式:
- bridge : docker默认桥接网络
- host : 主机网络,可以使用宿主机的网络栈,共享宿主机网络
- none : 不配置网络
测试:
1 |
|
自定义网络
1 |
|
测试
1 |
|
1 |
|
为什么使用自定义网络的原因:
- 主要是因为 docker0 的方式(无法直接通过容器名来连接, 当然配置 –link 也可以,不过这个不推荐了),
- 自定义容器可以将俩个容器都放在一个局域网内,使得这个俩个容器,使用容器名就可以通信了
测试
1 |
|
网络连通
docker network connect
测试
1 |
|
docker compose
官方文档:compose
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
Using Compose is basically a three-step process:
- Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere.- Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment.- Run
docker compose up
and the Docker compose command starts and runs your entire app. You can alternatively rundocker-compose up
using the docker-compose binary.
注意: compose
是docker 的开源项目,需要去安装的!
安装 compose
官方文档:compose install
1 |
|
未完…