【docker】常用dockerFile生成、docker-compose学习

前言
docker 官方镜像源已经有 tomcat 的镜像,运行命令 docker pull tomcat 就可以拉下来,但是如果我们想将自己的 tomcat 打成镜像,例如,我们业务需要修改了 tomcat 的源码,这时候我们想要将他打包成镜像,如何操作 ?

一、准备
前言说是我们自己修改过源码的 tomcat,那我们必须要先准备好一个已经修改了源码,并打包成 tar.gz 的压缩包 apache-tomcat-9.0.58.tar.gz

二、操作步骤
编写文件 Dockerfile
下面有 Dockerfile 文件中参数的简要说明

# 依赖镜像
FROM centos
FROM openjdk:8u312-jdk-oracle

MAINTAINER liqiye

# 工作目录
WORKDIR /usr/local/apache-tomcat-9.0.58

# 添加压缩包,自动解压
ADD apache-tomcat-9.0.58.tar.gz /usr/local

# 映射端口
EXPOSE 8080

# 启动
ENTRYPOINT ["/usr/local/apache-tomcat-9.0.58/bin/catalina.sh","run"]

把 winhong-winas-9.0.58.tar.gz、Dockerfile 放在linux同级目录

运行命令打包镜像
后面的点表示根据当前目录下的 Dockerfile 文件构建

docker build -t liqiye/tomcat:v1 .

查看本地镜像
docker images

镜像运行容器
注意镜像名必须放在最后面
docker run -itd –name winas -p 8080:8080 -v /usr/local/docker/winas/webapps:/usr/local/apache-tomcat-9.0.58/webapps liqiye/tomcat:v1

登录自己的 docker 账号

docker login

上传到docker仓库

docker push liqiye/tomcat:v1

三、Dockerfile参数说明
FROM
指定基础镜像,必须是第一条指令
如果不以任何镜像为基础,写法为:FROM scratch

MAINTAINER
指定作者

WORKDIR
工作目录
这里指定的路径,是在使用 docker exec 进入容器后默认的路径

ADD
作用:添加内容到镜像
格式:ADD
说明:将复制指定的 路径下内容到镜像中的 路径下

:可以是一个文件、目录、 URL、压缩文件。如果是压缩文件,会自动解压到 路径下,而如果是 URL,对应的也是一个压缩文件,就不会自动解压

:可以是镜像内绝对路径,或者相对于工作目录 WORKDIR 的相对路径

EXPOSE
暴漏容器运行时的监听端口给外部
这个只是起暴露作用,并没有实现主机与容器的端口映射,要实现端口映射需要在启动容器的时候带上参数 -p

ENTRYPOINT
启动时的默认命令
也就是从这里指定启动的程序

Dockerfile 文件的参数有很多,这里只是对本片文章用到的参数,做简单的介绍

查看容器配置(位置、映射、配置参数等等)
docker inspect imageid|less

查看所有容器
docker ps -a
查看在运行容器
docker ps

docker cp

查看所有镜像
docker images

移除容器
docker rm xxx
移除镜像
docker rmi xxx

进入容器
docker exec -it xxx /bin/bash

通过镜像创建容器并运行
docker run -itd –name mytomff -p 8900:8080 -v /root/dockercreate/apache-tomcat-8.5.64/webapps:/usr/local/apache-tomcat/webapps xff/tomcat-final:v1
-p 本地端口:容器端口 -v 本地目录:容器目录
镜像名最后

到Dockerfile目录运行,通过dockerfile生成镜像
docker build -t xx/xxx:version .

创建tomcat—–Dockerfile

FROM centos
FROM openjdk:8u312-jdk-oracle
MAINTAINER xff
WORKDIR /usr/local/apache-tomcat
ADD apache-tomcat-8.5.64 /usr/local/apache-tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/apache-tomcat/bin/catalina.sh","run"]

创建jar运行容器—–Dockerfile

