要想使用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
- 安装好wsl(在win商店搜ubuntu)
- 下载docker : docker
- 卡在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
是为后续命令提供执行目录,如COPY
、RUN
、CMD
,如果没有指定,默认工作目录是/
。COPY
指令从<src>
复制新文件或目录,并将其添加到路径<dest>
的容器文件系统中,这里src
和dest
都是.
。RUN
执行 shell 命令,FROM
是windows
的话就是执行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
命令获取容器的IDdocker 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/