文章目录
- 1.Docker 学习
- 2.Docker 概述
- 3.Docker安装
- 4 Docker常用命令
- 5 docker可视化面板、docker镜像加载原理(UnionFS)
- Docker入门结束
- 6 容器数据卷
1.Docker 学习
弱小和无知不是生存的障碍,傲慢才是。
- Docker 概述
- Docker 安装
- Docker 命令
- 镜像命令
- 容器命令
- 操作命令
- …
- Docker镜像
- 容器数据卷
- Docker网络原理
- IDEA整合Docker
- Docker Compose
- Docker Swarm
- CI\CD Jenkins
知道的越多,不知道的越多
2.Docker 概述
2.1 Docker出现的理由
java ---- jar(环境) ---- 打包项目带上环境(镜像) ---- (Docker仓库:商店)---- 其他人下载我们发布的镜像
Docker的思想就来源于集装箱!
2.2 Docker的历史
Docker来源于2010年美国成立的一家做pass与计算,LXC有关的容器技术公司,他们将自己的容器化技术命名成Docker,2013年开源爆火。在容器化技术出现前,我们都是使用虚拟机技术。
虚拟机: 在window中装一个 Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑! 很笨重!
虚拟机也是属于虚拟化技术,Docker 容器技术,也是一种 虚拟化技术!
- docker:隔离, 镜像(最核心的环境 4m + dk + mysgl)十分的小巧, 运行像就可以了!
- VM几个G,笨重
2.3 Docker能干嘛
Docker:能打包镜像发布测试,一键运行
虚拟机技术缺点
- 资源占用十分多
- 几余步骤多
- 启动很慢!
注意容器化技术:容器化技术不是模拟的一个完整的操作系统
Docker技术示例
Docker是内核级别的虚拟化
比较Docker 和 虚拟机技术的不同 :
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件,
- 容器内的应用直接运行在 宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了每个容器间是互相隔离,
- 每个容器内都有一个属于自己的文件系统,互不影响。
3.Docker安装
3.1 Docker的基本组成
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===> run ==> tomat01 容器(提供服务器),通过这个镜像可以创建多个容器( 最终服务运行或者项目运行就是在容器中的 )。
容器(containe):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令 !
可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub( 默认是国外的)
阿里云…都有容器服务器(配置镜像加速 !)
3.2 安装步骤(演示Centos7)
硬件要求:系统内核要求3.10以上
3.2.1环境检查
# 内核要求3.10以上
[root@VM-8-16-centos home]# uname -r
3.10.0-1160.71.1.el7.x86_64
[root@VM-8-16-centos home]#
# 系统版本
[root@VM-8-16-centos home]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@VM-8-16-centos home]#
3.2.2 开始安装检查卸载Docker
Docker帮助文档
检查卸载Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3.2.2安装需要的依赖包
yum install -y yum-utils
3.2.3 设置镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.2.4 更新yum软件包索引
yum makercache fast
3.2.5 安装最新版Docker引擎 (ce社区版本,ee企业版)
sudo yum install docker-ce docker-ce-cli containerd.io
3.2.6 启动Docker
sudo systemctl start docker
3.2.7 检查是否安装成功
docker version
[root@VM-8-16-centos home]# docker version
Client: Docker Engine - Community
Version: 20.10.22
API version: 1.41
Go version: go1.18.9
Git commit: 3a2c30b
Built: Thu Dec 15 22:30:24 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.22
API version: 1.41 (minimum version 1.12)
Go version: go1.18.9
Git commit: 42c8b31
Built: Thu Dec 15 22:28:33 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.15
GitCommit: 5b842e528e99d4d4c1686467debf2bd4b88ecd86
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@VM-8-16-centos home]#
3.2.8 hello-world命令测试
docker run helle-world
3.2.9 查看镜像是否存在
docker images
3.2.10 配置阿里云容器镜像
3.3回顾HelloWorld流程
3.4 底层原理
Docker是什么工作的?
Docker 是一个 Client- Server 结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer 接收到 Docker-Client 的指令,就会执行这个命令 !
Docker 为什么比 VM 快?
1、Docker有着比虚拟机更少的抽象层。
2、docker 利用的是宿主机的内核,vm 需要是 Guest os.
4 Docker常用命令
4.1 帮助命令
docker version #版本信息
docker info #显示Docker的系统消息
docker 命令 --help #万能命令
4.2 镜像命令
docker images
[root@VM-8-16-centos home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 16 months ago 231MB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大下
# 可选项
-a, --all # 列出所有
-q, --quiet # 只显示镜像的id
docker search 搜索模拟
docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13672 [OK]
mariadb MariaDB Server is a high performing open sou… 5224 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 718 [OK]
percona Percona Server is a fork of the MySQL relati… 598 [OK]
bitnami/mysql Bitnami MySQL Docker Image 80 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 78
linuxserver/mysql-workbench 47
ubuntu/mysql MySQL open source fast, stable, multi-thread… 41
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 38
circleci/mysql MySQL is a widely used, open-source relation… 28
google/mysql MySQL server for Google Compute Engine 22 [OK]
rapidfort/mysql RapidFort optimized, hardened image for MySQL 13
bitnami/mysqld-exporter 4
ibmcom/mysql-s390x Docker image for mysql-s390x 2
vitess/mysqlctld vitess/mysqlctld 1 [OK]
newrelic/mysql-plugin New Relic Plugin for monitoring MySQL databa… 1 [OK]
hashicorp/mysql-portworx-demo 0
rapidfort/mysql-official RapidFort optimized, hardened image for MySQ… 0
docksal/mysql MySQL service images for Docksal - https://d… 0
mirantis/mysql 0
rapidfort/mysql8-ib RapidFort optimized, hardened image for MySQ… 0
cimg/mysql 0
eclipse/mysql Mysql 5.7, curl, rsync 0 [OK]
drud/mysql 0
silintl/mysql-backup-restore Simple docker image to perform mysql backups… 0 [OK]
[root@VM-8-16-centos home]#
搜索出来的镜像就是STARTS大于3000
docker serach mysql --filter=STARS=3000
docker pull 下载镜像
docker pull mysql
# 下载镜像 docker pu11 镜像名[:tag]
[root@VM-8-16-centos home]# docker pull mysql
Using default tag: latest #如果不写tag,默认是lastest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载 docker image的核心文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
docker rmi 删除镜像
docker rmi -f 容器id # 删除指定的容器
docker rm $(docker ps -aq)# 删除全部容器
4.3 容器命令
创建容器,本地没有,就会在docker上搜索
docker pull centos
新建容器并启动
docker run
# 参数说明
--name="Nmae" 容器名称 tomcat01 tomcat02,用来区别容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
# 测试,启动并进入容器
[root@VM-8-16-centos home]# docker run -it centos /bin/bash
Citl+P+Q 退出容器虚拟机
[root@eb0cf00aec92 /]# [root@VM-8-16-centos home]# ls
jiaoxin1112 jiaoxin.java lighthouse test.java
[root@VM-8-16-centos home]#
4.4 常用其他命令
4.4.1 进入当前正在运行的容器
#通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id bashShell
# 测试
```
[root@VM-8-16-centos /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30a700d4723b centos "/bin/sh -c 'while t…" 9 minutes ago Up 9 minutes nostalgic_mcnulty
[root@VM-8-16-centos /]# docker exec -it 30a700d4723b /bin/bash
[root@30a700d4723b /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@30a700d4723b /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:48 ? 00:00:00 /bin/sh -c while true;do echo jiaxin;sleep 1;done
root 590 0 0 07:57 pts/0 00:00:00 /bin/bash
root 628 1 0 07:58 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 629 590 0 07:58 pts/0 00:00:00 ps -ef
[root@30a700d4723b /]#
# 方式二
docker attach 容器id
#测试
[root@VM-8-16-centos ~]# docker attach 30a700d4723b
正在执行当前代码...
# docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach #进入容器正在执行的终端,不会启动新的进程
4.4.2 从容器内拷贝文件到主机
dockers cp 容器id:容器内路径 目的主机路径
[root@VM-8-16-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-8-16-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 16 months ago 231MB
[root@VM-8-16-centos ~]# docker run -it centos /bin/bash
[root@dfc6bc41d8ae /]# [root@VM-8-16-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dfc6bc41d8ae centos "/bin/bash" 11 seconds ago Up 11 seconds zealous_liskov
[root@VM-8-16-centos ~]# cd /home/
[root@VM-8-16-centos home]# ls
jiaoxin1112 lighthouse
[root@VM-8-16-centos home]# touch jiaoxin.java
#查看当前主机目录下
[root@VM-8-16-centos home]# ls
jiaoxin1112 jiaoxin.java lighthouse
[root@VM-8-16-centos home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dfc6bc41d8ae centos "/bin/bash" About a minute ago Up About a minute zealous_liskov
#进入docker容器内部
[root@VM-8-16-centos home]# docker attach dfc6bc41d8ae
[root@dfc6bc41d8ae /]# d /home/
bash: d: command not found
[root@dfc6bc41d8ae /]# cd /home/
[root@dfc6bc41d8ae home]# ls
#在容器内新建一个文件
[root@dfc6bc41d8ae home]# touch test.java
[root@dfc6bc41d8ae home]# exit
exit
[root@VM-8-16-centos home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-8-16-centos home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 16 months ago 231MB
#将这文件拷贝到主机上
[root@VM-8-16-centos home]# docker cp 5d0da3dc9764:/home/test.java /home
Error: No such container:path: 5d0da3dc9764:/home/test.java
[root@VM-8-16-centos home]# docker attach dfc6bc41d8ae
You cannot attach to a stopped container, start it first
[root@VM-8-16-centos home]# docker cp dfc6bc41d8ae:/home/test.java /home
[root@VM-8-16-centos home]# ls
jiaoxin1112 jiaoxin.java lighthouse test.java
[root@VM-8-16-centos home]#
# 拷贝是一个手动的过程,未来我们可以使用 -V 卷的技术,可以实现,自动同步 /home /home
4.4.3 设置docker镜像自动启动
docker update --restart=always 镜像名/镜像id
4.5 案例练习
4.5.1 docker部署Nginx
Docker 安装Nginx
4.5.1.1 搜索镜像
docker search nginx #搜索镜像
4.5.1.2 下载镜像
docker pull nginx #下载镜像
4.5.1.3 查看是否下载成功
docker images #查看是否下载成功
4.5.1.4 运行容器
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口,暴露容器内部端口
[root@VM-8-16-centos ~]# docker run -d --name nginx01 -p:3344:80 nginx #运行镜像并给容器命名,不命名就是默认名称,给一个运行端口3344,并映射nginx的80端口
a4b53450f356b2f2f711e26dd36ce429c764329373a45ec56d42f06b89ed415e
[root@VM-8-16-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 12 months ago 141MB
mysql latest 3218b38490ce 13 months ago 516MB
centos latest 5d0da3dc9764 16 months ago 231MB
[root@VM-8-16-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4b53450f356 nginx "/docker-entrypoint.…" 31 seconds ago Up 28 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
eb0cf00aec92 centos "/bin/bash" 7 days ago Up 7 days jovial_hertz
[root@VM-8-16-centos ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
4.5.1.4.1 docker run -d --name nginx01 -p:3344:80 nginx
命令解释
4.5.1.5 进去容器
docker exec -it nginx01 /bin/bash
-it 直接进去运行
[root@VM-8-16-centos ~]# docker exec -it nginx01 /bin/bash #进入容器运行窗口
root@a4b53450f356:/# whereis nginx #查看容器位置
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@a4b53450f356:/# cd /etc/nginx/ #进入Nginx配置目录
root@a4b53450f356:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@a4b53450f356:/etc/nginx#
4.5.1.6 测试完毕退出容器并停止,Nginx服务
root@a4b53450f356:/etc/nginx# exit #退出容器
exit
[root@VM-8-16-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4b53450f356 nginx "/docker-entrypoint.…" 23 minutes ago Up 23 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
eb0cf00aec92 centos "/bin/bash" 7 days ago Up 7 days jovial_hertz
[root@VM-8-16-centos ~]# docker stop a4b53450f356 #停止docker服务
a4b53450f356
[root@VM-8-16-centos ~]#
思考问题:我们每次改动nginx配置文件,都需要进入容器内部?我要是可以在容器外部提供一个映射路径,达到在容器修改文件名加粗样式,容器内部就可以自动修改 ? - v 数据卷技术 !
4.5.2 docker部署tomcat
docker 安装tomcat
4.5.2.1 下载最新版tomcat
docker pull tomcat
4.5.2.2 启动运行tomcat
- -d:后台运行
- -p 3344:8080:指定端口。外部端口3344映射到tomcat的内部端口8080
- –name:指定tomcat名称
docker run -d -p 3344:8080 --name tomcat01 tomcat
4.5.2.3 访问测试,可以访问到端口
官方提供的tomcat是阉割版的,所以404
4.5.2.4 进入容器
docker exec -it tomcat01 /bin/bash
4.5.2.5 发现问题
- 1、linux,命令少了
- 2.、没有webapps,阿里云镜像的原因,默认是最小的镜像。所有不必要的镜像都剔除。保证最小可运行环境。
tomcat# ll
bash: ll: command not found
root@9235c24f455e:/usr/local/tomcat# cd webapps
root@9235c24f455e:/usr/local/tomcat/webapps# ll
bash: ll: command not found
root@9235c24f455e:/usr/local/tomcat/webapps# ls
root@9235c24f455e:/usr/local/tomcat/webapps# ls -al
total 12
drwxr-xr-x 2 root root 4096 Dec 22 2021 .
drwxr-xr-x 1 root root 4096 Dec 22 2021 ..
4.5.2.6 解决问题
4.5.2.6.1 查看tomcat目录结构,发现有个webapps.dist文件夹,进入其中查看,发现有tomcat所需支持
cd tomcat/
root@9235c24f455e:/usr/local/tomcat# ll
bash: ll: command not found
root@9235c24f455e:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp work
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist
root@9235c24f455e:/usr/local/tomcat# cd webapps.dist/
root@9235c24f455e:/usr/local/tomcat/webapps.dist# ll
bash: ll: command not found
root@9235c24f455e:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
4.5.2.6.2 两个解决方法,一个是更改此文件夹名,另一个是把此文件夹底下所有文件复制至webapps,此处演示后一种
cp -r webapps.dist/* webapps
root@9235c24f455e:/usr/local/tomcat# cp webapps.dist/* webapps
cp: -r not specified; omitting directory 'webapps.dist/ROOT'
cp: -r not specified; omitting directory 'webapps.dist/docs'
cp: -r not specified; omitting directory 'webapps.dist/examples'
cp: -r not specified; omitting directory 'webapps.dist/host-manager'
cp: -r not specified; omitting directory 'webapps.dist/manager'
root@9235c24f455e:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@9235c24f455e:/usr/local/tomcat# cd webapps
root@9235c24f455e:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@9235c24f455e:/usr/local/tomcat/webapps#
4.5.2.7 解决成功
4.5.3官方的使用
4.5.2.1.1 启动容器,用完删掉
- -it:交互模式直接启动
- –rm:我们一般启动都是后台启动,停止了容器后,容器还是可以查到,–rm停止容器即删除。
docker run -it --rm tomcat:9.0
4.5.3 docker部署Elasticsearch(es)和Kibana
es 暴露的端口很多
es 十分的耗内存
es的数据一般需要放置安全目录!挂载!
–net somenetwork: 网络配置
tag :版本号
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
4.5.3.1此处使用如下测试命令,启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
4.5.3.1.1 启动之后虚拟机卡顿
es是十分消耗内存
4.5.3.2 启动es,虚拟机卡住,docker stats 查看CPU状态
4.5.3.3 测试es是否启动成功
curl 127.0.0.1:9200
{
"name" : "35347deae329",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "aaKLwgTqTo2qlgchhi2Ezg",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
4.5.3.4 查看es占用内存情况
太大了,赶紧关闭。
docker ps 和 docker stop 命令
4.5.3.5 关闭es,增加内存限制
关闭es,增加内存限制,修改配置文件 -e环境生效
- -e ES_JAVA_OPTS=“-Xms64m -Xmx512m” 运行内存介于64~512间
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
启动成功
[root@VM-8-16-centos ~]# curl 127.0.0.1:9200
{
"name" : "4582320e5efd",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "bpDMHPS4TMGIIW5gg-TLmw",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
[root@VM-8-16-centos ~]#
4.5.4 思考:使用kibana连接es,网络如何连接过去
5 docker可视化面板、docker镜像加载原理(UnionFS)
- portainer(先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- Rancher(CI/CD再用)
5.1 什么是portainer
Docker图形化界面管理工具!提供一个后台面板供我们操作!
5.1.1 拉取运行portainer
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
5.1.2 访问portainer
ip:8088 访问
5.2 UnionFS(联合文件系统)
它支持对文件系统的修改作为一次提交来一层层的叠加,我们docker拉取镜像的时候看到的一层层的就是这个。
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file svstem)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。(好比计算机都要依赖内核,装机先开始都是黑窗口,都需要boot引导安装)
rootfs (root file system),在bootfs之上。包含的就是典型 Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,centos等等。
为啥这么小?
对于一个精简的OS,rootfs 可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs.
虚拟机是分钟级别,容器是秒级 !
5.3 镜像原理之分层理解
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
5.4 如何提交一个自己的镜像,docker commit镜像
命令和git原理类似
docker commit #提交容器成为一个新的副本
- -[TAG]:版本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
5.4.1 实战案例
5.4.1.1启动一个默认的tomcat
5.4.1.2 发现这个默认的tomcat 是没有webapps应用,镜像的原因,官方的镜像默认 webapps下面是没有文件的!
5.4.1.3 我自己拷贝进去了基本的文件
5.4.1.4 将我们操作过的容器通过commit提交为一个镜像! 我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像
提交命令如下:
docker commit -a="jiaoxin" -m="add webapps" 8bff2ed945ef tomcat02:1.0
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像就好比我们以前学习VM时候,快照!
Docker入门结束
6 容器数据卷
6.1 什么是容器数据卷
docker的理念回顾
将应用环境打包成一个镜像!
数据?如果数据在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
mysql,容器删了,删库跑路!需求:MySQL数据可以存储在本地
容器之间可以有一个数据共享的技术!Docker 容器中产生的数据,同步到本地!
这就是卷技术! 目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结:容器的持久化和同步操作!容器间也是可以数据共享的!
6.2 使用数据卷
6.2.1 方式一:直接使用命令来挂载 -v
- -it:以后台交互的模式启动
docker run -it -v -p 主机目录:容器内目录
6.2.1.1 测试命令
docker run -it -v /home/ceshi:/home centos /bin/bash
6.2.2 通过docker inspect查看容器详细信息
6.2.3 测试数据的同步1
6.2.4 测试数据的同步2
6.2.4.1 停止容器
6.2.4.2 宿主机上修改文件
6.2.4.3 启动容器
6.2.4.4 容器内数据依旧是同步的
docker attach #进入容器正在执行的终端,不会启动新的进程
好处:我们以后修改只需要在本地修改即可,容器内会自动同步
6.3 实战:安装MySQL
思考:MySQL的数据持久化问题
6.3.1 获取镜像
docker pull mysql:5.7
6.3.2 运行容器,需要做数据挂载!安装MySQL必须配置密码!!
参考官方文档:
测试命令如下:
- -d:后台启动
- -p:端口映射
- -v:卷挂载
- -e:环境配置
- –name 容器名字
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
6.3.3 连接容器内的MySQL
6.3.3.1 使用Navicat测试连接
6.3.3.2 Navicat连接到服务器的3310(3310和容器内的3306端口映射),这个时候我们可以连接上了
6.4 具名和匿名挂载
匿名挂载
-v 容器内路径
6.4.1 运行镜像
- -P:随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
6.4.2 查看所有卷的情况
docker volume ls
这里出现的VOLUME NAME下方的一长串值就是匿名挂载
DRIVER VOLUME NAME
local 1a7e6a2b96be2eb559b0b8d44f9710b956018c41f28a9c0b9d768ff53cda22f8
local 1cca7344a65e07142f5843286338ec040b9472dffd37d09ec5aa1aaae697e08d
local 3f2f77237a72d086ffd30da2dccedd7d0d57e82db8859de2393492614e96e26d
local 6ca161cde838e52140c85a73f611079ac9ba1968393c348eea2fd3f77910dd4f
local 9c3eee999290404743acd46454d6d642567069a8c0d0472cb3e1a16d5a36afed
具名挂载
通过 -v 卷名:容器内位置
[root@VM-8-16-centos data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
38fbdb289b96ceaf9a0077fe1c373a563a1e3ec95f9a47778ffa8e27f489d0ee
[root@VM-8-16-centos data]# docker volume ls
DRIVER VOLUME NAME
local cea8cd95fe08cccf91e09e94b8786d72efe8b7c9977bb0895c43986ba619c2fb
local d968c060e5562767e526fd61df73a214cc9ca9cc3841a66a6f2cc37ba4f8e79c
local juming-nginx
查看下这卷的详细信息
docker volume inspect juming-nginx
- 所有的docker容器内的卷,若没有指定目录的情况下都是在
/var/lib/docker/volumes/
- 我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的
具名挂载
如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
根据语法格式确定
- -v :容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#匿名挂载- -v:卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 具名挂载- -v /宿主机路径::容器内路径 #指定路径挂载
拓展
通过 -v 容器内路径:ro rw 改变读写权限
ro : readonly # 只读ro
rw :readwrite #可读可写
ro :只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx #一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx #一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
6.5 初始Dockerfile
Dockerfile
- Dockerfile 就是用来构建 docker镜像的构建文件!
- 通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
6.5.1 编写dockerfile文件
- 生成一个dockerfile文件,名字可以随机,建议
dockerfile
,只要是指令必须大写 CMD /bin/bash
默认命令行启动- 这里的每个命令,就是镜像的一层
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash
6.5.2 构建自己的docker镜像
-f
:指定dockerfile文件路径-t
: 为构建的镜像设置 一个名字和版本号
docker build -f /home/docker-test-volume/dockerfile1 -t jiaoxin/centos:1.0 .
6.5.3 启动自己的docker镜像
-it
:后台交互模式启动
docker run -it fbad0447e3f1 /bin/bash
这个卷和外部一定有一个同步的目录
只写了容器内目录
查看下卷的挂载路径
docker inspect 292a905f68c3
测试下刚才的文件是否同步出去
这种方式后边常用,因为我们经常要构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载-v
卷名:容器内路径!
6.6 数据卷容器
6.6.1 多个mysql同步数据
6.6.2 案例测试
6.6.2.1 启动3个容器,通过我们刚才自己写的镜像启动
6.6.2.2 启动第一个centos:容器
docker run -it --name docker01 jiaoxin/centos:1.0
6.6.2.3 退出容器,快捷键citl+p+q
6.6.2.4 启动第二个centos容器docker02,让其继承自docker01容器
docker run -it --name docker02 --volumes-from docker01 jiaoxin/centos:1.0
volumes可以理解为继承
目的:验证docker02容器是否继承docker01容器成功,主要是通过docker01中新建文件,观察docker02中同位置变化
6.6.2.5 启动第三个centos容器docker03,让其继承自docker02容器
docker run -it --name docker03 --volumes-from docker02 jiaoxin/centos:1.0
可以发现,docker03下的volume01目录中也有docker01文件。因此证明通过
--volumes-from
关键字可以实现容器间数据共享。
6.6.2.6 删除docker01观察其他容器中共享的文件是否存在
查看docker02发现已经删除的docker01容器共享的docker01文件依旧存在。
测试依旧还存在,因而证明只要容器间进行了数据共享,删除其中某些容器,共享的数据依然存在。(拷贝的概念)
其他容器的删除,不影响其他已拷贝共享资源数据的容器。
6.6.3 多个mysql实现数据共享
6.6.3.1 挂载的首个MySQL镜像
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
6.6.3.2 使用volumes挂载一个新mysql镜像,并共享mysql01的数据
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
6.6.3.2 总结
- 容器间配置信息的传递,其中
数据卷容器生命周期
一直持续到没有容器使用为止。- 一旦将容器持久化本地,如:mysql01挂载到本地,此时,本地的数据不会删除
6.6.4 删除未使用的所有数据卷!!! 慎用!
将未被使用的所有数据卷清理掉
确定删除所有数据卷?
确定删除所有数据卷?
确定删除所有数据卷?
`确定删除所有数据卷?` **真确定?** docker volu(防手快,确认使用时,删掉此处)me prune **真确定?** `确定删除所有数据卷?`
6.6.5 Docker-compose升级(以v2为例)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.1.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
6.6.6 docker ps只展示Docker容器名称
docker ps --format "{{.Names}}"
6.6.7 通过docker stats命令看看目标容器的cpu占比和mem内存占比
docker stats --no-stream |grep [服务名/服务名关键字]
6.6.7 获取最近1000条日志
docker logs -tf --tail 1000 gis-equipment-service