Docker

  • Docker Compose:用于定义和运行多容器 Docker 应用程序的工具,使多个容器可以在隔离环境中一起运行;
  • Dockerfile:用来构建镜像的文本文件,包含了一条条构建镜像所需的指令和说明;
  • Docker Machine:是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker;可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker;

常用命令

docker run <IMAGE> [COMMAND] [ARG…]【创建一个新的容器并运行一个命令】

  • [-d] 后台运行容器
  • [-p] 指定端口映射
  • [-v] 映射主机文件卷
  • [–name <NAME>] 命名容器
  • [-e] 设置环境变量

docker ps [OPTIONS]【列出容器】

  • [-a] 显示所有的容器,包括未运行的

docker rm [OPTIONS] <CONTAINER > 【删除一个或多个已经停止的容器】

  • [-f] 强制删除正在运行的容器
  • [-v] 删除容器挂载的卷

docker build [OPTIONS] <PATH> 【创建镜像】

  • [-f] 指定要使用的 Dockerfile 路径
  • [–rm] 设置镜像成功后删除中间容器

docker save [OPTIONS] <IMAGE> 【将指定镜像保存成 tar 归档文件】

  • [-o <xxx.tar>]

docker load [OPTIONS] 【导入镜像】

  • [-i <xxx.tar>] 指定导入的文件

docker top [OPTIONS] <CONTAINER> 【查看容器中运行的进程信息,支持 ps 命令参数】

实践

如何容器化 Java 应用

Docker Compose:

version: '3'  
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3608:3306" # 将宿主机的 3608 端口映射到容器的 3306 端口

java-app:
build:
context: . # 假设 Dockerfile 在当前目录下
dockerfile: Dockerfile
depends_on:
- db
environment:
DB_HOST: db # Java 程序将连接到名为 "db" 的服务(即 MySQL 容器)
DB_PORT: 3306 # 在容器内部,MySQL 仍然监听 3306 端口
DB_USER: myuser
DB_PASSWORD: mypassword
DB_NAME: mydb
ports:
- "8080:8080" # 假设 Java 程序监听 8080 端口

Dockerfile:

# 基础镜像Java 8
FROM java:8

# 设置工作目录
WORKDIR /app

# 复制文件到工作目录
COPY . /app

# 设置Java环境变量
ENV PATH=$PATH:$JAVA_HOME/bin
ENV JRE_HOME=${JAVA_HOME}/jre
ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

# 暴露端口
EXPOSE 8080

# 运行
ENTRYPOINT ['/usr/lib/jvm/java-9-openjdk-amd64/bin/javac','-jar','app.jar']