docker 入门

Docker 入门

安装 Docker

Windows/Mac 用户安装 Docker Desktop

设置 华为镜像加速,在 Docker Engine 中添加:

{
    "registry-mirrors": [ "https://xxx.mirror.swr.myhuaweicloud.com" ]
}

运行容器:

docker run -d -p 80:80 docker/getting-started

# 合并单字符的选项
# docker run -dp 80:80 docker/getting-started
  • -d 在后台运行容器(detached mode)
  • -p 80:80 将主机的 80 端口映射到容器的 80 端口
  • docker/getting-started 指定使用的镜像

访问服务:http://localhost:80

构建应用镜像

下载应用代码:

git clone https://github.com/docker/getting-started.git

package.json 的同级目录下创建 Dockerfile

FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
  • 基于 node 镜像
  • 安装编译工具
  • 切换当前工作目录
  • 复制主机当前目录下的文件到镜像当前目录
  • 安装应用以来
  • 指定启动容器时执行的命令
  • 暴露 3000 端口

RUN 指定构建镜像时执行的命令;
CMD 指定启动容器时执行的目录;

构建镜像:

docker build -t getting-started .
  • -t 给镜像添加标签(可以认为是镜像的名称)
  • . 表示在当前目录查找 Dockerfile

启动应用容器:

docker run -d -p 3000:3000 getting-started

访问应用:http://localhost:3000/

列出本地镜像:

docker image ls

修改应用代码

修改 src\static\js\app.js 文件的第 56 行,将提示文本改成:

You have no todo items yet! Add one above!

重新构建镜像:

docker build -t getting-started .

移除旧容器:

# 获取容器 ID
docker ps

# 停止容器
docker stop 90473

# 移除容器
docker rm 90473
# 停止并移除容器
docker rm -f 90473

启动新容器:

docker run -d -p 3000:3000 getting-started

发布镜像

注册 Docker Hub

创建仓库(repository),仓库名为 getting-started

发布镜像:

# 登录 Docker Hub,liaozibo 是我的用户名
docker login -u liaozibo

# 给镜像添加标签
docker tag getting-started liaozibo/getting-started

# 推送镜像
docker push liaozibo/getting-started

# 默认标签是 latest
# docker push liaozibo/getting-started:latest

在云上运行我们的容器,登录 Play with Docker

docker run -d -p 3000:3000 liaozibo/getting-started

持久化数据

通过 Volumes,可以将主机的目录挂到容器某个路径下,在容器中对该路径进行写操作将应用到主机对应的目录。

有两种类型的 Volum:

  • name volume:由 Docker 管理 volume 在主机中的物理位置,用户只需要记得 volume 名称即可
  • bind mount:

默认情况下,示例应用将数据通过 SQLite 写到 /etc/todos/todo.db

Name Volume

创建 volume:

docker volume create todo-db

停止旧应用:

docker ps
docker rm -f 1729e

验证数据能够持久化:

docker ps
docker rm -f 3b4f2
docker run -d -p 3000:3000 -v todo-db:/etc/todos getting-started

启动应用并将 name volume 挂在到 /etc/todos

docker run -d -p 3000:3000 -v todo-db:/etc/todos getting-started

查看 name volume 在主机上的物理路径:

> docker volume inspect todo-db
[
    {
        "CreatedAt": "2022-10-12T14:59:44Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

Mountpoint 显示了 name volume 在主机上的物理路径

Docker Desktop 会在一个虚拟机中运行 Docker 命令,所以上面显示的 Mountpoint 其实是虚拟机中的路径

Bind Mount

bind mount 可以让用户指定挂在到路径的路径。

在开发应用时,可以将源码挂载到容器中,并且通过 nodemon 监控源码文件的修改并重启应用。

停止旧容器

docker ps
docker rm -f 57p94

启动开发模式的容器:

docker run -dp 3000:3000 ^
    -w /app -v "%cd%:/app" ^
    node:12-alpine ^
    sh -c "yarn install && yarn run dev" 

对应的 Linux 命令:

docker run -dp 3000:3000 \
    -w /app -v "$(pwd):/app" \
    node:12-alpine \
    sh -c "yarn install && yarn run dev"
  • -w 将容器的工作目录切换到 /app
  • -v 通过 bind mount 将主机当前目录挂载到容器的 /app
  • sh -c 使用 sh shell 安装应用依赖并以 dev 模式启动应用

监控 docker 日志,看到 Listening on port 3000 则代表应用启动完成:

docker ps
docker logs -f f312d

修改 src\static\js\app.js 文件的 109 行,将按钮名称改成 Add。

刷新浏览器确认按钮名称已改变。

修改完成后,重新构建镜像:

# 停止容器
docker ps
docker rm -f f312d

# 构建镜像
docker build -t getting-started .

利用 bind mount,我们不再需要在主机上安装构建工具和应用环境。

参阅

posted @ 2022-08-03 23:55  廖子博  阅读(96)  评论(0编辑  收藏  举报