Docker 学习
docker学习
安装 docker
环境查看
1 | 系统内核 |
安装
1 | 卸载旧版本的 所有docker 信息 |
启动 docker服务
1 | 启动 |
更新Docker
1 | # 卸载以前的版本 |
docker 常用的命令
帮助命令
1 | docker version #显示docker的版本信息 |
镜像命令
1 | docker images #查看所有镜像 |
容器命令
1 | docker pull centos |
新建容器并启动
1 | docker run [可选参数] image |
列出所有运行的容器
1 | docker ps 命令 |
推出容器
1 | exit # 容器停止并退出 |
删除容器
1 | docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,如果需要强制删除, rm -f |
启动和停止容器的操作
1 | docker start 容器id # 启动容器 |
常用的其他命令
后台启动容器
1 | 命令 docker run -d 镜像名! |
查看日志
docker 安装 nginx
1 | 1.搜索镜像 search |
docker 安装 tomcat
1 | 官方使用的方法 |
docker 部署 es + kibana
1 | es 暴露的端口很懂 |
commit 镜像
1 | docker commit 提交容器称为一个新的副本 |
容器数据卷
什么是容器数据卷
容器之间可以有一个数据共享的技术,Docker容器产生的数据,同步到本地
这就是卷技术! 目录的挂载,将我们容器内的目录,挂载到Linux上面
总结:容器的持久化和同步操作,容器将数据共享
使用数据卷
方式一:直接使用命令来挂载 -v
1 | docker run -it -v 主机目录:容器内目录 -p |
好处:只需要修改宿主机上面的配置,容器内会自动同步
实战 : 安装 mysql
1 | 获取镜像 |
具名和匿名挂载
1 | 匿名挂载 |
拓展
1 | 通过 -v 容器路径 ro rw 改变读写权限 |
DockerFile 就是用来构建docker镜像的构建文件 命令脚本
通过脚本可以生成镜像 镜像是一层一层的, 脚本一个个的命令,每个命令都是一层
1 | 创建一个dockerfile文件 名称可以随机 建议 Dockerfile |
启动自己写的容器
1 | [root@Master docker-test-volume]# docker run -it 89c3e5a2dda3 /bin/bash |
同时这个卷和外部一定有一个同步的目录
查看挂载卷的路径
1 | [root@Master ~]# docker inspect 8bdefa71c931 |
这种方式使用十分多,
如果构建镜像的时候没有挂在卷 需要手动镜像挂载 -v 卷名:容器内路径
数据卷容器
多个容器同步数据 !
1 | 启动3个容器 通过自己写的镜像启动 |
多个mysql同步数据 !
1 | docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysq -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7 |
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
一旦 持久化到本地,本地的数据不会删除
DockerFile
DockerFile 介绍
DockerFile 就是用来构建docker镜像的构建文件 命令脚本
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub 、阿里云镜像仓库等)
1 | eg |
DockerFile构建过程
基础知识
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每个指令都会创建提交一个新的镜像层,并提交!
dockerfile 是面向开发的,做镜像需要编写dockerfile,这个文件十分简单
Docker镜像逐渐成为企业交付的标准,必须要掌握
步骤:开发、部署、运维等
dockerfile :构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品
Docker容器:容器就是镜像运行起来提供服务器
DockerFile的指令
1 | FROM # 基础镜像 一切从这里开始构建 |
实战测试
Docker Hub中99%的镜像都是从这个基础镜像过来的FROM scratch
,然后配置需要的软件和配置来进行的构建
创建一个自己的CentOS
1 | 1.编写DockerFile 文件 |
列出本地镜像的变更历史
1 | 命令 docker history 镜像id |
CMD 和 ENTRYPOINT 的区别
1 | CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代(覆盖) |
测试 cmd
1 | 编写 dockerfile 文件 |
测试 ENTRYPOINT
1 | 创建脚本 |
实战 : Tomcat 镜像
准备镜像文件 tomcat压缩包 jdk的压缩包
1
2
3
4[root@Master tomcat]# ll
总用量 198264
-rw-r--r--. 1 root root 11200905 6月 30 14:46 apache-tomcat-9.0.36.tar.gz
-rw-r--r--. 1 root root 191817140 6月 30 14:46 jdk-8u201-linux-x64.tar.gz编写dockerfile文件 官方命名
Dockerfile
build会自动寻找这个文件,就不需要 -f 指定了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
26FROM centos
MAINTAINER jiang<1845124851@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u201-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.36.tar.gz /usr/local/
RUN yum -y install nano
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASS_PATH $JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.36
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.36
ENV PATH $PATH:$JAVA_HOME/bin;$CATALINA_HOME/lib;CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.36/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.36/bin/logs/catalina.out构建镜像
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99docker build -t diytomcat .
结果
[root@Master tomcat]# docker build -t diytomcat .
Sending build context to Docker daemon 203MB
Step 1/15 : FROM centos
831691599b88
Step 2/15 : MAINTAINER jiang<1845124851@qq.com>
Using cache
114da438a7cc
Step 3/15 : COPY readme.txt /usr/local/readme.txt
faa2aca474e1
Step 4/15 : ADD jdk-8u201-linux-x64.tar.gz /usr/local/
097ef9175123
Step 5/15 : ADD apache-tomcat-9.0.36.tar.gz /usr/local/
94e4e44a089f
Step 6/15 : RUN yum -y install nano
Running in 39596d95401e
CentOS-8 - AppStream 1.8 MB/s | 5.8 MB 00:03
CentOS-8 - Base 564 kB/s | 2.2 MB 00:04
CentOS-8 - Extras 7.1 kB/s | 6.7 kB 00:00
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
nano x86_64 2.9.8-1.el8 BaseOS 581 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 581 k
Installed size: 2.2 M
Downloading Packages:
nano-2.9.8-1.el8.x86_64.rpm 527 kB/s | 581 kB 00:01
--------------------------------------------------------------------------------
Total 117 kB/s | 581 kB 00:04
warning: /var/cache/dnf/BaseOS-f6a80ba95cf937f2/packages/nano-2.9.8-1.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - Base 1.1 MB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : nano-2.9.8-1.el8.x86_64 1/1
Running scriptlet: nano-2.9.8-1.el8.x86_64 1/1
Verifying : nano-2.9.8-1.el8.x86_64 1/1
Installed:
nano-2.9.8-1.el8.x86_64
Complete!
Removing intermediate container 39596d95401e
89b6438bbe17
Step 7/15 : ENV MYPATH /usr/local
Running in f06501462526
Removing intermediate container f06501462526
8fc6958b3a6e
Step 8/15 : WORKDIR $MYPATH
Running in fa73a1455658
Removing intermediate container fa73a1455658
1f69bc61e000
Step 9/15 : ENV JAVA_HOME /usr/local/jdk1.8.0_201
Running in 7e6048372716
Removing intermediate container 7e6048372716
bf3d54c57702
Step 10/15 : ENV CLASS_PATH $JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar
Running in bb1a6c75c0d9
Removing intermediate container bb1a6c75c0d9
c5f2ecf75b2f
Step 11/15 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.36
Running in d9ee2e27d984
Removing intermediate container d9ee2e27d984
a0dcffe52231
Step 12/15 : ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.36
Running in 461799d608d1
Removing intermediate container 461799d608d1
d2496591c7bd
Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin;$CATALINA_HOME/lib;CATALINA_HOME/bin
Running in 4ca62fc3160d
Removing intermediate container 4ca62fc3160d
b17bfc8ba17f
Step 14/15 : EXPOSE 8080
Running in b4505c081a84
Removing intermediate container b4505c081a84
ed9783956463
Step 15/15 : CMD /usr/local/apache-tomcat-9.0.36/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.36/bin/logs/catalina.out
Running in 763c88837e33
Removing intermediate container 763c88837e33
67cbdc4556d3
Successfully built 67cbdc4556d3
Successfully tagged diytomcat:latest启动镜像
1
docker run -d -p 9090:8080 --name jiangtomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.36/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.36/logs diytomcat
访问测试
发布项目
1
2
3
4
5
6
7
8
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("----- my test web logs-----");
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>
发布镜像
Docker Hub
1 | docker login 命令登录docker |
提交到阿里云镜像服务器上
登录阿里云
找到容器镜像服务
创建命名空间
创建容器镜像
1
2
3
4
5
6
7
8登录阿里云docker 如果不能登录,访问 https://cr.console.aliyun.com/cn-hangzhou/instances/credentials 设置固定密码
docker login --username=1845124851@qq.com registry.cn-hangzhou.aliyuncs.com
先在本地创建版本信息 貌似 registry.cn-hangzhou.aliyuncs.com/jnssd 是配置的提交的地址 如果不配置,好像是提交到了docker hub上面去了
docker tag 67cbdc4556d3 registry.cn-hangzhou.aliyuncs.com/jnssd/jnssd:1.0
镜像的提交
docker push registry.cn-hangzhou.aliyuncs.com/jnssd/jnssd:1.0镜像的拉取
1
docker pull registry.cn-hangzhou.aliyuncs.com/jnssd/jnssd:[镜像版本号]
Docker 网络
理解Docker0
清空所有docker容器和镜像
1 | 清空容器 |
测试
1 | 启动一个tomcat |
原理
我们每启动一个docker 容器,docker就会给docker容器分配一个ip,我们只要安装一个docker,就会有一个网卡docker0(桥接模式),使用的技术是evth-pair技术!
再启动一个容器测试,发现又多了一对网卡
1
2
3
4
5
6
7
8
97: vethf0db58b@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether ae:42:be:a2:a2:c3 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::ac42:beff:fea2:a2c3/64 scope link
valid_lft forever preferred_lft forever
我们发现这个容器带来的网卡,都是一对对的
evth-pari 就是一对的虚拟设备接口,他们都是成都出现的,一段连着协议,一段彼此相连
因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair 技术测试下tomcat01和tomcat02相互是否能够ping通
1
2
3
4
5
6
7
8
9
10
11
12[root@Master ~]# docker exec -it tomcat01 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.202 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.055 ms
64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.056 ms
^C
--- 172.17.0.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.055/0.093/0.202/0.062 ms
结论 容器和容器之间是可以相互ping通的结论:tomcat01 和tomcat02 都是共用的一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给容器分配一个默认的可用IP
小结
Docker 使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0
Docker 中的所有网络接口都是虚拟的,虚拟的转发效率高
只要容器删除,对应的网桥就删除了
–link
1 | [root@Master ~]# docker exec -it tomcat01 ping tomcat02 |
本质探究:–link就是在hosts配置增加了一个172.17.0.3 tomcat02 babe95100fbe
但是在tomcat02中没有配置,如果需要访问,需要在启动时都使用–link连接,效率低下,不见建议使用 –link
自定义网络,不使用 docker0
docker0 问题:不支持容器名
自定义网路
查看所有的docker网路
1 | [root@Master ~]# docker network ls |
网路模式
bridge:桥接docker (默认,自己框架也是用bridge模式)
none:不配置网络
host:和宿主机共享网络
container:容器网络互通(用的少,局限大)
测试
1 | 直接命令启动 --net bridge 这个就是docker0 |
自定义的网络 docker 都已经帮我们维护好了对应的关系,推荐这样使用网络
好处:
redis - 不同的集群使用不同的网络,保证集群的安全和健康
mysql - 不同的集群使用不同的网络,保证集群的安全和健康
网络连通
1 | 测试 docker0 连接mynet |
结论:假设需要款网络操作别人,就需要docker network connect 连通
实战:部署redis 集群
1 | 1.创建一个redis的网卡 |
SpringBoot 打包 docker 镜像
- 构建springboot项目
- 打包应用
- 编写dockerfile
- 构建镜像
- 发布运行