目录
容器数据卷
Docker 简介
传统发布一个项目(jar+(redis、mysql、jdk...依赖包)),环境配置十分的麻烦,每一个机器都要部署环境,而docker可以将应用程序和依赖包一起打包成镜像部署上线。
传统:开发编辑jar包,运维去部署
现在:开发打包部署上线,一整套流程做完
Docker的思想来自于集装箱
容器技术的重点是隔离,Docker核心思想打包装箱,每个箱子是相互隔离的,通过隔离机制,可以将服务器利用到极致。
Docker没有出来之前,我们都是用虚拟机,而虚拟机很笨重,隔离需要开启多个虚拟机,docjer就是为了解决这个问题,所以它是秒级启动,更加轻巧。
Docker是基于GO语言开发的
总结:什么是Docker容器?docker是一个开源的,可以让开发者将应用和依赖一起打包的容器技术,容器完全使用隔离机制,容器之前没有任何接口。
虚拟化技术
1.虚拟机技术,优点:安全性最高,缺点是资源占用很多(需要模拟完整的操作系统),冗余步骤多,启动很慢,
2.容器化技术,不是模拟完整的操作系统
不同点
1、传统的虚拟机虚拟一个硬件,运行在一个完整的操作系统上安装和运行软件
2、容器内的应用都是直接运行在宿主机的内核,容器是没有自己的内核,也没有虚拟我们的硬件,所以更轻便,每个容器间相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
docker:打包镜像发布测试,一键运行
更便捷的升级扩缩容
使用了Docker之后,我们部署应用就像搭积木一样
更简单的系统运维
在容器化后,我们的开发测试环境都是高度一致的
更高效的利用计算资源
总结:为什么要用docker容器?因为传统的虚拟机技术是模拟一整套操作系统,占用资源会很大,项目部署的操作很繁琐,启动也很慢,而docker容器可以使应用快速的交付部署,升级更便捷,资源利用更高效
docker的镜像、容器和仓库
镜像(image)
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,
tomcat镜像 ===> run ===>tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
容器(container)
Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建的,可以把容器理解为一个简易的Linux系统
仓库(repository)
仓库分为公有仓库和私有仓库
安装
查看环境
#系统内核3.10以上的
[root@localhost ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
#系统版本
[root@localhost ~]# 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"
在 CentOS | 上安装 Docker 引擎Docker 文档
#卸载旧的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#下载安装包
yum install -y yum-utils
#设置镜像仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认是从国外下载,特别慢
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国内阿里云镜像
#更新yum软件包索引
yum makecache fast
#安装docker相关的 docker-ce 社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io
#启动docker
systemctl start docker
#使用docker version查看是否成功
docker version
#运行镜像hello-world
docker run hello-world
#查看docker中的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
了解:卸载docker
#卸载 Docker 引擎、CLI 和容器包:
yum remove docker-ce docker-ce-cli containerd.io
#主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
阿里云镜像加速器
配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://py5f753t.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker底层原理
Docker是怎么工作的?
Docker是一个client——server结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问,Docker server接收到Docker client的指令就会执行这个命令。
Docker为什么比虚拟机快?
1.docker比虚拟机的抽象层更少
2.docker利用的是宿主机的内核,虚拟机需要Guset OS,新建一个容器的时候docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guset OS 分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程
Docker的常用命令
帮助命令
#显示docker的版本信息
docker version
#显示docker的系统信息,包括镜像和容器的数量
docker info
#帮助命令
docker --help
镜像命令
#查看所有本地的主机上的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
#解释
#REPOSITORY 镜像的仓库源
#TAG 镜像的标签
#IMAGE ID 镜像的id
#CREATED 创建时间
#SIZE 大小
#可选
-a #所有镜像
-q #只显示id
docker search 搜索镜像
[root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12391 [OK]
mariadb MariaDB Server is a high performing open sou… 4768 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 917 [OK]
percona Percona Server is a fork of the MySQL relati… 573 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 495 [OK]
#可选项,通过收藏次数过滤
--filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的
[root@localhost ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12391 [OK]
mariadb MariaDB Server is a high performing open sou… 4768 [OK]
docker pull 下载镜像shan
#下载镜像docker pull 镜像名[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest #如果不写tag,默认就是latest最新的
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载,docker images的核心 联合文件系统
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 #真实的地址
#指定文件下载
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
#删除指定容器
docker rmi -f 容器id
#删除多个容器
docker rmi -f 容器id 容器 id 容器id
#删除所有容器
docker rmi -f $(docker images -aq)
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像
docker pull centos
新建容器并启动
docker run [可选项] image
#参数说明
--name="Name" 容器名称 tomcat01、tomcat02.用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip 主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 指定随机的端口
#测试、启动并进入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@c911c0d68d0c /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#退出
exit
列出所有的运行的容器
#docker ps 命令
docker ps #列出当前正在运行的容器
-a #列出当前正在运行的容器 + 历史运行过的容器
-n=? #列出最近创建的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c911c0d68d0c centos "/bin/bash" 4 minutes ago Exited (130) 2 minutes ago laughing_lovelace
e352e0ad7139 hello-world "/hello" 23 hours ago Exited (0) 23 hours ago xenodochial_haibt
[root@localhost ~]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c911c0d68d0c centos "/bin/bash" 4 minutes ago Exited (130) 2 minutes ago laughing_lovelace
[root@localhost ~]# docker ps -aq
c911c0d68d0c
e352e0ad7139
退出容器
exit #关闭退出
ctrl + P + Q #不关闭推出
删除容器
#删除指定的容器,不能删除正在运行的容器,如果要强制删除 docker rm -f
docker rm 容器id
#删除所有容器
docker rm -f $(docker ps -aq)
#删除所有容器
docker ps -a -q|xargs docker rm
启动和停止容器的操作
#启动容器
docker start 容器id
#重启容器
docker restart 容器id
#停止容器
docker stop 容器id
#强制停止容器
docker kill 容器id
其他常用命令
后台启动容器
#命令 docker run -d 镜像名
[root@localhost ~]# docker run -d centos
#问题docker ps,发现centos停止了
#常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后发现自己没有提供服务,就会立即停止
查看日志
#自己写一个脚本,让centos后台运行
[root@localhost ~]# docker run -d centos /bin/bash -c "while true ; do echo chentian ; sleep 1 ; done"
#显示日志
-tf
--tail number #要显示日志的条数
[root@localhost ~]# docker logs -tf --tail 10 d6fc399ce0d2
查看容器中的进程信息
[root@localhost ~]# docker top d6fc399ce0d2
UID PID PPID C STIME TTY TIME CMD
root 24509 24491 0 17:43 ? 00:00:00 /bin/bash -c while true ; do echo chentian ; sleep 1 ; done
查看镜像元数据
[root@localhost ~]# docker inspect d6fc399ce0d2
进入当前正在运行的容器
#我们的容器通常都是以后台方式运行,需要进入容器,修改一些配置
[root@localhost ~]# docker exec -it d6fc399ce0d2 /bin/bash
[root@d6fc399ce0d2 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@d6fc399ce0d2 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:43 ? 00:00:00 /bin/bash -c while true ; do echo chentian ; sleep 1 ; done
root 829 0 0 09:57 pts/0 00:00:00 /bin/bash
root 896 1 0 09:58 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 897 829 0 09:58 pts/0 00:00:00 ps -ef
#方式二
docker attach 容器id
[root@localhost ~]# docker attach d6fc399ce0d2
正在执行当前代码...
#docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
#创建容器
[root@localhost ~]# docker run -it centos /bin/bash
#退出容器
[root@20cd9e411f48 /]# exit
exit
#查看容器信息
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20cd9e411f48 centos "/bin/bash" 54 seconds ago Exited (127) 18 seconds ago musing_pare
993ffc1fde2b centos "/bin/bash" 4 minutes ago Exited (0) 2 minutes ago wizardly_saha
#开启容器
[root@localhost ~]# docker start 20cd9e411f48
20cd9e411f48
#进入容器内部
[root@localhost ~]# docker attach 20cd9e411f48
[root@20cd9e411f48 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@20cd9e411f48 /]# cd home
[root@20cd9e411f48 home]# ls
#创建一个文件
[root@20cd9e411f48 home]# touch test.java
[root@20cd9e411f48 home]# ls
test.java
[root@20cd9e411f48 home]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20cd9e411f48 centos "/bin/bash" 3 minutes ago Exited (0) 11 seconds ago musing_pare
993ffc1fde2b centos "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago wizardly_saha
#将容器中的文件拷贝到主机
[root@localhost ~]# docker cp 20cd9e411f48:/home/test.java /root
[root@localhost ~]# ls
anaconda-ks.cfg redis-5.0.14 redis-5.0.14.tar.gz test.java
#拷贝是一个手动过程,我们可以通过使用 -v 卷的技术实现
创建Nginx仓库
#1.搜索nginx镜像
[root@localhost ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16613 [OK]
bitnami/nginx Bitnami nginx Docker Image 121 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 40
#2.下载nginx镜像
[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#3.后台启动nginx,并配置连接端口
[root@localhost ~]# docker run -d --name nginx01 -p 8091:80 nginx
9fedb977e0f42f41cb5ea8453ebff2ba1341cf60679068350e6eb480696b52b4
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fedb977e0f4 nginx "/docker-entrypoint.…" 26 seconds ago Up 22 seconds 0.0.0.0:8091->80/tcp, :::8091->80/tcp nginx01
#4.本地访问
[root@localhost ~]# curl localhost:8091
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#进入容器
[root@localhost ~]# docker exec -it nginx01 /bin/bash
root@9fedb977e0f4:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@9fedb977e0f4:/# cd etc/nginx
root@9fedb977e0f4:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@9fedb977e0f4:/etc/nginx#
端口暴露的概念
思考?我们每次改动Nginx的配置文件,都需要进入容器内部,十分的麻烦,我要是可以在容器外部提供一个映射路径,在容器修改文件名,容器内部就可以自动修改就好了。 可以用 -v 数据卷
创建tomcat容器
#可以在dockerhub上面去查看版本信息下载
docker pull tomcat:9.0
#运行
docker run -d -p 8080:8080 --name tomcat01 tomcat9.0
#可以访问,但是没有tomcat
#进入容器
dockers exec -it tomcat01 /bin/bash
root@568e1b040eae:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@568e1b040eae:/usr/local/tomcat# cd webapps
root@568e1b040eae:/usr/local/tomcat/webapps# ls
#发现问题,1.Linux命令少了,2.webapps是空的。原因阿里云和镜像默认是最小的的镜像,
#所有不必要的都剔除掉,保证最小可运行环境
思考?我们以后要部署项目,如果每次都要进入容器是不是十分麻烦,我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了。
部署es + kibana
# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录!挂载
# --net somenetwork 网络配置
# 启动es
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 启动了 Linx就卡住了 docker stats 查看cpu的状态
# 增加内存的限制,修改配置文件 -e ,环境配置修改
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch:7.6.2
查看cpu状态
docker stats
[root@localhost ~]# curl localhost:9200
{
"name" : "a973572f5349",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "OosLG8r3TYu6pAKpMfrOkQ",
"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"
}
可视化(-v数据卷)
docker run -d -p 8080:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Docker镜像讲解
镜像是什么?
镜像是一种轻量级,可执行的独立的软件包。它包含运行某个软件所需要的所有内容,包含代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像呢?
1.从远程仓库下载
2.拷贝
3.自己生成
Docker镜像加载原理
docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统是UnionFS(联合文件系统)。
UnionFS:是一种分层,轻量级并且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层一层的叠加(和git提交代码一样),同时可以将不同目录挂载到同一个虚拟文件下面。
bootfs (boot file system) 主要包含 bootloader(引导加载程序) 和 kernel(内核), bootloader主要是引导加载kernel, 当boot成功后 kernel 被加载到内存中后 bootfs就被卸载了.
rootfs (root file system) 包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。
为什么docker的镜像比虚拟机小那么多?
因为docker底层直接用host的kernel,只需要rootfs就可以,省却了bootfs(一起用一个公共的bootfs)。
特点:
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都是镜像层
如何提交一个自己的镜像
commit 镜像
docker commit 提交容器成为一个新副本
#命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
[root@localhost ~]# docker commit -a="huaxiaobai" -m="add webapps app" c5b012c83d1f tomcat02:1.0
sha256:387d7752198ede98f37c39f97afa02a2bc27ac05bd8cdcdb59c14c3752386353
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 387d7752198e 17 seconds ago 685MB
nginx latest 605c77e624dd 3 months ago 141MB
tomcat 9.0 b8e65a4d736d 3 months ago 680MB
容器数据卷
什么是容器数据卷
将docker容器产生的数据,同步到本地,将容器内的目录挂载到linux上面,将数据同步到Linux中
总结:容器的持久化和同步操作!容器间是可以数据共享的
使用数据卷
#docker run -it -v 主机目录:容器目录
docker run -it -v /home/ceshi:/home centos /bin/bash
#在容器中添加文件
[root@021759bd5b84 home]# touch test.java
#在本地查看
[root@localhost ceshi]# ls
test.java
#进入进入文件,进行修改
[root@localhost ceshi]# vim test.java
#在容器中查看
[root@021759bd5b84 home]# cat test.java
class test{
}
好处:我们以后修改只用在本地修改就可