docker实践1

本文介绍了如何通过Docker运行HelloWorld示例,包括使用`dockerrun`命令、配置镜像、创建容器、使用DockerCompose管理和持久化数据。作者还讨论了如何使用DockerDesktop和配置`daemon.json`以优化镜像源和容器数据持久化。
摘要由CSDN通过智能技术生成
  • 参考

Overview of get started | Docker DocsLearn how to get started with Docker and Docker Desktopicon-default.png?t=N7T8https://docs.docker.com/guides/get-started/Docker Hello World | 菜鸟教程Docker Hello World Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。 输出Hello world runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo 'Hello world' Hello world 各个参数解析: docker: Docker 的二进制执行文件。 run: 与前面..icon-default.png?t=N7T8https://www.runoob.com/docker/docker-hello-world.html以及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,)

 "registry-mirrors": [
    "https://dockerproxy.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://ccr.ccs.tencentyun.com"
  ]

重启查看

# 重启 Docker 服务
# 方法一,采用 systemctl 来重启,推荐
systemctl daemon-reload
systemctl restart docker
# 方法二,采用 service 来重启
service docker restart

#查看是否成功
# 查看 Docker 信息
docker info

# 出现以下字段代表配置成功
#Registry Mirrors:
#  https://dockerproxy.com/...

  • How do I run a container?

用git down一个应用工程

 git clone https://github.com/docker/welcome-to-docker

 可以看到这就是一个工程,我们在意Dockerfile文件,回头自己的工程中需要自己设定此问文件内容,例子中已写定完毕,其内容我们回头再看。

 You always need an image to run a container。所以我们build自己的image

cd /path/to/welcome-to-docker/
docker build -t welcome-to-docker .

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,输入名字和端口

  • Run Docker Hub images

也可以直接运行hub上的镜像,在搜索框(ctrl+k)中输入,直接查找运行(省去手动pull的操作)

注:此功能需要外网....

  • multi-container applications

 以上例子都是单一内容的容器,要是用个mysql,还要分别启两个容器吗?这里用compose(Docker Compose manual,同时启动多个容器。

 git clone https://github.com/docker/multi-container-app

 下来后发现有一个compose.yaml文件,而app文件中才是之前提到的有Dockerfile文件的工程。

cd /path/to/multi-container-app/
docker compose up -d

In the previous command, the -d flag tells Docker Compose to run in detached mode.

 坑,构建报错:

出乎意料,指引都能错,查询了一下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中的内容,页面马上会更新

  • Persist container data

 容器都是独立的,代码和数据都和本地隔离,删除容器后不可恢复。用volumes去持久数据。接上一个例子把如下内容注释放开:

todo-database:
    # ...
    volumes:
      - database:/data/db

# ...
volumes:
  database:

注意这个命令是这么解释的:把一个名叫database的卷挂载到data/db下,而database卷的定义在下边,下边的层级最高,决定了此文件所有的注册服务都可以访问这个卷。如果把下边卷的名字改下,马上会报找不到database卷的错误。实际上看todo-database也是这样定义的。

之后再执行命令docker compose up -d启动,输入一些内容

之后删除容器。再次创建启动后你会发现之前输入保存的内容还在。 

疑问:1.这个卷感觉应该能被本地访问到,目前还不知道如何操作。。。

           2.我发现每次启动后都会多一个卷,显示被使用,且挂载位置完成一致,但没有数据,熟悉的同学知道是怎么回事吗?

Access a local folder from a container 

you can use bind mounts to do that.见鬼了,开这么多口子,都能相互访问了。

git clone https://github.com/docker/bindmount-apps

 之后修改compose.yaml文件内容:

todo-app:
    # ...
    volumes:
      - ./app:/usr/src/app
      - /usr/src/app/node_modules

它把本地的./app挂载到/usr/src/app,原目录会被覆盖。第二条指定/usr/src/app/node_modules不会被外部覆盖。

之后以同样的命令启动,在app目录下更改内容,就可以看到页面上实施反映了更改的内容。

注意,这里的app目录不是linux系统的目录,是你工程compose.yaml文件的同级目录,一开始找了半天都没有找到。

Containerize your application

docker init命令可以帮助生成dockerfile、compose.yaml等文件。跟随提示,最后执行

 docker compose up

  • 40
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值