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 #显示日志条数

查看容器内部的进程信息

1
docker top 容器ID

查看镜像的元数据

1
docker inspect 容器ID

在容器外往docker容器内写入命令可以用-c选项后面跟”命令”

进入正在运行的容器

1
2
3
4
5
6
7
8
9
# 通常进入容器都是使用后台方式运行的,需要进入容器修改一些配置

# 命令
docker exec -it 容器ID /bin/bash
# 命令2
docker attach 容器ID #退出容器,就会立即停止容器运行,通过ctrl+P+q

## 两个区别exec进入容器后会打开一个新的终端可以在里面操作(常用),
## attach进入容器正在执行的终端不会启动新的进程

从容器内拷贝文件到主机上

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如何处理容器网络访问的

docker exec -it 容器ID ip addr #查看容器内部网络地址

# 宿主机可以ping通容器内部吗?
答案是肯定可以的

  • 我们每启动一个容器,docker都会给容器分配一个IP 。我们只要安装了docker,就会有一个网卡docker0
  • docker0使用了桥接的方式,桥接物理网卡进行上网

我们发现这些容器带来的网卡都是一对一对的,

evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连

正因为有这个特性我们通常用evth-pair 充当一个桥梁,连接各种虚拟网络设备的

容器之间也是可以互相ping通的

网络模型演示图:

image-20221003202510815

结论:tomcat01和tomcat02是共用一个路由器docker0

注意:

  • 所有的容器在不指定网络的情况下,都是docker0路由的
  • docker会给容器分配一个默认的可用IP

docker之间通信模型图:

image-20221003202920515

容器互联

1
2
3
# --link
dokcer run -d -P --name tomcat --link tomcat01 镜像ID或名字
反向ping的话就发现不能ping通

自定义网络不适应docker0,因为他不支持容器名连接访问

自定义网络

1
docker network  --help

查看所有的docker网络

1
docker network ls

网络模式

brifge:桥接(默认)

none:不配置网络

host:和宿主机共享网络

container:容器网络联通(用的少局限大)

1
2
3
4
5
6
7
# 我们之前直接启动的命令模式其实是有一个--net birdge也就是我们默认的docker0
docker run -it --name tomcat01 --net bridge tomcat

# docker0的特点默认不支持域名访问,--link可以打通连接但是比较麻烦

# 自定义一个网络(推荐)

image-20221003205735226

自定义一个网络

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