三、Docker实战
3.1 Docker容器配置Java环境
查看JDK镜像
docker search openjdk:8
下载JDK镜像
docker pull openjdk:8
创建并查看JDK容器
docker run openjdk:8 java -version
3.2 Docker安装Tomcat
查看tomcat 镜像
docker search docker.io/tomee
下载tomcat镜像
docker pull docker.io/tomee
创建并启动tomcat容器
docker run -d --name mytomcat -p 9090:8080 docker.io/tomee
注意:
- -p 映射端口 宿主机端口号:容器内应用端口
- -P 随机端口
注意:这里的宿主机指的是CentOS操作系统。
浏览器访问tomcat容器
开启tomcat容器
docker start 82
查看并关闭防火墙
firewall-cmd --state #查看防火墙状态 systemctl stop firewalld.service #关闭防火墙
访问
http://192.168.66.100:9090
3.3 Docker配置Mysql数据库
查看镜像
docker search mysql:5.7
下载镜像
docker pull mysql:5.7
创建容器并启动
docker run --name mysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
参数:
- -p 我们以后使用3307 端口来访问mysql 为了防止黑客攻击
- -e 配置环境变量
MYSQL_ROOT_PASSWORD 设置容器内mysql root 密码
进入mysql容器
[root@localhost ~]# docker exec -it 43 /bin/bash bash-4.2# mysql -uroot -p
四、Docker数据管理
4.1 数据卷
思考
- Docker容器删除后,在容器中产生的数据还在吗?不在了。
- Docker容器和外部机器可以直接交换文件吗?不能。
- 容器之间能进行数据交互?能,但是要通过数据卷
什么是容器数据卷
- 数据卷是宿主机中的一个目录或文件。
- 当容器目录和数据卷目录绑定后,对方修改会立即同步。
- 一个数据卷可以同时被多个容器同时挂载。
- 一个容器也可以被挂载多个数据卷。
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)
数据卷作用
- 容器数据持久化。
- 外部机器和容器间接通信。
- 容器之间数据交换。
一句话: 卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。
4.2 配置数据卷
docker run -v 宿主机目录(文件):容器内目录(文件)
注意事项
- 目录必须是绝对路径
- 如果目录不存在则会自动创建
- 一个容器可以挂载到多个数据卷上
示例:将tomcat容器挂载到数据卷上
docker run -d --name mytomcat -p 8080:8080 -v /opt/webapps:/usr/local/tomcat/webapps tomcat
4.3 容器数据卷Volume
Volume基本使用
参数:
create # 创建数据卷
inspect #查看数据卷元数据
ls #查看数据卷列表
prune #删除所有未使用的卷
rm #删除数据卷
创建一个自定义数据卷
查看所有数据卷
查看指定数据卷etc-tomcat-vol详情信息
删除数据卷
使用指定卷容器
docker run -d -it --name=edc-tomcat -p 8080:8080 -v edc-tomcat-vol:/usr/local/tomcat/webapps tomcat
注意:
-v代表挂载数据卷,这里使用自定数据卷edc-tomcat-vol,并且将数据卷挂载到/usr/local/tomcat/webapps 。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。
4.4 Mysql数据持久化
五、Dockerfile
5.1 什么是Dockerfile
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。
基本结构
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
例如:
## Dockerfile文件格式 # 1、第一行必须指定 基础镜像信息(dockerhub上下载的,也就是依赖环境) FROM java:8 # 2、维护者信息 MAINTAINER baizhan baizhan@163.com # 3、镜像操作指令(这里下载了tomcatjar包) RUN echo "wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.55/bin/apache-tomcat-9.0.55.tar.gz" run tar -zxvf apache-tomcat-9.0.55.tar.gz -C /usr/local # 4、容器启动执行指令 CMD /usr/local/tomcat/bin/catalina.sh
Dockerfile 四部分说明:
- 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
- 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
- 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
- 最后是CMD指令,来指明运行容器时的操作命令.
5.2 构建镜像
1、在一个空白的文本文件, 命名为Dockerfile
vim Dockerfile
注意文件名称必须为Dockerfile
2、编写Dockerfile文件内容
3、构建镜像
docker build -t 镜像名字(自定义):版本(自定义).
注意
. 代表Dockerfile文件在当前路径,也就是将dockerfile文件放在当前路径。自定义名称必须小写。
4、查看镜像
5、创建镜像容器并运行
使用run指令创建的容器在执行完指令后容器就销毁了/
5.3 常见的13种指令(上)
FROM
指定基础镜像,必须为第一个命令。
FROM <image> FROM <image>:<tag>
注意:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER
维护者信息
MAINTAINER <name>
WORKDIR
工作目录,类似于cd命令
WORKDIR /usr/workdir
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
RUN
构建镜像时执行的命令
# 1. shell执行 格式 RUN <command> # 2. exec执行 格式 RUN ["executable", "param1", "param2"]
注意:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
ADD <src>... <dest> ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:
示例:
1、添加所有以"hom"开头的文件
ADD hom* /mydir/
2、? 替代一个单字符,例如:"home.txt"
ADD hom?.txt /mydir/
3、添加 "test" 到 WORKDIR/relativeDir/
ADD test relativeDir
4、添加 "test" 到 /absoluteDir/
ADD test /absoluteDir/
COPY
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
COPY <源路径> <目标路径>
CMD
构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。
CMD指令与RUN指令相似,也具有两种格式: 1. shell格式:CMD <命令> 2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]
注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
5.4 常见的13种指令下
ENTRYPOINT
配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
指定容器启动的要运行的命令,可以追加命令
ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 (shell内部命令)
示例:
ENTRYPOINT ["top", "-b"]
注意:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
ENV
这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。
ENV <key>=<value>
示例:
ENV JAVA_HOME=/usr/local/jdk1.7.0_79 ENV PATH=$JAVA_HOME/bin:$PATH