Eth.Young

Docker 入门

05-06. 阅读3 分钟

是什么?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 的主要特点包括:

  1. 轻量级:Docker 容器共享主机的操作系统内核,因此相比于虚拟机,它们占用的资源更少,启动更快速。
  2. 可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发、测试还是生产环境,保持一致性。
  3. 快速部署:Docker 镜像包含了应用程序及其所有依赖项,因此可以快速部署和启动容器,无需进行繁琐的配置和安装。
  4. 环境一致性:Docker 容器将应用程序与其依赖项打包在一起,确保在不同环境中运行时具有一致的行为。
  5. 资源隔离:Docker 使用 Linux 内核的容器功能,实现了容器之间的资源隔离,保证容器之间互不影响。

概念

如何工作

这里借用图片 bytebytego Untitled.jpeg

如何使用?

一般构建 docker 应用分为以下步骤:

编写 Dockerfile

Dockerfile 是一个文本文件,包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容都会对镜像产生影响。Dockerfile 的基本格式如下:

# Base image
FROM node:14    # 指定基础镜像

# Author
MAINTAINER matrixpunk <
# Set working directory
WORKDIR /app    # 设置工作目录

# Copy source code
COPY . /app     # 拷贝文件

# Install dependencies
RUN npm install # 安装依赖

# Expose port
EXPOSE 3000     # 暴露端口

# Start app
CMD ["npm", "start"] # 启动命令

构建 Docker 镜像

docker build -t my-node-app .

运行 Docker 容器

docker run -d -p 3000:3000 my-node-app

运行 docker 容器时,可以使用 -d 参数让容器在后台运行,-p 参数指定端口映射。 剩余参数如下:

  • -i:以交互模式运行容器
  • -t:分配一个伪终端
  • --name:指定容器名称
  • -v:挂载数据卷
  • --rm:容器停止后自动删除

其余命令

查看所有容器

docker ps -a

停止容器

docker stop <container_name>

删除容器

docker rm <container_name>

列举所有容器

docker ps

列举所有容器 (包括停止的)

docker ps -a

列举所有镜像

docker images

删除镜像

docker rmi <image_name>

拉取 Docker 镜像

docker pull <image_name>

推送 Docker 镜像

docker push <image_name>

查看 Docker 容器信息

docker inspect <container_name>

查看 Docker 容器日志

docker logs <container_name>

Docker 容器操作

docker exec <container_name> <command>

进入 Docker 容器

docker exec -it <container_name> /bin/bash

当我们使用 docker 构建多个镜像时,我们可以使用 docker-compose 来管理多个容器

Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YAML 文件来配置应用的服务,然后使用一个命令就可以创建并启动所有服务。

通常用于本地开发环境,生产环境建议使用 Docker Swarm 或 Kubernetes。

使用 Docker Compose

确保当前目录存在 docker-compose.yml compose.yml 文件 139.196.125.106 服务器的 docker-compose.yml 文件在/home/ocs/docker 目录下

Yml 文件如下,以及参数说明

version: "3" # 版本
services:
  sample: # 服务名
    build: # 构建镜像目录
      context: ./
      dockerfile: ./docker/Dockerfile
      args:
        NODE_ENV: production
    restart: always # 是否重启之后进行重启
    image: sampleName #  镜像名
    ports: # 端口
      - 3007:80 # 映射端口方式   ->  主机端口:容器端口
    container_name: sampleNameContainer # 容器名
    environment: # 环境变量
      - NGINX_PORT=80
      - API_ENV=api
      - API_URL=http://121.37.190.7:8081/horizon/
      - NODE_ENV=production
      - WEBAPP=horizon
    volumes: # 映射路径地址 ->  主机路径:容器路径
      - /home/nginx/conf.d:/etc/nginx/conf.d
    command: /bin/sh -c "envsubst '$$API_ENV,$$NGINX_PORT,$$API_URL,$$WEBAPP' < /etc/nginx/conf.d/https.template > /etc/nginx/conf.d/default.conf  && exec nginx -g 'daemon off;'" # 启动命令
    networks: # 虚拟网络名字
      - app-net
networks:
  app-net:
    external:
      name: app-net

启动

docker-compose start 服务名

停止

docker-compose stop 服务名

删除容器

docker-compose rm 服务名

构建镜像

docker-compose build 服务名

构建容器

docker-compose up -d 服务名

查看日志 最后 500 行

docker-compose logs --tail 500 服务名

参考

image description