Docker 初探

Docker 初探

  • Docker 初探
    • Install Docker Desktop
    • 配置镜像源
    • 创建 Node.js 开发环境
      • Using a single `docker run` command
      • Using a `Dockerfile`
      • Using Docker Compose
    • Docker Image 迁移
    • 三种方法的对比
    • 结合 VSCode 一起使用
    • Window 下的 Docker 配置

Docker 初探

Install Docker Desktop

从阿里镜像点下载安装包.

本文所用的是 Mac 操作系统, 当前 Docker Desktop 最新的版本是 2.3.0.2(45183)
阿里也提供了其他操作系统下的 Docker 安装版本镜像环境

Docker 初探_第1张图片

配置镜像源

为了快速拉取 Docker Image 需要指定国内镜像源

"registry-mirrors": [
  "https://g0tuh4k5.mirror.aliyuncs.com",
  "http://registry.docker-cn.com",
  "http://docker.mirrors.ustc.edu.cn",
  "http://hub-mirror.c.163.com"
]

PS: 上面阿里的镜像源 https://g0tuh4k5.mirror.aliyuncs.com 需要注册成为阿里的开发者, 并开通 “容器服务” 后由阿里自动分配的镜像源地址.

Docker 初探_第2张图片

创建 Node.js 开发环境

使用 docker 创建一个基于 Node.js 的开发环境, 以下内容是对 Use Docker to Create a Node Development Enviroment 文章的理解整理而成.

Using a single docker run command

执行如下命令

docker run --rm -it --name node-docker \
-v $PWD:/home/app -w /home/app \
-e "PORT=3000" -p 8080:3000  \
-u node node:latest /bin/bash
  • docker run 创建一个新的容器实例(container instance)
  • --rm 一旦退出容器将自动停止和删除容器实例
  • -i-t 运行可交互式进程, 比如一个 shell
  • --name 设定容器实例的名称
  • -v mounts 一个本地目录到容器目录
  • -w 指定工作目录
  • -e 设置环境变量
  • -p 映射本地端口到容器端口
  • u 指定登录的用户名. 这里使用 node 用户登录容器实例的 shell, 因为 node 容器封装 linux 操作系统, node 用户是其自带的一个用户
  • node:latest image 的名称和标签, 这里指的是 node image 的最新版本

如果 image 不存在(如上述命令中的 node:latest), Docker 会在后台进程中自动执行 docker pull 命令从 docker hub 下载该 image

Using a Dockerfile

使用 Dockerfile 创建一个自定义的 image.

创建一个名为 Dockerfile 的文件, 并写入如下内容

FROM node:latest

WORKDIR /home/app
USER node
ENV PORT 3000

EXPOSE 3000

ENTRYPOINT /bin/bash
  • From 指定该自定义 image 基于 image: node:latest
  • WORKDIR 定义 -w
  • USER 定义 -u
  • ENV 定义 -e
  • EXPOSE 定义输出端口号
  • ENTRYPOINT 指定当容器运行后执行 /bin/bash 命令

自定义的 image 需要 使用 docker build 去创建

docker build -t node-docker .
  • -t 指定 image 的名称
  • . 指定 Dockfile 文件所在的路径

创建完自定义 image 后, 使用如下命令创建容器

docker run --rm -it --name node-docker \
-v $PWD:/home/app -p 8080:3000 \
node-docker

Using Docker Compose

Docker Compose 可以定义 Node development environment 作为一个服务.

在上面的 docker run 命令中还需要指定 continer name, volume mouting, port mapping

下面我们使用 docker-compose 命令来简化运行容器的命令

创建 docker-compose.yml 文件, 并写入如下内容

version: "3"
services:
  nod_dev_env:
    build: .
    container_name: node-docker
    ports:
      - 8080:3000
    volumes:
      - ./:/home/app
  • nod_dev_env 设定服务的名称
  • build 指定 Dockfile 的路径
  • container_name 设定容器的名称
  • ports 配置端口映射
  • volumes 卷标映射

执行下列命令来执行服务

docker-compose run --rm --service-ports nod_dev_env
  • run 命令就像 docker run -it 命令
  • --service-ports 使用 docker-compose.yml 文件中配置的 ports 指定主机和容器的端口映射

Docker Image 迁移

可以通过如下命令将本机的 image 生成一个文件, 从而可以将其 copy 到其他机器中, 省的必须使用 docker hub 去下载

保存 Docker image 为一个 tar 文件

docker save -o <path for generated tar file> <image name>

copy 这个文件到目的主机的文件系统中, 然后 load 该 image tar 文件到 Docker 中

docker load -i <path to image tar file>

上面的内容参考了 stackoverflow 中的帖子

三种方法的对比

  • docker run 方法直接从 docker hub 中下载 image (如果本地不存在), 命令比较冗长
  • Dockerfile 方法会基于指定的 image 创建一个新的自定义的 image, 命令相对 docker run 简洁一些
  • docker compose 方法以服务的方式提供容器的运行环境, 命令是最为简洁的一种

以下使用如下 Dockerfile 和 docker-compose.yml 来创建容器

  • Dockerfile
FROM node:latest

WORKDIR /home/app
USER node
ENV PORT 3000

EXPOSE 3000
  • docker-compose.yml
version: "3.4"
services:
  nod_dev_env:
    build: .
    image: docker-node
    container_name: node-docker
    ports:
      - 8080:3000
    volumes:
      - ./:/home/app

执行 docker image ls 命令可以看到有两个 image, 其中 docker-node image 的名称是在 docker-compose.yml 中通过 image 参数指定的, 同时必须指定 build 参数.

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-node         latest              37e7ed057eae        56 seconds ago      942MB
node                latest              91a3cf793116        5 days ago          942MB

结合 VSCode 一起使用

在 VSCode 中, 采用基于 Node.js 的容器开发环境部署.

  • ~/workspace/git-repositories/node/: 该目录下放置基于 Node.js 的 Github 仓库

~/workspace/git-repositories/node/ 目录下增加如下文件

  • Dockerfile
FROM node:latest

WORKDIR /home/app
USER node

RUN yarn config set registry "https://registry.npm.taobao.org/"
RUN npm config set registry "https://registry.npm.taobao.org/"

ENV PORT 3000

EXPOSE 3000
EXPOSE 4000
  • docker-compose.yml
version: '3.4'

services:
  docker-node:
    image: docker-node
    build: .
    ports:
      - 3000:3000
      - 4000:4000
    volumes:
      - ./:/home/app

Window 下的 Docker 配置

  • 添加 Docker Hub 镜像地址:在 %USERPROFILE%/.docker/machines/default/config 文件中添加如下内容
"RegistryMirror": [
    "https://g0tuh4k5.mirror.aliyuncs.com",
    "http://registry.docker-cn.com",
    "http://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
]

你可能感兴趣的:(docker)