FROM openjdk:8u312-jdk-oracle
MAINTAINER xff
ADD ./*.jar /application.jar
ENTRYPOINT ["java", "-jar", "/application.jar"]

WORKDIR
工作目录,进入容器后默认目录
ADD
将本地文件放入容器目录
EXPOSE
暴露端口
ENTRYPOINT
运行程序

创建tomcat—–Dockerfile

FROM centos
FROM openjdk:8u312-jdk-oracle
MAINTAINER xff
WORKDIR /usr/local/apache-tomcat
ADD apache-tomcat-8.5.64 /usr/local/apache-tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/apache-tomcat/bin/catalina.sh","run"]

创建jar运行容器—–Dockerfile

FROM openjdk:8u312-jdk-oracle
MAINTAINER xff
ADD ./*.jar /application.jar
ENTRYPOINT ["java", "-jar", "/application.jar"]

docker run添加命令参数

docker run --restart=always -p 6379:6379 --name redis-local -v /data/compose/redis/data:/data -d redis redis-server --requirepass dsj@6076

docker-compose批量启动管理容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: "3.0"

services:
redis:
container_name: redis
image: redis
restart: always
ports:
- 6379:6379
volumes:
- ./redis/redis.conf:/etc/redis.conf
- ./redis/data:/data
- ./redis/logs:/var/log/
command: redis-server /etc/redis.conf
backend:
container_name: backend
image: dxzf-backend
restart: always
ports:
- 8787:8787
volumes:
- ./backend/logs:/logs
ngnix:
container_name: nginx
image: nginx
restart: always
ports:
- 80:80
- 443:443
privileged: true
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx
- ./nginx/html:/usr/share/nginx/html
- /etc/letsencrypt:/etc/letsencrypt
- /etc/localtime:/etc/localtime

elasticSearch

docker run --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" -v /hda/compose/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /hda/compose/elasticsearch/data:/usr/share/elasticsearch/data -v /hda/compose/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:6.8.23

rocketmq

https://blog.csdn.net/ming19951224/article/details/109063041

docker pull rocketmqinc/rocketmq

docker run -d --restart=always --name xffrmqnar -p 9876:9876 -v /docker/rocketmq/data/namesrv/logs:/root/logs -v /docker/rocketmq/data/namesrv/store:/root/store  rocketmqinc/rocketmq sh mqnamesrv 

创建配置文件

# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
brokerIP1 = 192.168.217.128
# 磁盘使用达到95%之后,生产者再写入消息会报错 CODE: 14 DESC: service not available now, maybe disk full
diskMaxUsedSpaceRatio=95

docker run -d --restart=always --name rmqbroker --link xffrmqnar:namesrv -p 10911:10911 -p 10909:10909 -v /root/rmq/logs:/root/logs -v /root/rmq/store:/root/store -v /root/rmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf -e "NAMESRV_ADDR=192.168.217.128:9876" rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf

(非必要)

docker pull pangliang/rocketmq-console-ng

docker run -d --restart=always --name xffadmin -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.217.128:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 9999:8080 pangliang/rocketmq-console-ng

查看

http://192.168.217.128:9999/#/

zookeeper-docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
version: '3.1'

services:
zoo1:
container_name: zoo1
image: zookeeper
hostname: zoo1
ports:
- 2181:2181
networks:
- zookeeper-network
volumes:
- /root/zook/zoo1/data:/data
- /root/zook/zoo1/conf/zoo.cfg:/conf/zoo.cfg
- /root/zook/zoo1/logs:/datalog
restart: always
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

zoo2:
container_name: zoo2
image: zookeeper
hostname: zoo2
ports:
- 2182:2181
networks:
- zookeeper-network
volumes:
- /root/zook/zoo2/data:/data
- /root/zook/zoo2/conf/zoo.cfg:/conf/zoo.cfg
- /root/zook/zoo2/logs:/datalog
restart: always
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

zoo3:
container_name: zoo3
image: zookeeper
hostname: zoo3
ports:
- 2183:2181
networks:
- zookeeper-network
volumes:
- /root/zook/zoo3/data:/data
- /root/zook/zoo3/conf/zoo.cfg:/conf/zoo.cfg
- /root/zook/zoo3/logs:/datalog
restart: always
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

networks:
zookeeper-network:
driver: bridge

docker-network

当多个容器需要互相通信时,需要使用docker-network

docker多个容器部署集群,需要互相连接

docker network help

zookeeper集群示例

docker network create zk_cluster
docker network inspect zk_cluster
docker network connect zk_cluster zoo1
docker network connect zk_cluster zoo2
docker network connect zk_cluster zoo3