请选择 进入手机版 | 继续访问电脑版

『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 69762|回复: 205

[经验分享] docker从入门到入坑的四个阶段

  [复制链接]

23

主题

302

帖子

2165

积分

论坛技术达人

积分
2165
金钱
1838
HASS币
110

活跃会员教程狂人

发表于 2019-4-24 08:11:19 | 显示全部楼层 |阅读模式
本帖最后由 cnk700i 于 2019-4-25 16:26 编辑

备注

  1. 排版不整了,如有问题可以去博客看。
  2. 挑选常用的命令结合自己的使用情况进行介绍,目的在于帮助快速建立对docker的认识。

提醒回复用

并没有隐藏内容,如果觉得有用回复下帮忙顶贴。


游客,如果您要查看本帖隐藏内容请回复


正文

0.基本概念

  • 仓库(Repository):卖Windows 10、Windows 7、Windows XP安装盘的商店
  • 镜像(images):Windows 10/Windows 7/Windows XP安装盘
  • 容器(container):安装Windows 10/Windows 7/Windows XP的电脑

创建容器,就像买一台新电脑,安装指定镜像的系统;删除容器,就像把电脑扔了,如果不保存资料,那电脑里面资料就没了。

1.阶段一 跑容器

  • docker pull

下载镜像

docker pull nodered/node-red-docker:last
# 参数解析
# [nodered/node-red-docker:last] 镜像名称,格式REPOSITORY:TAG(仓库:标签),如果指定标签自动默认为:last

INFO:镜像默认从公有仓库(在hub.docker.com搜索镜像)进行下载,如果是私有仓库下载,则还需指定服务器地址。

  • docker run

使用镜像创建一个容器

docker run -d -p 1888:1880 -v /local/workdir:/contianer/workdir --name docker-nodered nodered/node-red-docker npm start -- --userDir /data
# 参数解析
# [-d] 后台运行,如果不加-d,容器的输出会直接显示
# [-p 主机端口:容器端口] 映射端口,容器端口和容器服务相关,这里镜像的nodered服务用了1880端口,映射主机的1888,这样访问主机IP:1888就可以访问容器内的nodered服务了
# [-v /local/workdir:/contianer/workdir] 映射文件夹,将主机的/local/workdir目录映射到容器内的/contianer/workdir目录,容器内访问/contianer/workdir就可以访问主机/local/workdir的资源了
# [--name docker-nodered] 设置容器名称为docker-nodered,不指定会随机生成
# [nodered/node-red-docker] 镜像名称
# [npm start -- --userDir /data] 启动命令,位于镜像名称后面,是设置容器启动后执行的命令。这里的例子实际上是镜像中已经预设好的命令,目的是运行nodered。

INFO:启动命令如果设置其它命令,会覆盖镜像中预设的命令,比如echo HelloWorld,那创建的容器就作用也就是echo HelloWorld,不会运行nodered服务了。

  • docker ps

查看容器信息

docker ps -a
# 参数解析
# [-a] 查看所有容器,不带则只显示运行中的容器

INFO:执行后可以看到CONTAINER ID(容器ID),IMAGE(镜像名称),COMMAND(启动命令),CREATED(创建时间),STATUS(运行状态),PORTS(映射端口),NAMES(容器名称)等信息,其中容器ID和容器名称比较有用。

  • docker start/stop/restart/rm

容器的启、停、删

docker start docker-nodered
# 参数解析
# [docker-nodered] 操作的容器名称/容器ID

INFO:运行中的容器是无法删除的,需要先停止。

  • docker logs

查看容器输出日志

docker logs -f docker-nodered
# 参数解析
# [docker-nodered] 操作的容器名称/容器ID

2.阶段二 修改容器

  • docker exec

在运行的容器中执行命令

docker exec -it docker-nodered bash
# 参数解析
# [-it] 分配一个伪终端,并接管其stdin/stdout支持交互操作,这时候bash命令不会自动退出
# [docker-nodered] 操作的容器名称/容器ID
# [bash] shell程序,对于alpine内核的镜像则用sh

INFO:只展示常用用途,用于进入容器(类似ssh)进行操作。当然你也可以执行echo HelloWorld、ps aux之类的命令。

  • docker commit

保存容器成为一个新的镜像。

docker commit docker-nodered my-nodered:custom
# 参数解析
# [docker-nodered] 操作的容器名称/容器ID
# [my-nodered:custom] 镜像名称,格式REPOSITORY:TAG(仓库:标签)
  • 镜像维护
#查看镜像信息
docker images
# 重命名镜像
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
# 删除镜像
docker rmi IMAGEID(镜像id)
  • 修改容器配置

docker run命令设置了容器的配置信息,如果需要修改配置信息,一般是删除容器,重新再docker run。但也可以通过修改容器的配置文件来达到修改的目的,以修改端口映射为例。

1. 停止容器
2. 停止docker服务(systemctl stop docker)
3. 修改这个容器的配置文件(hostconfig.json、config.v2.json)
    cd /var/lib/docker/containers/3b6ef264a040* # 这里是CONTAINER ID
    vi hostconfig.json # 在"PortBindings"属性下增加/修改映射记录:"PortBindings":{"3306/tcp":[{"HostIp":"","HostPort":"3307"}]},前一个数字是容器端口, 后一个是宿主机端口。
    vi config.v2.json  # 在"Ports"属性下增加/修改映射记录。
4. 启动止docker服务(systemctl start docker)
5. 启动容器

INFO:类似地可以更改目录映射,感觉通过docker run命令或者Dockerfile里命令设定的参数都可以通过修改hostconfig.json、config.v2.json来进行变更。

