Docker

要想使用docker,需要正确的了解一些基础信息,比如 image 是啥、容器是啥、 docker hub 是啥 、 为什么pull等等,我这里先给出一些简单的解释,但是详细可能还是得亲身体验才能理解:

  • image 镜像,可以pull镜像然后运行它
  • 容器 ,运行中的 image 我们叫它 容器,类似虚拟机,但是更轻量级。
  • docker hub , docker的官方 image 仓库,在这里我们可以下载到很多别人做的 image 来使用

总结/常用命令

完成了以上的tutorial,我感觉自己对docker已经有了初步的了解,可以正常使用它了。

查看一下本地现有的 image

1docker image ls

启动 getting-started 镜像,后台模式,映射 3000 端口,

1docker run -dp 3000:3000 getting-started

🌟 查看运行中的容器

1docker ps
2docker ps -a #包括未运行的
3docker ps -s #显示大小
4docker ps -q #仅显示容器id

🌟 进入容器(选择bash 、 sh 、 zsh、cmd ,看容器内部基于什么操作系统)

1docker exec -it <container-ID> sh
  • -i 交互模式
  • -t 终端

启动容器

1docker start <container-ID>

停止容器

1docker stop <container-ID>
2docker kill <container-ID> #强行退出

删除容器(删除前需要先停止容器)

1docker rm <container-ID>
2docker rm -f <container-ID> #强制删除

查看端口映射(正在运行的容器)

1docker port <container-ID>

查看运行状态(cpu、内存实时使用情况等)

1docker container stats

install

windows

  1. 安装好wsl(在win商店搜ubuntu)
  2. 下载docker : docker
  3. 卡在starting的解决办法:

使用管理员权限的 powershell:

1net stop com.docker.service
2net start com.docker.service
3
4wsl --unregister docker-desktop
5wsl --unregister docker-desktop-data

1-把应用程序容器化

https://docs.docker.com/get-started/02_our_app/

Docker Hub 是一个官方网站,上面可以下载很多 images。

运行中 image 的叫做 container (容器),他们运行的时候都是和你的电脑隔离的,就好像开了一堆小号的虚拟机。

而实际上,在docker hub 下载的 images 是别人打包好的应用程序,比如 dvwa (渗透靶场)、oracle 11g 等,在第一个教程里,我们要自己把本地的示例 Node.js 程序变成一个容器。

下载程序

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

Dockerfile

本教程是 Node js 的构建,其他的也可以参考官方教程写 Dockerfile , 比如 python https://docs.docker.com/language/python/build-images/

我们关注 getting-started/app 这个目录,在这个目录下创建一个 Dockerfile 文件,并编辑内容如下:

1## syntax=docker/dockerfile:1
2FROM node:18-alpine
3WORKDIR /app
4COPY . .
5RUN yarn install --production
6CMD ["node", "src/index.js"]
7EXPOSE 3000

指示构建器从node:18-alpine image 开始。但是,由于机器上没有它,Docker 需要下载 image。 Docker 下载 image 后,根据 Dockerfile 中的说明把整个目录的文件复制到您的应用程序中,并使用yarn安装应用程序的依赖项。CMD 指令指定从此映像启动容器时要运行的默认命令。

  • FROM 定义基础 image ,Dockerfile 必须以 FROM 开头。
  • WORKDIR 是为后续命令提供执行目录,如 COPYRUNCMD ,如果没有指定,默认工作目录是 /
  • COPY 指令从 <src> 复制新文件或目录,并将其添加到路径 <dest> 的容器文件系统中,这里 srcdest 都是 .
  • RUN 执行 shell 命令,FROMwindows 的话就是执行 cmd
  • CMD ["executable","param1","param2"]
  • EXPOSE 把容器内部的端口开放到外部,也可以指定 tcp 、 udp , 但无论 EXPOSE 设置如何,您都可以在运行时使用-p 标志覆盖它们,如 docker run -p 80:80
1EXPOSE 80/tcp
2EXPOSE 80/udp

构建容器 image

还是回到 getting-started/app 目录,执行:

1docker build -t getting-started .
  • -t getting-started 给镜像设置一个昵称。
  • docker build . 在当前目录下寻找 Dockerfile

启动容器

1docker run -dp 3000:3000 getting-started
  • -d 标志在“分离”模式下(在后台)运行新容器
  • -p 标志在主机的端口3000和容器的端口3000之间创建映射

打开您的网页浏览器到http://localhost:3000 。您应该会看到您的应用。

修改和更新image

修改和更新这里还是不包含原数据的

修改文件: app/src/static/js/app.js 修改第 56 行 ,把 No items yet! Add one above! 修改成你的字符串。

然后重新 build

1docker build -t getting-started .

ps 我在这里失败了好多次,我把原来的 image 删除之后才build 成功

重新启动一个容器

1docker run -dp 3000:3000 getting-started

停止和删除容器

  • docker ps命令获取容器的ID
  • docker stop <the-container-id> 命令停止容器
  • docker rm <the-container-id> 删除容器

分享 image

经过刚才的操作,我们已经成功的制作了一个自己的 image , 现在我们看看怎么把它分享到 docker hub。

首先得登陆一下 https://hub.docker.com

1docker login -u <your-user-name>

查看一下本地现有的 image

1docker image ls

给 getting-started 增加 tag 方便推送

1docker tag getting-started <your-user-name>/getting-started

推送 image

1docker push <your-user-name>/getting-started

最佳实践

关于如何让 docker 文件尽量更小、怎么让数据永久保存等内容,参考: https://docs.docker.com/develop/dev-best-practices/


C# 的打包技巧(打包成singlefile)
Django-Tutorial 1