Docker基于最开始的镜像,创建运行一个容器,根据一条命令对容器进行修改,然后Docker commit提交一层镜像层,然后有基于这个镜像层,创建新的容器,然后有根据下一条命令修改容器,然后又提交,直至最后一条命令执行完。
From : 基础镜像,当前镜像是基于哪个镜像的,必须指定基础镜像,DockerFile第一条命令必须是From
MAINTAINER : 镜像维护者姓名邮箱
RUN : 镜像构建时需要运行的Linux命令,Run是在docker build的时候执行的
--shell格式: RUN yum install xxx(运行一条yum命令)
--exec格式: RUN [可执行文件,参数1,参数2] # 例:RUN [./redis-server,/etc/redis/redis.conf] 等同于 RUN ./redis-server /etc/redis/redis.conf
EXPOSE : 镜像构建完成,运行当前镜像,生成的容器对外暴露的端口
WORKDIR : 指的是在运行容器时,进入交互终端所在的文件目录
USER : 指定镜像 需要什么用户才能执行 默认Root
ENV : 构建过程中设置环境变量
ADD : 将宿主机中的文件添加到容器中,会自动的解压tar压缩包和自动处理URL
COPY : 将宿主机中的文件拷贝到容器中 (类似于ADD 但是不会自动解压,)# COPY ["src", "dest"]
VOLUME : 容器卷
CMD : 指定容器启动后要干的事情(和前面RUN的区别:Run在Build时运行,CMD在容器运行后运行)
--shell格式:CMD yum install xxx(运行一条yum命令)
--exec格式: CMD [可执行文件,参数1,参数2],
--Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT : 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,
---而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
---如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
FROM centos:7 #基础镜像centos 7
MAINTAINER zzyy
ENV MYPATH /usr/local# 设置环境变量
WORKDIR $MYPATH# 设置工作目录
#安装vim编辑器
RUN yum -y install vim #运行 yum 命令
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/#将java8文件添加到容器并且解压
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH #设置PATH环境变量
EXPOSE 80 暴露端口
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
docker build -t 镜像名:TAG . #记住最后又一个点
插件:
org.springframework.boot
spring-boot-maven-plugin
ROM java:8 #
VOLUME /tmp
RUN mkdir -p /myjar/jar
ADD demo.jar /myjar/jar/demo.jar #将Demo.jar 放到目录下
ENTRYPOINT ["java","-jar","/myjar/jar/demo.jar"] #运行jar包
EXPOSE 8000 #对外暴露8000端口
docker run -d -p 8000:8000 boot:1.0
就打包好了。
docker network ls
创建网络
docker network create 网络名
查看网络数据
docker network inspect
删除网络
docker network rm 网络名
bridge模式:使用–network bridge指定,默认使用docker0
host模式:使用–network host指定
none模式:使用–network none指定
container模式:使用–network container:NAME或者容器ID指定
容器默认使用的是桥接模式。Docker每次启动容器时,容器内部的IP都是会变化的。
验证两两对应
因为是复用的宿主机的IP和端口,所以在启动容器时的端口映射也就没有意义了
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8 #运行这段代码会产生警告
原因:
docker启动时指定–network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,
并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
docker run -d -p 8083:8080 --name tomcat83 billygoo/tomcat8-jdk8 #这样就没问题了
禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
注意: 使用这个模式因为共用一个IP和端口,两个容器的端口不能冲突,比如两个tomcat就不能使用这个模式
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh #启动另一个alpine,并且,使用容器alpine1的IP和端口
如果我们使用默认的bridge模式,是不能通过容器名相互ping的,进入之前创建的boot容器中。pring java:8这个容器是不能够ping通的。所以我们需要自定义网络
docker network create 网络名
docker会再次虚拟一块网卡出来,这里不再使用默认的docker0网卡:
注意:Linux为了安全起见,多于一块网卡的时候会禁用IPV4的转发,会导致外网不能连接 docker内部的服务
所以我们需要开启IPV4的转发
vim /etc/sysctl.conf
#配置转发
net.ipv4.ip_forward=1
#保存退出就可以了
:wq!
#重启服务,让配置生效
systemctl restart network
docker run -it --network custome --name cent2 centos:7 /bin/bash #创建cent2
docker run -it --network custome --name cent3 centos:7 /bin/bash #创建cent3
为什么自定义网络能通过服务名Ping通呢?
自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)
官网:https://docs.docker.com/compose/compose-file/compose-file-v3/(指导使用)
官网下载:https://docs.docker.com/compose/install/(下载)
执行下面的命令
curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose #从Github下载可执行二进制文件
chomd +x /usr/local/lib/docker/cli-plugins/docker-compose #将可执行权限应用于二进制文件:
docker compose version
rm -f /usr/local/lib/docker/cli-plugins/docker-compose
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
dokcer-compose config # 检查配置
dokcer-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zzyy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar dockertest.jar
# 运行jar包
RUN bash -c 'touch /dockertest.jar'
ENTRYPOINT ["java","-jar","/dockertest.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
version: "3"
services:
microService: #名字
image: zzyy_docker:1.6 #微服务镜像
container_name: ms01
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- atguigu_net #加入自定义网络
depends_on: #代表在这个镜像容器启动前先启动的
- redis
- mysql
redis:
image: redis:6.0.8 #Redis镜像
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- atguigu_net #加入自定义网络
command: redis-server /etc/redis/redis.conf #comman选项
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'user'
MYSQL_PASSWORD: '123456'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- atguigu_net #加入自定义网络
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks: #创建网络
atguigu_net:
docker compose up
Service的字母写错了
IPV4的转发被禁止了,外网不能访问docker 所以需要修改
vim /etc/sysctl.conf
#配置转发
net.ipv4.ip_forward=1
#保存退出就可以了
:wq!
#重启服务,让配置生效
systemctl restart network
第一次运行,docker中不存在容器,先创建容器
第二次运行:docker中存在容器了 直接运行
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。
官网:https://www.portainer.io/
官网文档:https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux
docker run -d -p 8000:8000 -p 9443:9443 -p 9000:9000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:2.9.3
–restart =always 代表 随着docker启动而启动,docker停止而停止
对应的Docker命令是
docker system df
原生命令
docker stats #查看docker容器状况
一句话:CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表
编写docker-compose.yml文件
version: '3.1'
volumes:
grafana_data: {}
services:
influxdb:
image: tutum/influxdb:0.9
restart: always
environment:
- PRE_CREATE_DB=cadvisor
ports:
- "8083:8083"
- "8086:8086"
volumes:
- ./data/influxdb:/data
cadvisor:
image: google/cadvisor
links:
- influxdb:influxsrv
command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
user: "104"
image: grafana/grafana
user: "104"
restart: always
links:
- influxdb:influxsrv
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- HTTP_USER=admin
- HTTP_PASS=admin
- INFLUXDB_HOST=influxsrv
- INFLUXDB_PORT=8086
- INFLUXDB_NAME=cadvisor
- INFLUXDB_USER=root
- INFLUXDB_PASS=root
docker compose up
http://IP:8080 ##第一次访问要收集数据可能会有点慢
http://IP:8083
http://IP:3000 #默认账号密码 admin admin