3.阶段三 定制镜像

  • docker build

使用指定的Dockerfile创建镜像。Dockerfile是一个文件,类似脚本,build后会生成一个镜像。Dockerfile的执行效果类似于:创建一个容器、进容器安装新服务、然后提交成为新镜像。

docker build -f /path/to/a/Dockerfile -t my-nodered:custom --no-cache .
# 参数解析
# [-f] 指定Dockerfile文件,不指定则默认上下文目录的Dockerfile文件
# [my-nodered:custom] 镜像名称,格式REPOSITORY:TAG(仓库:标签),不使用参数则默认生成None:None名称
# [--no-cache] 设置不使用缓存,不使用该参数则在build过程中会从上次出错的步骤继续执行
# [.] 指定上下文目录,.代表当前目录

INFO:在此不展开介绍Dockerfile了,可以从官方仓库看镜像的Dockerfile,重点学习理解其中的RUN、ENTRYPOINT、CMD指令。

4.阶段四 批量部署

  • docker-compose

批量运行docker-compose.yml中预定义的容器。

docker-compose -f /path/to/a/docker-compose.yml -d up
# 参数解析
# [-f] 指定docker-compose.yml文件,不指定则默认当前目录docker-compose.yml文件
# [-d] 后台运行
# [up] 创建并运行作为服务的容器,如果已经存在服务的容器,且容器创建后服务的配置有变化,就重新创建容器。

INFO:docker-compose引入了服务管理模式,docker-compose start/stop是控制某个服务容器启停,docker-compose down是删除所有服务容器。

  • docker-compose.yml样例
# docker-compose.yml
version: "3" # 指定语法的版本
services: # 定义服务
    nginx: # 服务的名称
        container_name: web-nginx # 容器的名称,不指定默认"项目名称_服务名称_序号",其中项目名称默认为docker-compose.yaml所在目录的目录名称
        image: nginx:latest # 镜像名称
        restart: always # 重启方式
        ports: # 端口映射
          - 80:80
        volumes: # 主机与容器目录映射
          - ./webserver:/webserver
          - ./nginx/nginx.conf:/etc/nginx/nginx.conf

INFO:配置文件中的对容器的设置,实际上用docker run命令来设置也能达到相同的效果。

5.小结

  • 不要docker run一个ubuntu镜像,然后docker exec进入里面装很多应用来当虚拟机用。
  • Dockerfile是一个创建镜像的脚本,配合docker build命令使用。
  • docker-compose.yml是一个定义了多个容器的配置文件,配合docker-compose工具使用(需要另行安装)。





评分

参与人数 4金钱 +70 HASS币 +10 收起 理由
咸味土豆 + 20 赠人玫瑰,手留余香!
goldstep + 10 我来瀚思就为看你!
+ 20 + 10 我来瀚思就为看你!
antsunzj + 20 论坛有你更精彩!

查看全部评分

博客 https://ljr.im
回复

使用道具 举报

38

主题

2041

帖子

7636

积分

元老级技术达人

积分
7636
金钱
5580
HASS币
110
发表于 2019-4-24 08:33:25 | 显示全部楼层
早有这种教程 不知道该有多好    mark来补充知识
回复

使用道具 举报

2

主题

237

帖子

1722

积分

金牌会员

Rank: 6Rank: 6

积分
1722
金钱
1485
HASS币
0
发表于 2019-4-24 08:33:44 | 显示全部楼层
像大神学习
回复

使用道具 举报

2

主题

90

帖子

1018

积分

金牌会员

Rank: 6Rank: 6

积分
1018
金钱
928
HASS币
0
发表于 2019-4-24 08:56:43 | 显示全部楼层
对于我这个门外汉来说,大概,也就看看现在有几个容器,里面装着什么,满足一下好奇心,就好了吧,不然下次开机不知道又有什么惊喜(xia)在等着我
回复

使用道具 举报

23

主题

1328

帖子

6519

积分

超级版主

Rank: 8Rank: 8

积分
6519
金钱
5166
HASS币
100

教程狂人

发表于 2019-4-24 09:02:06 | 显示全部楼层
支持docker,人人必备的技能之一
回复

使用道具 举报

123

主题

4626

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16009
金钱
11298
HASS币
45
发表于 2019-4-24 09:02:58 | 显示全部楼层
灰常好的入门教程,严重感谢楼主分享!
回复

使用道具 举报

38

主题

748

帖子

4685

积分

论坛元老

Freddy.

Rank: 8Rank: 8

积分
4685
金钱
3912
HASS币
0

最佳新人卓越贡献

发表于 2019-4-24 09:08:49 | 显示全部楼层
感谢分享!
回复

使用道具 举报

26

主题

2095

帖子

8499

积分

论坛元老

Rank: 8Rank: 8

积分
8499
金钱
6399
HASS币
30

论坛元老

发表于 2019-4-24 09:12:17 | 显示全部楼层
感谢分享,docker菜鸡感谢分享教学
回复

使用道具 举报

7

主题

138

帖子

913

积分

高级会员

Rank: 4

积分
913
金钱
775
HASS币
0
发表于 2019-4-24 09:36:43 | 显示全部楼层
很全面的docker教程,新手有福了,照葫芦画瓢就能享受HA带来的便利。
回复

使用道具 举报

4

主题

282

帖子

3651

积分

论坛元老

Rank: 8Rank: 8

积分
3651
金钱
3369
HASS币
0
发表于 2019-4-24 09:55:27 | 显示全部楼层
我:docker不好用
我:emmm,docker真香
我:docker-compose太麻烦
我:docker-compose真香
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-18 10:03 , Processed in 1.033403 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表