zhaoyu@home:~$

运行软件

创建和启动容器

docker将运行一个软件程序所需的文件和组件集合称为一个image。
下面,我们从Docker Hub中下载和安装一个nginx image。Docker Hub是有官方维护的可信任的image库。运行下面命令会下载、安装、启动一个nginx 容器: ```shell script docker run –detach –name web nginx:latest

然后,一行随机的字符串会写向终端。如:`7cb5d2b9a7eab87f07182b5bf58936c9947890995b1b94f412912fa822a9ecb5`。 
验证nginx 是否启动成功
```shell script
wget -O - http://web:80/

如果成功,显示Welcome to NGINX!字样。

--detach或其简写-d选项表示在后台运行,意思是,该程序虽然运行了,但是未连接到终端。通过这种方式启动很重要,因为很少有软件需要连接到终端运行。 后端运行的程序通常称为daemon或者service。daemon一般通过网络或者其他通信管道和程序或人交互。

运行交互式容器

终端文本编辑器是典型的终端交互程序。通常通过输入和输出交互。docker运行交互式容器如下: ```shell script docker run –interactive –tty –link web:web –name web_test busybox:1.29 /bin/sh

该命令使用两个参数--interactive (or -i) 和 --tty (or -t)。

### 多阶段构建。
Docker镜像越来越大,层数会越来越多,简单的例子,每个RUN命令都会添加一个layer,我们可以将RUN命令通过连接符链接,尽量减少命令。当这些策略乏力时,
我们可以使用多阶段构建。        
多阶段构建是一种更优化的构建。在Dockerfile中包含了多个FROM指令。每个FROM指令是一个新的构建阶段,可以很容易从前面的阶段COPY内容。
如下:
```shell script
FROM node:latest AS storefront
WORKDIR /usr/src/atsea/app/react-app
COPY react-app .
RUN npm install
RUN npm run build

FROM maven:latest AS appserver
WORKDIR /usr/src/atsea
COPY pom.xml .
RUN mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve
COPY . .
RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests

FROM java:8-jdk-alpine AS production
RUN adduser -Dh /home/gordon gordon
WORKDIR /static
COPY --from=storefront /usr/src/atsea/app/react-app/build/ .
WORKDIR /app
COPY --from=appserver /usr/src/atsea/target/AtSea-0.0.1-SNAPSHOT.jar .
ENTRYPOINT ["java", "-jar", "/app/AtSea-0.0.1-SNAPSHOT.jar"]
CMD ["--spring.profiles.active=postgres"]

FROM production as default  # default定义默认的阶段。

上面的构建脚本有3个阶段:storefront,appserver,production。production通过COPY --from从storefront,appserver阶段复制内容。 多阶段构建的主要目的有两个,1:阶段命名让我们在同一个Dockerfile中阶段互相引用。2:构建时可以通过指令--target指定阶段构建。 shell script docker image build -t zhaoyu/multi-stage -f multi-stage.df --target=production .