今天整理文件的时候找到的三年前学习 Docker 时记的笔记。
$ docker image ls
$ docker container run -it ubuntu:16.04 /bin/bash
$ docker container ls
$ Ctrl +P +Q
$ docker exec -it [name] bash
$ docker stop [name]
$ docker rm [name]
$ docker container run -d
--name web1
--publish 8080:80
test:latest
镜像是一种构建时结构 build-time
容器是一种运行时结构 run-time
docker镜像通常比较小,会裁剪掉一些不必要的部分
$ docker [image] pull <repository>:<tag>
$ docker image prune
$ docker image ls --filter dangling=true
$ docker search <image-name>
$ docker image inspect <image>
$ docker image rm <image>
$ docker container run <image> <app>
$ docker container stop <container-id or container-name> #停止
$ docker container start <container-id or container-name> #启动
$ docker container rm <container-id or container-name> # 删除
$ docker container run --name percy -it ubuntu:16.04 /bin/bash
这部分先跳过了
$ docker container run -d --name webserver -p 80:8080 nigelpoulton/pluralsight-docker-ci
# Test web-app to use with Pluralsight courses and Docker Deep Dive book
# Linux x64
FROM alpine
LABEL maintainer="[email protected]"
# Install Node and NPM
RUN apk add --update nodejs nodejs-npm
# Copy app to /src
COPY . /src
WORKDIR /src
# Install dependencies
RUN npm install
EXPOSE 8080
ENTRYPOINT ["node", "./app.js"]
From
指令,指定镜像作为当前镜像的基础镜像层LABEL
标签 是一个键值对,通过增加标签的方式自定义元数据
RUN apk add --update nodejs nodejs-npm
在FROM指定的镜像层上新建了一个镜像层存储安装内容COPY ./src
将应用相关文件从构建上下文复制到当前镜像,并且新建一个镜像层存储WORKDIR /src
设置工作目录RUN npm install
根据package.json的配置信息安装依赖,新增镜像层EXPOSE 8080
通过TCP端口8080对外提供一个Web服务,作为镜像元数据ENTRYPOINT ["node", "./app.js"]
指定当前镜像的入口程序$ docker image tag <current-tag> <new-tag>
$ docker image push <tag>
注释以#开头
指令格式 INSTRUCTION argument
,不区分大小写,但是一般大写增加可读性
Docker image build
按照行解析指令并且顺序执行
如何区分是否会新建镜像层:
镜像构建的基本过程
运行临时容器
在该容器运行Dockerfile
将运行结果保存为各新的镜像层
删除临时容器
于是有了多阶段构建
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
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"]
会根据指定寻找缓存减少构建和存储空间
一旦有指令在缓存中没命中,则不再使用缓存
$ docker image build --nocache=true
则强制忽略缓存
构建LInux镜像时,加上apt-get install时,加上no-install-recommends
参数,安装核心依赖。
version: "3.5"
services:
web-fe:
build: . # 指定Docker基于当前目录(.)下Dockerfile定义的指令来构建一个新镜像
command: python app.py
ports: # 将容器内(-target)的5000端口映射到主机(published)的5000端口
- target: 5000
published: 5000
networks: # 使得Docker将服务连接到指定的网络上
- counter-net
volumes: # 指定Docker将counter-vol卷(source:)挂载到容器内的 /code (target:) counter-vol应该是已经存在,或者是在文件下放的volumes下定义的
- type: volume
source: counter-vol
target: /code
redis:
image: "redis:alpine"
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
$ docker -compose up &
$ docker -compose up -d # 后台启动
$ docker-compose down # 停止和关闭应用
$ docker-compose ps # 查看应用状态
$ docker-compose top # 列出各个服务(容器)内运行的进程
$ docker-compose stop # 停止应用,但是不会删除资源
$ docker-compose rm # 删除停止应用的容器和网络,但是不会删除卷和镜像
$ docker-compose restart # 重启应用
docker-compose up
命令,构建所需镜像,创建网络和卷,并启动容器
-f
参数,指定其他文件-d
参数,后台启动