Docker入门实验 pull_dockerfile_tomcat_简单nginx
Posted patrickchiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker入门实验 pull_dockerfile_tomcat_简单nginx相关的知识,希望对你有一定的参考价值。
Docker实验 pull_dockerfile_tomcat_简单nginx
带“*”号的为省略,可选做
实验目的
1、掌握Docker安装方法。
2、掌握Docker pull 服务及软件并应用的方法。
3、了解通过Dockerfile和docker build 定制docker的方法
实验仪器设备/实验环境
1、Centos7操作系统 2、Docker仓库
实验原理
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
容器核心技术是指能够让 container 在 host 上运行起来的那些技术。
• 容器规范:为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker、CoreOS、Google在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目是制定开放的容器规范。
• 容器 runtime:runtime 是容器真正运行的地方。runtime 需要跟操作系统 kernel 紧密协作,为容器提供运行环境。lxc、runc 和 rkt 是目前主流的三种容器 runtime。
• 容器管理工具:容器管理工具对内与 runtime 交互,对外为用户提供 interface,比如 CLI。
• 容器定义工具:容器定义工具允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。
• Registry:容器是通过 image 创建的,需要有一个仓库来统一存放 image,这个仓库就叫做 Registry。
容器 OS:容器 OS 是专门运行容器的操作系统。CoreOS、atomic 和 ubuntu core 是其中的杰出代表
实验内容
1、Docker安装部署;
2、Docker pull 拉取镜像实现服务;
3、Dockerfile和Docker build定制 ;
阿里云镜像加速Docker(巨快)
直接把下列命令粘贴运行
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-\'EOF\' "registry-mirrors": ["https://knqne7y6.mirror.aliyuncs.com"] EOF sudo systemctl daemon-reload sudo systemctl restart docker
Docker、镜像的安装
1、Docker安装部署;
请尽量配置yum源为阿里云,这样yum安装快速
yum install -y docker-ce 安装docker
systemctl start docker 开启docker*
systemctl enable docker
docker version 截图
修改防火墙设置
systemctl stop firewall
setenforce 0
getenforce
2、Docker pull 拉取镜像实现服务;
拉取一个nginx镜像
docker pull [镜像名]
docker images 查看已经拉取的镜像
docker run [...] [镜像名]
资料补充:
访问http测试:https://www.runoob.com/docker/docker-install-nginx.html
https://blog.csdn.net/Themoonlights_/article/details/122238597
腾讯云服务器在Centos中使用nginx
https://www.tencentcloud.com/zh/document/product/214/32390
docker pull nginx
创建容器
docker run -d -p 8080:80 --name my-nginx nginx
这个命令将拉取最新版本的 Nginx 镜像并在容器中运行它。-d 参数表示在后台运行容器,-p 8080:80 表示将主机的 8080 端口映射到容器的 80 端口,--name my-nginx 表示将容器命名为 my-nginx。
修改nginx web页面为带学号和姓名信息的页面,
找到进程名进入,安装vim编辑器,然后进入/etc/nginx编辑配置文件
docker exec -it my-nginx bash
cd /usr/share/nginx/html
vi index.html
这个命令将进入 my-nginx 容器并打开 /usr/share/nginx/html/index.html 文件。使用 vi 或其他编辑器修改网页内容并保存。
退出容器并重启 Nginx:
exit
docker restart my-nginx
这个命令将退出容器并在主机 shell 中重启 my-nginx 容器。Nginx 将重新加载配置文件和修改的网页内容。
在浏览器中访问修改后的网页:
http://localhost:8080
在浏览器中输入上述地址,即可访问修改后的网页。
*Docker基础命令
启动
docker run 可加后面参数
--name="容器新名字" 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
/bin/bash 为进入bash命令行终端
docker run -it ubuntu:16.04 /bin/bash
docker run -d redis:6.0.8
退出
docker stop bc588d5fa956/ubuntu
重启
docker restart bc588d5fa956
删除
docker ps
docker rm bc588d5fa956
docker rm -f bc588d5fa956 //强制删除正在运行的容器
查看容器日志
docker logs [CONTAINER ID]
查看已拉取的镜像
docker images
docker images [IMAGE NAME]
查看容器内运行的进程
docker ps
top // linux查看进程
docker top // 查看docker运行的进程
docker inspect [CONTAINER ID]
对容器改名
docker ps
docker rename [CONTAINER ID] [NEW_NAME]
进入正在运行的容器并以命令行进行交互
docker exec -it [CONRAINER ID] /bin/bash
docker attach -it [CONTAINER ID] // 一次性进入,只要进去在退出了就永久停止了
退出正在运行的容器
exit
或者
ctrl+p+q
从容器内拷贝文件到主机上
root@5ca4b4a8f971:/# cd /tmp root@5ca4b4a8f971:/tmp# touch a.txt root@5ca4b4a8f971:/tmp# ls a.txt exit
➜ /tmp docker cp 5ca4b4a8f971:/tmp/a.txt /tmp
Successfully copied 1.54kB to /tmp➜ /tmp ls
a.txt tmpaddon
导入和导出容器
docker ps docker export [CONTAINER_ID] > myubuntu.tar // 把整个容器打包成tar镜像 docker rm-f [CONTAINER_ID] // 删除容器 cat myubuntu.tar | docker import - root/ubuntu:16.04 -> sha256:9303fe3ca04f946c0c5698bf7af8969cde77f0ae1aef6eff5f137755f2f63296 docker images //查看镜像
➜ /tmp docker run -it --name cloud 9303fe3ca04f /bin/bash
root@041a2243cb04:/#// 刚才的文件还在 备份恢复成功
root@041a2243cb04:/# cd /tmp
root@041a2243cb04:/tmp# ls
a.txt
*Docker镜像
镜像分层,UnionFS联合文件系统,可以把容器看作简易版的Linux的系统
docker commit 提交副本容器,使他成为新的镜像,或者可以用DOCKERFILE
安装vim
apt-get update
apt-get -y install vim
提交,定制版本
➜ ~ docker commit -m="vim cmd add ok" -a=="jpl" 6020ab0ffc8a jpl/ubuntu:1.3 sha256:06fbc784d58c75c71db55b958af55b921c36fb8eac27b6141bd6dfd81ad32035
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jpl/ubuntu 1.3 06fbc784d58c 11 seconds ago 175MB
启动新镜像,vim成功部署
docker stop cloud
cloud
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d1cacd8b25d redis:6.0.8 "docker-entrypoint.s…" 16 hours ago Up 16 hours 6379/tcp magical_hamilton
c1c1c0b7f40d nginx "/docker-entrypoint.…" 3 days ago Up 3 days 0.0.0.0:1080->80/tcp, :::1080->80/tcp my-nginx
2d29fb18d7ff nginx "/docker-entrypoint.…" 3 days ago Up 3 days 0.0.0.0:8080->80/tcp, :::8080->80/tcp strange_panini
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jpl/ubuntu 1.3 06fbc784d58c About a minute ago 175MB
root/ubuntu 16.04 9303fe3ca04f 34 minutes ago 86.2MB
hello-world latest 9c7a54a9a43c 7 days ago 13.3kB
tomcat latest 311570738ca3 7 days ago 475MB
nginx latest 448a08f1d2f9 8 days ago 142MB
centos latest 5d0da3dc9764 20 months ago 231MB
ubuntu 16.04 b6f507652425 20 months ago 135MB
redis 6.0.8 16ecd2772934 2 years ago 104MB
➜ ~ docker run -it 06fbc784d58c /bin/bash
root@988f45401972:/# vim
root@988f45401972:/#
*Docker 容器卷
主机和容器实现共享 /宿主机决定路径:/容器目录
➜ image docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu:16.04
root@39f21ec174f1:/#
在共享的文件夹内 容器新建文件,宿主机也会同步
root@39f21ec174f1:/tmp/docker_data# cd /tmp/docker_data/
root@39f21ec174f1:/tmp/docker_data# touch build_form_ubuntu.txt
root@39f21ec174f1:/tmp/docker_data# ls
build_form_ubuntu.txt
root@39f21ec174f1:/tmp/docker_data# exit
exit
➜ image cd /tmp/host_data
➜ host_data ls
build_form_ubuntu.txt
查看容器
docker inspect 39f21ec174f1
容器关闭,宿主机新建文件,容器打开,文件夹依然同步共享
使容器可读可写:rw
image docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data:rw --name=u1 ubuntu:16.04
使容器可读不能写:ro
image docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1:ro ubuntu:16.04
使容器2继承容器1的卷规则
docker run -it --privileged=true --volumes- from u1 --name u2 ubuntu:16.04
*Docker常规安装Tomcat
Tomcat
docker search tomcat
docker pull tomcat
使用tomcat镜像运行实例
docker run -itd -p 8080:8080 --name=tomcat1 tomcat // -P随机分配端口
登陆到Tomcat
➜ ~ docker exec -it dae867a97bc1 /bin/bash
root@dae867a97bc1:/usr/local/tomcat#
修改webapps文件权限
root@dae867a97bc1:/usr/local/tomcat# rm -r webapps
root@dae867a97bc1:/usr/local/tomcat# mv webapps.dist webapps
修改sysctl.conf的内核转发
通过vim /etc/sysctl.conf把里面的net.ipv4.ip_forward = 0修改为net.ipv4.ip_forward = 1后进行保存退出,通过sysctl -p命令使修改后的内核转发文件生效
进入docker容器,启动相对应的tomcat服务
通过docker attach a85c8c323a30(正在启动的docker容器ID)
进入docker容器后,通过cd bin进入bin目录下,找到startup.sh文件,直接输入startup.sh这个命令启动这个脚本后,这个tomcat服务就启动了
或者免修改版
docker pull billygoo/tomcat8-jdk8 docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
如果端口占用了-> 端口解绑
1.查看8080端口是否被占用
netstat -anp | grep 8080
输出结果:tcp 0 0 :::8080 ::kafka是啥?虽然很难学,但是实验入门很简单
文章目录
kafka概述
Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
kafka的三个基本组成是生产者、消费者、broker(生产者和消费者之间的消息队列服务器)。
发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接受感兴趣的消息。
缓冲/消峰:缓解大流量情况,解决生产消息和消费消息的处理速度不一样的情况。
异步处理机制:允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
消息队列的两种模式
- 点对点
一个生产者一个消费者 ,消费者主动拉取数据,消息收到后清除 - 发布/订阅
多个生产者 ,消费者多个,而且相互独立,多个topic消费者消费数据后不删除数据
几个基本的概念
- Producer:消息生产者,就是向 Kafka broker 发消息的客户端。
- Consumer:消息消费者,向 Kafka broker 接收消息的客户端。
- Consumer Group(CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
- Broker:一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个broker 可以容纳多个 topic。
- Topic:可以理解为一个队列,生产者和消费者面向的都是一个 topic。
- Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
- Replica:副本。一个 topic 的每个分区都有若干个副本,一个 Leader 和若干个Follower。
- Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 Leader。
- Follower:每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和Leader 数据的同步。Leader 发生故障时,某个 Follower 会成为新的 Leader。
kafka快速入门
官网链接https://kafka.apache.org/downloads.html
本地搭建伪分布式kafka集群
解压tar -xzvf kafka_2.12-3.2.3.tgz
在kafka目录下创建etc目录,mkdir etc
将zookeeper配置文件拷贝进去cp config/zookeeper.properties etc
,在文件最后添加
audit.enable=true
搭建一个有三个broker的伪分布式节点
cp config/server.properties etc/server-0.properties
cp config/server.properties etc/server-1.properties
cp config/server.properties etc/server-2.properties
分别进入配置文件,修改
broker.id=0
listeners=PLAINTEXT://localhost:9092 注释去掉
log.dirs=/tmp/kafka-logs-0 区分log.dir
broker.id=1
listeners=PLAINTEXT://localhost:9093 注释去掉
log.dirs=/tmp/kafka-logs-1 区分log.dir
broker.id=2
listeners=PLAINTEXT://localhost:9094 注释去掉
log.dirs=/tmp/kafka-logs-2 区分log.dir
进入bin目录下使用启动脚本,开启zookeeper
./zookeeper-server-start.sh ../etc/zookeeper.properties
提示没有java环境就先安装javasudo apt install openjdk-8-jre-headless
然后启动三个kafka的实例,进入bin目录
./kafka-server-start.sh ../etc/server-0.properties
./kafka-server-start.sh ../etc/server-1.properties
./kafka-server-start.sh ../etc/server-2.properties
创建主题
./kafka-topics.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --create --topic test --partitions 3 --replication-factor 2
查看分区状态
./kafka-topics.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --describe --topic test
创建消费者和生产者
./kafka-console-consumer.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic test --from-beginning
./kafka-console-producer.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic test
然后在生产者终端发送信息,在消费者终端就可以接收到消息。
梳理一下整个过程,就是先创建好管理节点的zookeeper,然后创建三个broker节点,然后分别创建了生产者和消费者进行通信。
kafka新版本中取消了对zookeeper的依赖,在创建topic时,不用--zookeeper
选项而改用--bootstrap-server
。--bootstrap-servers
参数,只在启动客户端连接Kafka服务时使用。并且,即使列表里面填了多个节点,只要有一个可用就行了。
listeners:指定broker启动时本机的监听名称、端口,给服务器端使用
advertised.listeners:对外发布的访问ip和端口,给客户端使用。如果advertised.listeners没有配置,就采用listeners的配置。
使用docker部署kafka
这里没有实验成功,三个broker链接不起来,先放个官方文档在这,以后需要用到再回来看
https://github.com/bitnami/containers/tree/main/bitnami/kafka
更深入的学习(待更)
另外需要说明,上面的实验只是实验帮助理解,kafka并不是只有这么简单,通常是用java来调用kafka提供的api来对消息进行发送和接收。
学习链接
https://www.bilibili.com/video/BV1h94y1Q7Xg/
以上是关于Docker入门实验 pull_dockerfile_tomcat_简单nginx的主要内容,如果未能解决你的问题,请参考以下文章