Docker学习笔记-基本
Docker学习笔记
基本概念
镜像(image):docker镜像就是一个模板,可以通过这个镜像来创建容器服务。
容器(container):把容器理解为简易的linux,独立的运行一个或一组应用,通过镜像来创建
仓库:存放镜像的位置,分为公有和私有
安装Docker
环境准备
Linux环境
1 | [root@centos7vm ~]# uname -r |
安装
1 | # 1. 卸载旧版本 |
1 | # 8. 查看下载的helloworld镜像 |
阿里云镜像加速
1 | sudo mkdir -p /etc/docker |
底层原理
Docker是怎么工作的?
Docker是一个Client-server结构的系统,Docker守护进程运行在主机上,通过Socket从客户端访问。
DockerServer接收到Docker-client的指令,就会执行这个命令。
Docker为什么比VM快?
- Docker比虚拟机更少的抽象层
- Docker利用的是宿主机的内核,vm需要的是Guest os
所以,新建一个容器的时候,Docker不需要像虚拟机一样重新加载一个操作系统,避免引导。虚拟机是加载Guest os,分钟级别,而Docker是利用宿主机的操作系统 ,省略这个过程,秒级。
Docker常用命令
帮助命令
1 | docker version # 版本信息 |
镜像命令
docker images 查看所有本地的主机上的镜像
1 | [root@centos7vm docker]# docker images |
docker search 搜索镜像
1 | [root@centos7vm docker]# docker search mysql |
docker pull 下载镜像
1 | [root@centos7vm docker]# docker pull mysql |
docker rmi 删除镜像
1 | [root@centos7vm docker]# docker rmi -f db2b37ec6181 # 删除指定镜像 |
容器命令
说明:我们有了镜像才能创建容器,下载一个centos测试学习
1 | docker pull centos |
新建容器并启动
1 | docker run [可选参数] image |
退出容器
1 | exit # 停止容器并退出 |
列出所有运行容器
1 | docker ps 命令 |
删除容器
1 | docker rm 容器id # 删除指定容器 |
启动和停止容器的操作
1 | docker start 容器id #启动容器 |
后台启动容器
1 | docker run -d centos |
查看日志
1 | docker logs |
查看容器中进程信息
1 | # 命令 docker top 容器id |
查看镜像元数据
1 | [root@centos7vm docker]# docker inspect --help |
进入当前运行的容器
1 | # 容器通常都是后台运行,需要进入容器修改一些配置 |
从容器内拷贝文件到主机上
1 | docker cp 容器ID:容器内路径 目的主机路径 |
练习
安装Nginx
1 | # 1. 搜索镜像 建议在Docker Hub上搜索 能够看到详细信息 |
安装tomcat
1 | # 官方的使用 |
部署es+kibana
1 | # es占内存多 |
1 | [root@centos7vm ~]# curl localhost:9211 |
可视化
- portainer
- Rancher(CI/CD再用)
什么是portainer?
Docker图形化界面管理工具,提供一个后台面板
1 | [root@centos7vm ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer-ce |
commit 镜像
1 | docker commit 提交容器成为一个新的副本 |
练习
1 | 启动一个默认的tomcat |
容器数据卷
什么是数据卷
容器内的目录映射到外部目录,为了容器的持久化和同步操作,容器间数据能够共享
使用数据卷
方式一:使用命令挂载 -v
1 | docker run -it -v 主机目录:容器内目录 -p 主机端口:容器端口 |
其中source是主机内的地址,Destination是容器内的地址
1 | 测试 |
之后修改直接在本地修改
练习 安装mysql
1 | # 下载镜像 |
具名挂载和匿名挂载
1 | # 匿名挂载 |
拓展
1 | 通过 -v 容器内路径 ro rw 改变读写权限 |
初识DockerFile
方式二:使用DockerFile挂载
通过dokerFile这个脚本可以生成镜像,每个命令都是一层
1 | # vim dockerfile01内容 |
最后两个卷一定与外部有同步的。
没有写名字,这是匿名挂载
查看容器属性,确定是匿名挂载
这种使用方式非常多,如果构建镜像的时候没有挂载,就要手动挂载 -v 卷名:容器内路径。
数据卷容器
两个mysql之间同步数据
1 | # 启动容器,通过自己写的镜像启动 |
1 | # 再新建一个容器,从docker01中继承数据卷 |
多个mysql数据共享
1 | [root@centos7vm ~]# docker run -d -p 3310:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123 --name mysql01 mysql:5.7 |
DockerFile
基本知识
DockerFile是用来构建Docker镜像的文件,是一种命令参数脚本
构建步骤:
- 编写一个dockerfile文件
- docker build构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(Docker Hub、阿里云镜像仓库)
dockerfile构建过程
基础知识:
- 保留关键字(指令)都必须是大写字母
- 指令顺序执行
- # 表示注释
- 每一个指令都是一个镜像层
DockerFile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件。
DockerFile: 构建文件,定义了一切步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务的
DockerFile命令
1 | FROM # 基础镜像,一切从这里开始构建 |
这里放的图片比较多,更全面的写展示各种命令
实战测试
Docker Hub中绝大多数镜像都是从基础镜像过来的FROM scratch,然后配置需要的软件和环境
1 | # 创建自己的centos |
CMD 和 ENTRYPOINT区别
CMD 只有最后一个CMD会生效
测试cmd
1 | # dockerfile文件内容 |
测试entrypoint
1 | # dockerfile文件内容 |
练习:TomCat镜像
准备压缩文件
编写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
23FROM centos
MAINTAINER halcoke<halfcoke@163.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u271-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.39.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.39
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.39/bin/startup.sh && tail -F /usr/localapache-tomcat-9.0.39/bin/logs/catalina.out构建镜像
1
docker build -t diytomcat .
启动镜像
访问测试
发布项目
1
2
3
4
5
6
7
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<%@ 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/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>发布镜像
发布到阿里云
参考阿里云官方文档
小结
Docker网络
理解Docker0
docker生成的网卡
1 | # docker 是如何处理网络链接的 |
原理
每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个docker0
启动一个容器后,会多出一对网卡,容器内一个,主机上一个
我们先这个容器网卡,都是一对一对的
evth-pair就是一对虚拟设备接口,他们都是成对出现的,
evth-pair充当一个桥梁,链接各种虚拟网络设备
- 两个容器之间也能够ping通
1 | # 使用tcpdump 抓包 |
evth-pair有点类似于一个虚拟交换机,为每个虚拟设备建立一对端口,虚拟设备上一个,宿主机上一个,相当于用网线链接起来。参考链接
–link
容器之间不通过ip可以互相ping通
1 | # 直接ping无法ping通 |
现在不建议使用–link
docker0问题,不支持容器名链接访问
自定义网络
1 | # 查看所有的网络模式 |
网络模式
bridge: 桥接
none:不配置网络
host:和宿主机共享网络
container:容器内网络连通
测试
1 | # 是默认增加了--net bridge, 这个就是docker0 |
1 | # 添加两个容器 |
我们自定义网络都已经帮我们维护好了对应的关系,推荐使用。
好处:
不同集群使用不同网络,这样能保证网络健康
网络连通
测试打通
1 | [root@centos7vm ~]# docker network connect mynet tomcat03 |
结论,假设跨网络操作,就需要这么操作。
Redis集群
1 | # 创建redis配置文件 |
Docker Compose
介绍
定义运行多个容器
YAML file配置文件
single command 命令?
使用compose三个步骤
官方说明:
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 Compose starts and runs your entire app.
dockerfile
保证我们的项目在任何地方都可以运行
docker-compose.yaml怎么写
使用docker-compose up命令启动compose
其他介绍
compose 是docker官方的开源项目,需要安装。
docker-compose.yml
文件格式:
1 | version: "3.8" |
Compose:重要的概念
- 服务service:容器,应用
- 项目project。一组关联的容器。
安装
1 | sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose |
练习
yaml规则
docker-compose.yml
核心
1 | # 3层 |
Docker Swarm
创建Swarm集群
1 | # docker swarm init 初始化一个集群 |
创建服务
1 | [root@docker-0 ~]# docker service --help |
概念总结
swarm
集群的管理和编号,docker可以初始化一个集群,其他节点可以加入
Node
就是一个docker节点,多个节点就组成了一个网络集群(管理者,工作者)
Service
任务,可以在管理节点或工作节点来运行,