Dockerfile是构建镜像的文本文件,是由一系列命令和参数构成的脚本,脚本容包含了一条条构建镜像所需的指令和说明,Dockerfile就是创建一个镜像文件的过程。
命令 | 作用 | 实例 |
---|---|---|
FROM | 指定所需依赖的基础镜像 | FROM centos:7 |
MAINTAINER | 声明镜像创建者信息 | MAINTAINER CJ |
ENV | 设置环境变量 | ENV MYSQL_ROOT_PASSWORD root |
RUN | 在容器构建过程中执行的命令 | RUN curl http://wttr.in |
ADD | 拷贝文件或目录到容器内,如果是URL或压缩包,会自动下载或自动解压 | ADD my-app.jar /app.jar |
COPY | 和ADD相似,但是压缩包并不能自动解压 | |
EXPOSE | 声明需要暴露的端口,容器运行的服务端口 | EXPOSE 8080 |
WORKDIR | #指定工作目录,容器启动时,执行命令会在该目录下执行 | WORKDIR /usr |
CMD | 类似于 RUN 指令,CMD 在docker run 时执行。RUN 是在 docker build时执行 | CMD [“/bin/echo”, “hello world”] |
ENTRYPOINT | 指定容器启动时执行的命令 | ENTRYPOINT[“java”,“-jar”,“/app.jar”] |
步骤:
(1)创建目录
mkdir –p /usr/local/docker/java
(2)进入 /usr/local/docker/java
下载或者上传jdk (感谢这位老哥分享的JDK下载地址)
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"
(3)创建文件Dockerfile vi Dockerfile
FROM image_name (依赖的基础镜像,必须在第一行哦)
#依赖基础镜像名称和tag
FROM centos:7
RUN echo '开始构建.............'
#声明镜像创建者信息
MAINTAINER Jack
#指定工作目录
WORKDIR /usr
#创建目录
RUN mkdir /usr/local/java
#来个操作
RUN curl http://wttr.in
#ADD 把jdk添加到容器中
ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_141
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
RUN echo '构建完成.............'
(4)执行命令构建镜像
-t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的Dockerfile
docker build -t nginx/nginx:latest .
docker build -t=java8 .
空格和点不能省略
. 代表本次执行的上下文路径,也就是Dockerfile存在的目录
图中红框勾选项就是Dockerfile中一系列的指令,从上往下依次执行
(5)查看镜像是否建立完成
docker images
使用Dockerfile构建SpringBoot应用镜像
#依赖基础镜像名称和tag
FROM java:8
#声明镜像创建者信息
MAINTAINER Jack
# 申明一个环境变量
ENV HOME_PATH /home
# 接受传入参数,如:启动容器添加参数:-e PARAMS="--server.port=7777"
ENV PARAMS=""
#指定工作目录,容器启动时,执行命令会在该目录下执行
WORKDIR $HOME_PATH
#ADD 把jdk添加到容器中
ADD target/demo-*.jar $HOME_PATH/app.jar
# 容器启动时运行jar
ENTRYPOINT["java","-jar","/app.jar $PARAMS"]
使用Dockerfile构建maven web应用镜像
#依赖基础镜像名称和tag
FROM tomcat:8
# 挂载时间配置文件
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 申明环境变量
ENV DIR_WEBAPP /usr/local/tomcat/webapps/
# 执行删除命令
RUN rm -rf $DIR_WEBAPP/*
# 执行创建命令
RUN mkdir /avatar
# 复制 jar 到容器中
COPY target/demo-*.war $DIR_WEBAPP/app.war
# 指定工作目录,容器启动时,执行命令会在该目录下执行
WORKDIR /usr/local/tomcat/bin
# 暴露端口
EXPOSE 8080
# 执行命令
CMD ["catalina.sh", "run"]
Compose用于定义和运行多容器的工具。通过Compose,可以使用YML文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从YML文件配置中创建并启动所有服务。
地址:https://github.com/docker/compose/releases
下载Compose
curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
修改该文件的权限为可执行
chmod +x /usr/local/bin/docker-compose
查看安装是否成功
[root@administrator ~]# docker-compose --version
Docker Compose version v2.2.1
使用Docker Compose的步骤
使用 Dockerfile 定义应用程序的环境。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker-compose up 命令来启动并运行整个应用程序
命令 | 实例 | 描述 |
---|---|---|
image | image: mysql:5.7 | 运行的是mysql5.7的镜像 |
container_name | container_name: mysql | 配置容器名称 |
ports | ports: - 3306:3306 |
指定宿主机和容器的端口映射 |
volumes | volumes: - /usr/local/program/mysql/log:/var/log/mysql - /usr/local/program/mysql/data:/var/lib/mysql - /usr/local/program/mysql/conf:/etc/mysql |
将宿主机的文件或目录挂载到容器中 |
environment | environment: -MYSQL_ROOT_PASSWORD=root |
配置环境变量;设置mysqlroot帐号密码的环境变量 |
links | links: -mysql:linktest |
连接其他容器的服务;定义一个别名,从而使用该别名访问其它服务;以mysql或linktest为域名访问服务名称为mysql的容器 |
命令 | 描述 |
---|---|
docker-compose up -d | 构建、创建、启动相关容器;-d表示在后台运行 |
docker-compose stop | 停止所有相关容器 |
docker-compose ps | 列出所有容器信息 |
docker-compose logs | 查看服务日志输出 |
docker-compose build | 构建或者重新构建服务 |
docker-compose start db-service | 启动指定服务已存在的容器 |
docker-compose stop db-service | 停止已运行的服务的容器 |
docker-compose rm db-service | 删除指定服务的容器 |
docker-compose kill db-service | 发送 SIGKILL 信号来停止指定服务的容器 |
docker-compose run db-service bash | 在容器服务上执行一个命令 |
Docker Compose 将所管理的容器分为三层:工程、服务及容器。
定义的所有服务组成一个工程,services节点下即为服务,服务之下为容器。
容器与容器之间以服务名称为域名进行访问,
A(db)、B(web)的两个服务,B服务中连接A服务的数据库: jdbc:mysql://db:3306
#指定docker-compose.yml文件版本
version: '3'
# 定义所有service信息
services:
# 指定服务名称
db-service:
# 指定服务使用的镜像
image: mysql:5.7
# 定义容器重启策略
restart: always
# 指定容器名称
container_name: mysql
# 建立宿主机和容器之间的端口映射关系,容器3306端口和宿主机3307端口建立映射关系
ports:
- 3307:3306
# 指定容器中需要挂载的文件
volumes:
- /usr/local/program/mysql/log:/var/log/mysql
- /usr/local/program/mysql/data:/var/lib/mysql
- /usr/local/program/mysql/conf:/etc/mysql
# docker inspect container_name查看容器默认持久化目录,需要配置定义volumes使用
#- db_data:/var/lib/mysql
# 指定容器的环境变量
environment:
- MYSQL_ROOT_PASSWORD=root123456
# 指定服务名称
myweb-service:
#docker-compose up 以依赖顺序启动服务,先启动db-service
depends_on:
- db-service
# 指定服务使用的镜像
image: tomcat:8
# 指定容器名称
container_name: myweb
# 指定服务运行的端口
ports:
- 8080:8080
# 指定容器中需要挂载的文件
volumes:
- /etc/localtime:/etc/localtime
- /usr/local/program/myweb/logs:/var/logs
# 定义容器和宿主机的卷映射关系
volumes:
db_data: {}
将docker-compose.yml上传到服务器,并在当前目录下运行如下命令:
docker-compose up -d
[root@administrator ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
459b3c14f750 tomcat:8 "catalina.sh run" 7 seconds ago Up 6 seconds 0.0.0.0:8080->8080/tcp myweb
eddd4675b028 mysql:5.7 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp
使用Docker Compose搭建wordpress博客
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- 8090:80
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
启动
[root@administrator docker]# docker-compose up
[+] Running 2/1
⠿ Container docker-db-1 Recreated 0.1s
⠿ Container docker-wordpress-1 Recreated