Overview of get started | Docker DocsLearn how to get started with Docker and Docker Desktop
软件介绍
点第一个直接就创建了一个容器,浏览器打开,速度超快。
没有完全明白怎么回事,决定按以下指引再来,因为毕竟回头要在linux上执行命令的,熟悉下好
Docker Hello World
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
输出Hello world
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world
各个参数解析:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
愣一下才明白,这是在Ubuntu中以命令方式执行docker,创建容器。果然执行完后,能看到创建的容器
win版的docker desktop有一个learning center,这个和官方指引的Quick hands-on guides是一样的,可以理解为win版的桌面指引。我之前想多线并行,同时参考命令和桌面的两个指引,但操作起来比对太多,返工不少。现在决定还是先从这个开始,可以快速给自己一个概念,再看命令版本会快速很多。
找到daemon.json文件,不管是win 还是linux版,本质上是一样的,都是改这个文件,做好备份,如若失败可以回退。
增加以下内容(不建议用ali,)
重启查看
用git down一个应用工程
可以看到这就是一个工程,我们在意Dockerfile文件,回头自己的工程中需要自己设定此问文件内容,例子中已写定完毕,其内容我们回头再看。
You always need an image to run a container。所以我们build自己的image
In the previous command, the
-t
flag tags your image with a name,welcome-to-docker
in this case. And the.
lets Docker know where it can find the Dockerfile.
之后在Images tab中,选择你的image,点run,输入名字和端口
也可以直接运行hub上的镜像,在搜索框(ctrl+k)中输入,直接查找运行(省去手动pull的操作)
注:此功能需要外网....
以上例子都是单一内容的容器,要是用个mysql,还要分别启两个容器吗?这里用compose(
Docker Compose manual)
,同时启动多个容器。
下来后发现有一个compose.yaml文件,而app文件中才是之前提到的有Dockerfile文件的工程。
In the previous command, the
-d
坑,构建报错:
出乎意料,指引都能错,查询了一下failed to solve: ***: failed commit on ref “unknown-sha256:这种错误可能是我采用了镜像导致的,有文章中提到要撤掉阿里镜像,那我配置它做什么。这里用了另一个方法,手动pull。docker pull docker/dockerfile:1,之后镜像中能看到pull下来的内容。
再次 compose另一个组件又报同样错误,得,干掉阿里镜像,这次行了,就是慢,400s下6M内容...
成功后会启动两个容器,可以看到之前下的dockerfile:1镜像没有用,这也符合预期:我要每一个都手动启动不累死,况且我也没有手动操作启动
在工程目录下执行docker compose watch 命令可以把修改内容实时展示出来,这在docker开发中可以使用。在这个例子中,修改todos.ejs中的内容,页面马上会更新
容器都是独立的,代码和数据都和本地隔离,删除容器后不可恢复。用volumes去持久数据。接上一个例子把如下内容注释放开:
注意这个命令是这么解释的:把一个名叫database的卷挂载到data/db下,而database卷的定义在下边,下边的层级最高,决定了此文件所有的注册服务都可以访问这个卷。如果把下边卷的名字改下,马上会报找不到database卷的错误。实际上看todo-database也是这样定义的。
之后再执行命令docker compose up -d启动,输入一些内容
之后删除容器。再次创建启动后你会发现之前输入保存的内容还在。
疑问:1.这个卷感觉应该能被本地访问到,目前还不知道如何操作。。。
2.我发现每次启动后都会多一个卷,显示被使用,且挂载位置完成一致,但没有数据,熟悉的同学知道是怎么回事吗?
you can use bind mounts to do that.见鬼了,开这么多口子,都能相互访问了。
之后修改compose.yaml文件内容:
它把本地的./app挂载到/usr/src/app,原目录会被覆盖。第二条指定/usr/src/app/node_modules不会被外部覆盖。
之后以同样的命令启动,在app目录下更改内容,就可以看到页面上实施反映了更改的内容。
注意,这里的app目录不是linux系统的目录,是你工程compose.yaml文件的同级目录,一开始找了半天都没有找到。
docker init命令可以帮助生成dockerfile、compose.yaml等文件。跟随提示,最后执行