目录

[toc]

一、docker安装

Mac OS Docker安装

官网地址:https://www.docker.com/ 根据对应版本下载

二、Docker使用

Docker Dockerfile

部署一个java应用为列,Dockerfile 文件编写:

1
2
3
4
5
6
7
8
9
FROM eclipse-temurin:8-jdk-jammy

COPY javaWeb.jar /usr/local/javaWeb.jar

RUN bash -c "touch /usr/local/javaWeb.jar"

EXPOSE 8010

ENTRYPOINT ["java", "-jar", "/usr/local/javaWeb.jar"]

FROM: 定制的镜像都是基于 FROM 的镜像, 初始化镜像中的环境

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:

1
2
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

1
2
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

1
2
3
4
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

1
2
3
4
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

开始构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 javaWeb:v1(镜像名称:镜像版本)。

docker build -t javaWeb:v1 .

指令详解
  1. COPY 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
1
2
COPY hom* /mydir/
COPY hom?.txt /mydir/
  1. ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  1. CMD 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

    CMD 在docker run 时运行。 RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:

1
2
3
CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
  1. ENTRYPOINT 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 –entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:

1
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假设已通过 Dockerfile 构建了 nginx:test 镜像:

1
2
3
4
FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参

Docker Compose

docker-compose.yml 配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# yaml 配置实例
version: '3'
services:
anysignws:
image: anysignws:latest
container_name: anysignws
environment:
TZ: Asia/Shanghai
ports:
- '8010:8010'
command: --net host
manager:
image: manager:latest
container_name: manager
ports:
- '8001:8000'

推送到镜像:

docker-compose up #控制台启动
docker-compose up -d #后台启动

openjdk-8支持AWT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM openjdk:8-jre-alpine3.9

ENV TZ=Asia/Shanghai \
LANG=en_US.UTF-8

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
#设置数据源
&& apk update \
#更新最新本地镜像源
&& apk upgrade \
#升级软件
&& apk add ca-certificates \
&& update-ca-certificates \
&& apk add --update tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apk add --update --no-cache busybox-extras iproute2 curl net-tools font-adobe-100dpi ttf-dejavu fontconfig \
&& rm -rf /var/cache/apk/*

三、Docker实例

容器间网络访问工具安装

docker network create –subnet=172.15.0.0/16 tools-net

minio安装

1.拉取镜像

1
docker pull minio/minio

2.设置配置并运行镜像

1
2
3
4
5
6
7
8
9
 docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio1 \
-v /mnt/data:/data \
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
quay.io/minio/minio server /data --console-address ":9001"
Windows

postgresql安装

1
2
3
4
docker run --name postgres -v /Users/m_yf/soft/postgresql/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -d -p 5432:5432 postgres:12.4

#指定容器内访问
docker run --net tools-net --ip 172.18.0.3 --restart always --name postgresql -e POSTGRES_PASSWORD=qwaszx12P! -p 5432:5432 -v D:\docker-work\postgresql:/var/lib/postgresql/data -d postgres:12.4

rabbitMq安装

1
docker run -d --hostname my-rabbit --name rabbit -v /Users/m_yf/soft/rabbitMq:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 -p 15672:15672 -p 5672:5672 rabbitmq:3-management

mysql安装

1
docker run --restart=unless-stopped -d --name mysql -v /Users/m_yf/soft/mysql/mysql8.0/conf/my.cnf:/etc/mysql/my.cnf -v  /Users/m_yf/soft/mysql/mysql8.0/data:/var/lib/mysql -p 3307:3307 -e MYSQL_ROOT_PASSWORD=123456 mysql