Dockerfile+docker-compose介绍
| 课程回顾
1、容器的启动命令是什么?
sudo docker start 容器名称/容器ID
2、镜像的删除命令是什么?
sudo docker rmi 镜像名称
| 预习检查
1、Dockerfile中的FROM是什么意思?
FROM 后面是基于什么镜像来构建镜像
2、Dockerfile中的RUN是什么意思?
RUN 后面紧跟shell要执行的命令
| 章节目标
- Dockerfile概念。
- Dockerfile的文件命令介绍 。
- docker-compose概念。
- docker-compose使用介绍。
- 设置mysql远程登录
| 章节重点、难点
1)、重点
Dockerfile文件的创建。
2)、难点
Dockerfile的文件介绍。
| 知识点讲解
Dockerfile概念
1、什么是Dockerfile
Dockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成镜像。
生成镜像的几种方式
2、基本结构
一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
Dockerfile的文件介绍
1、FROM 指定基础镜像,必须是第一个指令
格式:
FROM <image> [AS <name>]
FROM <image>:[<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]
示例:
FROM centos:7
# 编译阶段 命名为 centos7
FROM centos:7 as centos7
ARG CODE_VERSION=7
FROM centos:${CODE_VERSION}
注:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
2、MAINTAINER 指定作者
格式:
MAINTAINER <name>
示例:
MAINTAINER hary_lei@qq.com
MAINTAINER hary_lei
sudo docker inspect dmw_redis #查看作者信息
3、RUN构建镜像时执行的命令
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行格式:
RUN <command>
exec执行格式:
RUN ["executable", "param1", "param2"]
示例:
RUN rm apache-tomcat-8.5.43.tar.gz #shell执行
4、ADD将本地文件添加到容器中
ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源。
语法:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
ADD apache-tomcat-8.5.43.tar.gz /usr/local/
# apache-tomcat-8.5.43.tar.gz添加到 usr/local下 ,可以使用* ?,*表示任意,?表示一个
5、COPY将本地文件添加到容器中
COPY和ADD类似,但不会自动解压,也不能访问网络资源。
6、CMD容器启动时才进行调用
语法:
CMD ["executable","param1","param2"]
CMD command param1 param2
示例:
CMD ["/usr/bin/supervisord"]
CMD /usr/sbin/sshd -D
7、ENTRYPOINT配置容器使其可执行化
语法:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
示例:
ENTRYPOINT ["java","-server","-Xms64m","-Xmx128m","-jar","dm-base-consumer-1.0-SNAPSHOT.jar"]
注:ENTRYPOINT与CMD非常类似,不同的是通过docker run 命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT
Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
8、ENV设置环境变量
语法:
ENV <key> <value>
ENV <key>=<value> ...
示例:
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_212
ENV PATH=$JAVA_HOME/bin:$PATH
9、EXPOSE指定于外界交互的端口
语法:
EXPOSE <port> [<port>...]
示例:
EXPOSE 22
EXPOSE 8080
注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
10、WORKDIR指定工作目录,类似于cd命令
语法:
WORKDIR /path/to/workdir
示例:
WORKDIR /usr/local/
注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
11、USER指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户
语法:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER elsearch
注:使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。
12、讲解centos、jdk、tomcat的Dockerfile文件
13、使用Dockerfile构建镜像
语法:
sudo docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
- –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式
示例:
#进入centos7文件的目录下运行
sudo docker build -t yi/centos7-ssh . #.指的是当前目录下的Dockerfile文件
sudo docker build -t yi/centos7-jdk8u212 .
sudo docker build -t yi/centos7-tomcat8 .
14、docker问题
问题1:
容器中使用:ping www.baidu.com出现如下错误
ping: www.baidu.com: Name or service not known
解决办法:
vi /etc/resolv.conf #修改DNS
#设置如下值
nameserver 8.8.8.8
nameserver 114.114.114.114
问题2:
使用xshell登录不上容器
使用如下命令创建容器
sudo docker run -it -p 8080:8080 -p 23:22 --privileged=true --name tomcat8 web-demo /usr/sbin/init
修改sshd_config文件
vi /etc/ssh/sshd_config
#Port 22 此处注释去了
#PermitRootLogin yes 此处注释去了
重启ssh服务
systemctl start sshd.service #启动服务
systemctl restart sshd.service #重启动服务
docker-compose概念
1、什么是docker-compose
docker-compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用docker-compose不再需要使用shell脚本来启动容器。
docker-compose使用介绍
1、安装docker-compose
ubuntu安装
sudo apt install docker-compose -y
centos7安装
sudo yum -y install epel-release
sudo yum -y install python-pip #安装pip
sudo pip install --upgrade pip #pip进行升级
sudo pip install docker-compose #安装 如此条不能安装使用下面的
#pip install docker-compose --ignore-installed requests
sudo docker-compose -version #查看版本
#第二种安装
#创建用户组docker
sudo groupadd docker
sudo gpasswd -a dmw docker
sudo service docker restart
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
sudo docker-compose --version
2、解析docker-compose.yml文件
version: '2' #表示该 Docker-Compose 文件使用的是 Version 2 file
services:
redis: # 指定服务名称
build: /home/px2/envdm/Redis/ #指定Dockerfile所在路径
environment: #定义环境变量
- TZ=Asia/Shanghai #指定时区
mem_limit: 300M # 指定限制内存大小
ports: # 指定端口映射
- "6379:6379"
elasticsearch: # 指定服务名称
build: /home/px2/envdm/Elasticsearch/ #指定 Dockerfile所在路径
environment:
- TZ=Asia/Shanghai
mem_limit: 300M
ports: # 暴露端口信息 - "宿主机端口:容器暴露端口"
- "9200:9200"
- "9300:9300"
networks:
default:
external:
name: envdm
#使用已存在的网络 如果前面没有使用docker network create envdm网络此处则会报错
3、docker-compose命令使用
#ps
sudo docker-compose ps #列出所有运行容器
#logs
sudo docker-compose logs #查看服务日志输出
#build
sudo docker-compose build #构建或者重新构建服务
#start
sudo docker-compose start envdm_mysql_1 #启动指定服务已存在的容器
#stop
sudo docker-compose stop envdm_mysql_1 #停止已运行的服务的容器
#rm
sudo docker-compose rm envdm_mysql_1 #删除指定服务的容器
#up
sudo docker-compose up envdm_mysql_1 #构建、启动容器envdm_mysql_1
sudo docker-compose up -d #把当前目录下的docker-compose.yml中的所有服务构建镜像、启动容器
#kill
sudo docker-compose kill envdm_mysql_1 #通过发送 SIGKILL 信号来停止指定服务的容器
4、构建基础服务
如下图:
在linux的此目录下使用如下命令构建基础服务:
sudo docker-compose up -d
可能会出现有些安装包网络连接异常,或者版本不存在问题。docker-compose.yml文件中指定的Dockfile文件路径不对问题也需要注意。
设置mysql远程登录
1、登录容器
sudo docker exec -it envdm_mysql_1 /bin/bash #进入mysql容器
2、登录mysql数据库
mysql -uroot #登录
3、切换数据库
use mysql
4、修改root密码为123456
update user set password=password('123456') where user='root' and host='localhost';
5、允许远程登录root用户
grant all privileges on *.* to root@'%' identified by '123456' with grant option;
如下图:
6、设置数据库其它配置
#爱旅行要设置最大连接数
#显示所有连接数 sleep状态是处于连接状态
show processlist;
#查看最大连接数
show variables like 'max_connections';
#修改最大连接数
set global max_connections=3000;
#显示非交互的等待时间
show global variables like 'wait_timeout';
#修改交互等待时间 单位秒
set global wait_timeout = 120;