docker学习笔记
弱小和无知不是生存的障碍,傲慢才是。
目录
[TOC]
环境准备
1 2 3 4
| 环境查看 uname -r cat /etc/os-release 查看官网文档进行安装
|
配置阿里云镜像加速
- 获取阿里云docker镜像加速链接后(根据阿里云提示配置加速器)
docker常用命令
帮助命令
1 2 3
| docker version #显示docker的详细信息 docker info #显示docker的系统信息,包括镜像和容器的数量 dokcer 命令 --help #帮助命令
|
镜像命令
1 2 3 4 5 6 7 8 9 10 11
| docker images #查看本地主机上的镜像 # 可选项 -a #列出全部 -q #只显示ID
docker search 镜像名 #搜索镜像
docker pull #下载镜像
docker rmi 镜像名 #删除镜像 可以跟多个镜像名以空格隔开 docker rmi $(docker images -aq)#删除所有镜像
|
容器命令
有了镜像才能创建容器
新建容器并启用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker run [可选参数] image
#参数说明 --name="name" #容器名字用来区分容器 -d #后台方式运行 -it #使用交互方式运行,进入容器查看内容 -p #指定容器的端口 -p 8080:8080 -p 主机端口:容器端口 -p 容器端口 -p ip:主机端口:容器端口 -P #随机端口
#从容器中退出主机 exit #容器不停止退出 ``ctrl+p+q``
|
列出所有运行的容器
1 2 3 4
| docker ps #与docker images -aq使用方法一致
# -n=数字
|
删除容器
1 2 3
| docker rm 容器id #删除指定的容器 dokcer rm $(docker ps -aq) #删除所有的容器 docker ps -aq|xargs docker rm #删除所有的容器
|
启动和停止的容器的操作
1 2 3 4
| docker start 容器ID #启动容器 docker restart 容器ID #重启容器 docker stop 容器ID #停止当前正在运行的容器 docker kill 容器ID #强制停止当前容器
|
常用的其他命令
后台启动容器
1 2 3
| # 命令 docker run -d centos #常见的坑,docker容器使用后台运行,就必须要有一个前台进程,dokcer发现没有应用,就会立即停止
|
查看日志命令
1 2 3 4
| docker logs #查看日志 #显示日志 -tf 显示日志加时间 --tail number #显示日志条数
|
查看容器内部的进程信息
查看镜像的元数据
在容器外往docker容器内写入命令可以用-c选项后面跟”命令”
进入正在运行的容器
1 2 3 4 5 6 7 8 9
| # 通常进入容器都是使用后台方式运行的,需要进入容器修改一些配置
# 命令 docker exec -it 容器ID /bin/bash # 命令2 docker attach 容器ID #退出容器,就会立即停止容器运行,通过ctrl+P+q
# #
|
从容器内拷贝文件到主机上
1 2 3 4
| # 语法格式 docker cp 容器ID:容器内路径 目的地主机路径
# 拷贝是一个手动的过程,可以使用-v数据卷的技术实现数据自动的同步
|
commint镜像
1 2 3
| dokcer commint 提交容器为一个新的副本
dokcer commint -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:版本
|
将打包好的镜像保存到本地
1
| docker save -o 命令的tar文件 镜像ID或名字
|
从本地加载docker镜像
1 2 3
| docker load -i 镜像的tar包 # 选项 -i # 指定加载的镜像
|
容器数据卷
为保证删除后容器数据丢失风险较大,可以使用docker数据卷技术实现数据的自动同步
并且删除容器后数据不会丢失,数据可以持久化,数据实时同步保存到本地
1 2 3 4 5 6 7 8 9
| # 端口映射 docker run -it -p 主机端口:容器内端口 镜像ID\镜像名
# 目录映射 dokcer run -it -v 主机目录:容器内目录 --name yyt 镜像ID\镜像名
# dokcer inspect 容器ID,查看容器的详细信息 # docker inspect 容器ID # dokcer inspect 容器ID
|
具名和匿名挂载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 匿名挂载 -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx 镜像ID # -v不指定主机路径直接写容器内部路径
# 这里发现不指定容器内目录的就是匿名挂载。我们在-v的时候只写了容器内的路径没有写容器外路径
dokcer volume ls #查看所有的卷的情况
-v 主机路径:容器内路径
dokcer run -d -P --name nginx02 -v /yyt:/etc/nginx 镜像ID #具名挂载
# docker volume inspect 跟上docker volume ls查出的卷ID 查看一下卷的地址
|
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以很方便的找到我们的一个卷,大多数情况我们都在使用的是”具名挂载“
不建议使用匿名挂载
1 2 3 4
| # 如何确定是具名挂载还是匿名挂载,还是指定路径挂载! -v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机路径:容器内路径 #指定路径挂载
|
拓展:
1 2 3 4 5 6 7 8 9 10 11
| -v yyt:/etc/nginx:ro #具名挂载
-v yyt:/etc/nginx:rw #具名挂载
ro #只读
rw #可读可写
一旦设定了容器权限,容器对我们挂载出来的内容就有限定了!
只要看到ro就说明只能通过宿主机来进行改变,容器内部是不能进行操作的
|
数据卷容器
多个mysql同步数据
1 2 3
| # 启动三个容器
docker run -it --name yyt --volumes-from 被继承父容器
|
初识Dockerfile
Dockerfile就是用来构建docker镜像的
通过脚本可以生成镜像,脚本就是一个命令,每个命令都是一层一层的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| Dockerfile指令说明简洁版:
FROM 构建镜像基于哪个镜像
MAINTAINER 镜像维护者姓名或邮箱地址
RUN 构建镜像时运行的指令
CMD 运行容器时执行的shell环境
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
USER 为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
WORKDIR 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
HEALTHCHECH 健康检查
ARG 构建时指定的一些参数
EXPOSE 声明容器的服务端口(仅仅是声明)
ENV 设置容器环境变量
ADD 拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
COPY 拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
ENTRYPOINT 运行容器时执行的shell命令
|
发布镜像
docker hub 注册账号
1 2 3 4
| docker login -u 用户名 -p 密码 # 登录完成后就可以提交镜像了
docker push 用户名/文件名:版本号
|
docker网络
ifconfig 或ip addr 查看网络信息
1 2 3 4 5 6 7
|
docker exec -it 容器ID ip addr
答案是肯定可以的
|
- 我们每启动一个容器,docker都会给容器分配一个IP 。我们只要安装了docker,就会有一个网卡docker0
- docker0使用了桥接的方式,桥接物理网卡进行上网
我们发现这些容器带来的网卡都是一对一对的,
evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
正因为有这个特性我们通常用evth-pair 充当一个桥梁,连接各种虚拟网络设备的
容器之间也是可以互相ping通的
网络模型演示图:
结论:tomcat01和tomcat02是共用一个路由器docker0
注意:
- 所有的容器在不指定网络的情况下,都是docker0路由的
- docker会给容器分配一个默认的可用IP
docker之间通信模型图:
容器互联
1 2 3
| dokcer run -d -P --name tomcat --link tomcat01 镜像ID或名字 反向ping的话就发现不能ping通
|
自定义网络不适应docker0,因为他不支持容器名连接访问
自定义网络
查看所有的docker网络
网络模式
brifge:桥接(默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络联通(用的少局限大)
1 2 3 4 5 6 7
| # 我们之前直接启动的命令模式其实是有一个--net birdge也就是我们默认的docker0 docker run -it --name tomcat01 --net bridge tomcat
# docker0的特点默认不支持域名访问,--link可以打通连接但是比较麻烦
# 自定义一个网络(推荐)
|
自定义一个网络
1
| dokcer network create --driver bridge --subnet 192.168.0.0、16 --gateway 192.168.0.1 my_yyt
|
启动容器
1
| docker run -d -P --name tomcat --net my_yyt tomcat
|
查看my_yyt的网卡配置信息
1
| docker network inspect my_yyt
|