缘起
在“容器(1):容器相关知识简介——容器化、docker、docker-compose、Kubernetes / K8s等”中,我们介绍了容器化的概念,以及如何使用Docker进行容器化。在实际使用Docker时,我们可能会遇到一些问题,例如:
- 当我们运行多个容器之后,如何清晰地知道这些容器都在哪里、运行状态如何?
- 当我们需要更新容器时,如何保证更新的容器和原来的容器一致?
- 当我们需要运行多个容器时,如何保证这些容器之间的依赖关系?
最开始我在使用docker时,有些容器是用docker run
命令启动的,有些容器是用docker-compose
启动的,docker-compose.yml
文件放置的位置也不统一,导致我在管理这些容器时非常混乱。后来我重新整理了一下,将所有容器都用docker-compose
启动,并将docker-compose.yml
文件统一放置在一个目录下,这样管理起来就方便多了。
当然,这里称之为“最佳实践指南”可能有些夸张,但这的确是现阶段我觉得最好的使用docker的方法。
前提
- 已安装Docker和docker-compose
- 了解Docker的基本概念和基本用法
如果你还没有安装Docker和docker-compose,或者没有了解Docker和容器化的基本概念和基本用法,可以参考[“容器(1):容器相关知识简介——容器化、docker、docker-compose、Kubernetes / K8s等”](« relref “../docker/index.zh-cn.md”»),里面有较为详细的介绍。
docker最佳实践
使用docker-compose统一管理容器
- 创建一个目录,用于存放
docker-compose.yml
文件和相关文件,例如放在~/docker
下。 - 每需要运行一个容器,都在这个目录下创建一个子目录,用于存放该容器的相关文件,例如
~/docker/nginx
。 - 在子目录中创建
docker-compose.yml
文件,用于定义该容器的配置,例如~/docker/nginx/docker-compose.yml
。
我们可以定义一些创建docker-compose.yml
文件的模板,这样每次创建新的容器时,只需要复制一下模板,修改一下配置即可。例如
|
|
这个模板定义了一个服务,服务名为service-name
,容器名为container-name
,使用image-source/image-name:tag
镜像,设置了环境变量SOME_ENV_VAR
,映射了端口host_port:container_port
,设置了资源限制,挂载了卷,设置了容器重启策略。并且可以使用Nvidia的GPU。
使用docker-compose启动容器
在子目录中的docker-compose.yml
文件定义好之后,我们可以使用docker-compose
命令启动容器。在子目录中执行:
|
|
如果是第一次启动容器,活着需要重新构建容器,可以使用:
|
|
如果需要停止容器,可以使用:
|
|
如果想要删除容器的数据卷,可以使用:
|
|
使用portainer管理容器
Portainer是一个轻量级的容器管理工具,可以用来管理Docker容器、镜像、网络等。包括查看所有容器的运行状态、日志、资源使用情况等,也可以通过Web界面启动、停止、删除容器。
Portainer有付费的商业版(Portainer BE),也有免费的社区版(Portainer CE),我们这里使用免费的社区版就可以。
我们可以使用docker-compose
启动Portainer,然后通过Web界面管理容器,具体步骤如下:
-
在
~/docker
目录下创建一个子目录portainer
,在portainer
目录下创建docker-compose.yml
文件,内容如下:1 2 3 4 5 6 7 8 9 10 11
version: '3' services: portainer: image: portainer/portainer-ce:latest ports: - "8001:8001" - "9443:9443" restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock - ./portainer_data:/data
注意,在我使用Portainer时,官方的最新镜像
portainer/portainer-ce:latest
版本号是2.19.4
,但2.19
版本的Portainer不能完全支持Docker26
及以上版本。而我使用的Docker版本是27.0.3
,所以我使用了2.20.1
版本的Portainer,即portainer/portainer-ce:2.20.1
。 -
在
portainer
目录下执行:1
docker-compose up -d
-
打开浏览器,访问
http://localhost:8001
,输入用户名和密码(第一次登录需要设置用户名和密码),即可进入Portainer的管理界面。点击
Local
,即可查看所有的容器、镜像、网络等: -
如果想要通过Portainer远程管理某个机器上的Docker,你可以根据之前的文章“从公网访问个人网站——Nginx反向代理配置”中介绍的方法,用Nginx设置一个反向代理,和你的域名绑定,然后通过域名访问Portainer。