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
列出本地镜像:
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 将主机当前目录挂载到容器的 /appsh -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,我们不再需要在主机上安装构建工具和应用环境。