常用命令
| docker version |
| docker info |
| docker <命令> --help |
| |
| |
| docker login -u <用户名> |
| docker tag <镜像名> <用户名>/<镜像名> |
| docker images |
| docker push <用户名>/<镜像名> |
| docker run -dp <本机端口号>:<容器端口号> <用户名>/<镜像名> |
| docker rmi -f <image-id> |
| docker rmi -f $(docker images -aq) |
| docker image prune |
| docker search <镜像名> --filter=STARS=3000 |
| docker pull <镜像名>:<tag> |
| |
| |
| docker run -d -p 80:80 --name <容器名> <镜像名> |
| docker run -dp 80:80 --name <容器名> <镜像名> |
| docker run -it <镜像名> /bin/bash |
| docker exec -d <container-name/container-id> <命令> |
| docker exec -it <container-name/container-id> /bin/bash |
| docker attach --sig-proxy=false <container-name/container-id> |
| docker ps |
| docker ps -a |
| docker ps --all |
| docker start <container-name/container-id> |
| docker stop <container-name/container-id> |
| docker restart <container-name/container-id> |
| docker kill <container-name/container-id> |
| docker rm <container-id> |
| docker rm <container-id> <container-id> <container-id> <container-id> |
| docker rm -f <container-id> |
| docker rm -f $(docker ps -aq) |
| docker top <container-id> |
| docker inspect <container-id> |
| |
| |
| docker cp <container-id>:<容器中的文件> <拷贝到本机的目录> |
| docker cp <本机文件> <container-id>:<容器中的文件的目录> |
| |
| |
| docker volume create <卷名> |
| docker volume list |
| docker run -dp <本机端口号>:<容器端口号> -v <卷名>:<容器中的挂载目录> <用户名>/<镜像名> |
| docker volume inspect <卷名> |
| |
| |
| docker run -dp 3000:3000 \ |
| -w /app \ |
| -v "$(pwd):/app" \ |
| node:12-alpine \ |
| sh -c "yarn install && yarn run dev" |
| |
| |
| docker logs -f <container-id> |
| docker logs -tf --tail 10 <container-id> |
| |
| |
| docker network create <网络名> |
| docker network create -d bridge <网络名> |
| docker network list |
| |
| docker run -d \ |
| --network <网络名> \ |
| --network-alias <网络别名> \ |
| -v <卷名>:<容器中的挂载目录> \ |
| -e MYSQL_ROOT_PASSWORD=<root用户密码> \ |
| -e MYSQL_DATABASE=<数据库名> \ |
| mysql:5.7 |
| |
| docker exec -it <mysql-container-id> mysql -u root -p |
| docker run -it --network <网络名> nicolaka/netshoot |
| dig mysql |
Dockerfile
Dockerfile 文件
| |
| |
| |
| |
| ARG IMAGE_NAME=<镜像名> |
| |
| |
| |
| |
| FROM ${IMAGE_NAME} as <镜像别名> |
| |
| |
| LABEL |
| |
| ENV <环境变量名>=<环境变量值> |
| WORKDIR <指定的根目录/命令执行的位置> |
| |
| |
| COPY <本地文件名> <本地文件名> <拷贝到镜像中以 WORKDIR 为根的目录> |
| RUN <构建时运行的命令> |
| CMD ["<命令1>", "<命令2>", "<命令3>"] |
| |
| |
| |
| |
| FROM <镜像名> as <镜像别名> |
| WORKDIR <指定的根目录/命令执行的位置> |
| COPY --from=<上阶段的镜像别名/可用0代替> <上阶段构建好的文件及路径> <移入本阶段的镜像中以 WORKDIR 为根的目录> |
| |
| |
| |
| |
| EXPOSE <暴露的端口号> |
| |
| |
| USER <用户身份/用户名> |
| |
| |
| ENTRYPOINT ["<命令>"] |
| CMD ["<参数1>", "<参数2>", "<参数3>"] |
命令
| docker build --tag docker-gs-ping:latest . |
| docker image tag docker-gs-ping:latest docker-gs-ping:v1.0 |
| docker build -t docker-gs-ping:multistage -f Dockerfile.multistage . |
Docker Compose
| docker run -dp 3000:3000 \ |
| -w /app \ |
| -v "$(pwd):/app" \ |
| --network todo-app \ |
| -e MYSQL_HOST=mysql \ |
| -e MYSQL_USER=root \ |
| -e MYSQL_PASSWORD=123456 \ |
| -e MYSQL_DB=todos \ |
| node:12-alpine \ |
| sh -c "yarn install && yarn run dev" |
docker-compose.yml
| version: "3.7" |
| |
| services: |
| app: |
| image: node:12-alpine |
| command: sh -c "yarn install && yarn run dev" |
| ports: |
| - 3000:3000 |
| working_dir: /app |
| volumes: |
| - ./:/app |
| environment: |
| MYSQL_HOST: mysql |
| MYSQL_USER: root |
| MYSQL_PASSWORD: secret |
| MYSQL_DB: todos |
| |
| mysql: |
| image: mysql:5.7 |
| volumes: |
| - todo-mysql-data:/var/lib/mysql |
| environment: |
| MYSQL_ROOT_PASSWORD: 123456 |
| MYSQL_DATABASE: todos |
| |
| volumes: |
| todo-mysql-data: |
默认情况下,Docker Compose 会自动为应用程序堆栈创建一个网络(这就是为什么我们没有在 Compose 文件中定义一个网络)。
| docker-compose up -d |
| docker-compose up --build -d |
| docker-compose logs -f |
| docker-compose logs -f app |
| docker-compose config |
| docker-compose stop |
| docker-compose down |
安全
| docker scan --login |
| docker scan <镜像名> |
镜像分层
| docker image history getting-started |
| docker image history --no-trunc getting-started |
应用示例
Dockerfile
下载一个demo:https://github.com/docker/getting-started/tree/master/app
Dockerfile
| |
| FROM node:12-alpine |
| WORKDIR /app |
| COPY package.json yarn.lock ./ |
| RUN yarn install --production |
| COPY . . |
| EXPOSE 3000 |
| CMD ["node", "src/index.js"] |
.dockerignore
在这种情况下,应该在第二个 COPY 步骤中省略 node_modules 文件夹,因为它可能会覆盖 RUN 步骤中命令创建的文件。
多阶段构建
| |
| FROM maven AS build |
| WORKDIR /app |
| COPY . . |
| RUN mvn package |
| |
| FROM tomcat |
| COPY --from=build /app/target/file.war /usr/local/tomcat/webapps |
| |
| FROM node:12 AS build |
| WORKDIR /app |
| COPY package* yarn.lock ./ |
| RUN yarn install |
| COPY public ./public |
| COPY src ./src |
| RUN yarn run build |
| |
| FROM nginx:alpine |
| COPY --from=build /app/build /usr/share/nginx/html |
克隆项目
| git clone https://github.com/olliefr/docker-gs-ping |
dockerfile.multigrade
| |
| |
| |
| |
| |
| |
| |
| |
| FROM golang:alpine AS builder |
| |
| LABEL maintainer="toki@toki-plus@qq.com" \ |
| version="v1.0" \ |
| description="描述信息" \ |
| date="2022-04-11" |
| |
| ENV CGO_ENABLED 0 |
| ENV GOOS linux |
| ENV GOARCH amd64 |
| |
| |
| WORKDIR /app |
| |
| |
| COPY go.mod go.sum ./ |
| |
| |
| RUN go env -w GO111MODULE=on \ |
| && go env -w GOPROXY=https://goproxy.cn,direct \ |
| && go mod download \ |
| && go mod verify |
| |
| |
| COPY *.go ./ |
| |
| |
| RUN go build -ldflags="-s -w" -o /docker-gs-ping |
| |
| |
| |
| |
| |
| FROM alpine:latest as deployer |
| |
| |
| RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata |
| ENV TZ Asia/Shanghai |
| |
| WORKDIR / |
| |
| |
| COPY --from=builder /docker-gs-ping /docker-gs-ping |
| |
| |
| EXPOSE 8080 |
| |
| USER nonroot:nonroot |
| |
| |
| ENTRYPOINT ["/docker-gs-ping"] |
用 -t
为镜像添加标签,例如 <镜像名:版本号>
用 -f
指定自定义的 Dockerfile 文件名,默认的文件名为 Dockerfile
最后的 .
表示 Dockerfile 所在的位置
| docker build -t docker-gs-ping:multistage -f Dockerfile.multistage . |
| docker run --publish 8080:8080 docker-gs-ping |
打开新的命令行
| curl http://localhost:8080/ |
已分离模式运行
| docker run -d -p 8080:8080 --name rest-server docker-gs-ping |
| |
| curl http://localhost:8080/ |
储存
| |
| docker volume create roach |
| |
| |
| docker volume list |
网络
| |
| docker network create -d bridge mynet |
| |
| |
| docker network list |
启动数据库引擎
| docker run -d \ |
| --name roach \ |
| --hostname db \ |
| --network mynet \ |
| -p 26257:26257 \ |
| -p 8080:8080 \ |
| -v roach:/cockroach/cockroach-data \ |
| cockroachdb/cockroach:latest-v20.1 \ |
| start-single-node --insecure |
配置数据库引擎
| docker exec -it roach ./cockroach sql --insecure |
| CREATE DATABASE mydb; |
| CREATE USER totoro; |
| GRANT ALL ON DATABASE mydb TO totoro; |
| |
| quit |
示例应用
| git clone https://github.com/olliefr/docker-gs-ping-roach.git |
| |
| docker build --tag docker-gs-ping-roach . |
| |
| docker run -it --rm -d \ |
| --network mynet \ |
| --name rest-server \ |
| -p 80:8080 \ |
| -e PGUSER=totoro \ |
| -e PGPASSWORD=myfriend \ |
| -e PGHOST=db \ |
| -e PGPORT=26257 \ |
| -e PGDATABASE=mydb \ |
| docker-gs-ping-roach |
| |
| curl localhost |
| |
| |
| curl --request POST \ |
| --url http://localhost/send \ |
| --header 'content-type: application/json' \ |
| --data '{"value": "Hello, Docker!"}' |
| docker container stop rest-server roach |
| docker container rm rest-server roach |
| docker container list --all |
| docker run -d \ |
| --name roach \ |
| --hostname db \ |
| --network mynet \ |
| -p 26257:26257 \ |
| -p 8080:8080 \ |
| -v roach:/cockroach/cockroach-data \ |
| cockroachdb/cockroach:latest-v20.1 start-single-node \ |
| --insecure |
| |
| docker run -it --rm -d \ |
| --network mynet \ |
| --name rest-server \ |
| -p 80:8080 \ |
| -e PGUSER=totoro \ |
| -e PGPASSWORD=myfriend \ |
| -e PGHOST=db \ |
| -e PGPORT=26257 \ |
| -e PGDATABASE=mydb \ |
| docker-gs-ping-roach |
| |
| curl localhost |
| docker container list |
Docker Compose
docker-compose.yml
| version: '3.8' |
| |
| services: |
| docker-gs-ping-roach: |
| depends_on: |
| - roach |
| build: |
| context: . |
| container_name: rest-server |
| hostname: rest-server |
| networks: |
| - mynet |
| ports: |
| - 80:8080 |
| environment: |
| - PGUSER=${PGUSER:-totoro} |
| - PGPASSWORD=${PGPASSWORD:?database password not set} |
| - PGHOST=${PGHOST:-db} |
| - PGPORT=${PGPORT:-26257} |
| - PGDATABASE=${PGDATABASE:-mydb} |
| deploy: |
| restart_policy: |
| condition: on-failure |
| roach: |
| image: cockroachdb/cockroach:latest-v20.1 |
| container_name: roach |
| hostname: db |
| networks: |
| - mynet |
| ports: |
| - 26257:26257 |
| - 8080:8080 |
| volumes: |
| - roach:/cockroach/cockroach-data |
| command: start-single-node --insecure |
| |
| volumes: |
| roach: |
| |
| networks: |
| mynet: |
| driver: bridge |
docker compose 将自动从 .env
文件中读取环境变量。由于 Compose 文件要求设置 PGPASSWORD,因此我们将以下内容添加到 .env
文件
| docker-compose config |
| docker-compose up --build -d |
| docker exec -it roach ./cockroach sql --insecure |
| curl http://localhost/ |
| docker-compose stop |
| docker-compose down |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步