Docker安装Nginx
1.搜索镜像 search
2.下载镜像 pull
3.运行测试
-d 后台运行
--name 给容器命名
-p 宿主机端口,容器内部端口
[root@localhost ~]# docker run -d --name nginx01 -p 3344:80 nginx
9f7746aa72dbbe2cbaea867dce6e9b671894ed1f579168ba6263b834795b5626
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f7746aa72db nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
4.进入测试
[root@localhost ~]# docker exec -it nginx01 /bin/bash
root@9f7746aa72db:/#
root@9f7746aa72db:/# ls
bin docker-entrypoint.d home media proc sbin tmp
boot docker-entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
root@9f7746aa72db:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@9f7746aa72db:/# cat /etc/nginx
cat: /etc/nginx: Is a directory
root@9f7746aa72db:/# cd /etc/nginx
root@9f7746aa72db:/etc/nginx# ls
conf.d mime.types nginx.conf uwsgi_params
fastcgi_params modules scgi_params
root@9f7746aa72db:/etc/nginx#
Docker安装tomcat
docker run -it --rm tomcat:9.0
#一般用来测试,用完就删除
docker pull tomcat
docker run -d -p 3355:8080 --name tomcat01 tomcat
docker exec -it tomcat01 /bin/bash
#发现问题 1.linux命令少了 2.没有webapps,阿里云镜像的原因。默认是最小的,所有不必要的都剔除掉。
#保证最小可运行的环境
以后部署项目,每次都要进入容器十分麻烦。要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了。
部署es+kibana
es暴露的端口很多、es十分的耗内存、es的数据一般需要放置到安全目录!挂载
#启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#测试es是否成功
curl localhost:9200
#查看cpu状态
docker stats
#赶紧关闭,增加内存的限制,修改配置文件 -e 环境配置修改
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
使用Kibana连接es
可视化(先用portainer)
Docker图形化界面管理工具!提供一个后台面板供我们操作!
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试
curl localhost:8088
Docker镜像
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
Docker镜像加载原理
UnionFS(联合文件系统)
UnionFS(联合文件系统):一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层进行继承,基于基础镜像,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已有bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
分层理解
所有的docker镜像都起始于一个基础镜像层,当进行修改或增加新内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于Ubuntu创建一个新的镜8像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像。
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就像快照一样。
容器数据卷
如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
测试
docker run -it -v /home/test:/home centos /bin/bash
查看是否挂载成功
docker inspect 容器id
主机和容器内文件是双向同步的,以后修改只要在本地修改即可,容器内会自动同步!
安装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
假设将容器删除,挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
具名和匿名挂载
匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
查看所有卷的情况
docker volume ls
这就是匿名挂载,-v只写了容器内的路径,没有写容器外的路径!
具名挂载
-v 卷名:容器内路径
查看这个卷
docker volume inspect 卷名
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
通过具名挂载可以方便的找到我们的一个卷,大多数情况使用的是具名挂载。
-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v /宿主机路径:/容器内路径 指定路径挂载
一旦设置容器权限,容器对我们挂载出来的内容就有限定
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx
ro 说明这个路径只能通过宿主机来操作,容器局部是无法操作的
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!
通过脚本生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
创建一个dockerfile文件,名字随机
文件中的内容 指令(大写)参数
FROM hello-world
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
这里每个命令,就是镜像的一层
数据卷容器
多个mysql实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦你持久化到本地,这个时候,本地的数据是不会删除的!