刚开始接触docker的时候是去年尝试给Home Assistant做自动化安装node-red,全过程一脸懵逼按教程拷打命令,最后还写了篇实践记录。后来也一直在用docker,但理解还是一直停留在刚开始,命令倒是熟悉了不少。最近突然沉迷学习docker,陆续将web、mysql服务都迁到docker容器里面运行了,也逐渐有了更清晰的认识,也是时候回顾做个总结,希望能给新接触docker的朋友解惑。目前docker的学习资料很容易找,在此就不打算详细介绍各种命令,只挑选常用的命令结合自己的使用情况进行介绍,目的在于帮助快速建立对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
下载镜像。
1 | docker pull nodered/node-red-docker:last |
Tips
镜像默认从公有仓库(在hub.docker.com搜索镜像)进行下载,如果是私有仓库下载,则还需指定服务器地址。
- docker run
使用镜像创建一个容器。
1 | docker run -d -p 1888:1880 -v /local/workdir:/contianer/workdir --name docker-nodered nodered/node-red-docker npm start -- --userDir /data |
Tips
启动命令如果设置其它命令,会覆盖镜像中预设的命令,比如echo HelloWorld,那创建的容器就作用也就是echo HelloWorld,不会运行nodered服务了。
- docker ps
查看容器信息。
1 | docker ps -a |
使用建议
执行后可以看到CONTAINER ID(容器ID),IMAGE(镜像名称),COMMAND(启动命令),CREATED(创建时间),STATUS(运行状态),PORTS(映射端口),NAMES(容器名称)等信息,其中容器ID和容器名称比较有用。
- docker start/stop/restart/rm
容器的启、停、删。
1 | docker start docker-nodered |
Tips
运行中的容器是无法删除的,需要先停止。
- docker logs
查看容器输出日志。
1 | docker logs -f docker-nodered |
2.阶段二 修改容器
- docker exec
在运行的容器中执行命令。
1 | docker exec -it docker-nodered bash |
Tips
执行bash/sh,相当于运行了一个命令行终端(类似ssh),运行效果就是登陆进入容器的内部系统了。
当然你也可以执行echo HelloWorld、ps aux之类的命令,但这样因为没有交互所以执行完毕后就会退出。
- docker commit
保存容器成为一个新的镜像。
1 | docker commit docker-nodered my-nodered:custom |
Tips
结合docker exec命令使用,进入容器后修改文件、安装程序等操作后,保存成新新镜像;后面用新镜像创建的容器就会有先前操作产生的内容。
- 镜像维护
1 | #查看镜像信息 |
- 修改容器配置
docker run命令设置了容器的配置信息,如果需要修改配置信息,一般是删除容器,重新再docker run。但也可以通过修改容器的配置文件来达到修改的目的,以修改端口映射为例。
1 | 1. 停止容器 |
Tips
类似地可以更改目录映射,感觉通过docker run命令或者Dockerfile里命令设定的参数都可以通过修改hostconfig.json、config.v2.json来进行变更。
3.阶段三 定制镜像
- docker build
使用指定的Dockerfile创建镜像。Dockerfile是一个文件,类似脚本,build后会生成一个镜像。Dockerfile的执行效果类似于:创建一个容器、进容器安装新软件/服务、然后提交成为新镜像。
1 | docker build -f /path/to/a/Dockerfile -t my-nodered:custom --no-cache . |
Dockerfile
在此不展开介绍Dockerfile了,可以从官方仓库看镜像的Dockerfile,重点学习理解其中的RUN、ENTRYPOINT、CMD指令。
4.阶段四 批量部署
- docker-compose
批量运行docker-compose.yml中预定义的容器。
1 | docker-compose -f /path/to/a/docker-compose.yml -d up |
启停指定容器
docker-compose引入了服务管理模式,docker-compose start/stop是控制某个服务容器启停,docker-compose down是删除所有服务容器。
- docker-compose.yml样例
1 | # docker-compose.yml |
Tips
配置文件中的对容器的设置,实际上用docker run命令来设置也能达到相同的效果。
5.小结
- 不要docker run一个ubuntu镜像,然后docker exec进入里面装很多应用来当虚拟机用。
- Dockerfile是一个创建镜像的脚本,配合docker build命令使用。
- docker-compose.yml是一个定义了多个容器的配置文件,配合docker-compose工具使用(需要另行安装)。